Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Невозможно Создать Окно


Автор: Logree 22.7.2009, 01:33
Делал по книжке "Азбука WinAPI" Компилил в minGW, С чем может быть связано: MessageBox - НЕвозможно Создать ОКНО?

Код

#include "windows.h"
#include "tchar.h"

LRESULT CALLBACK HWwindowProc(HWND hWnd,UINT Message,UINT wParam,LONG lParam) 
{
HDC hDC;
PAINTSTRUCT PaintStruct;
RECT Rect;
switch (Message) {
case WM_PAINT:
    hDC = BeginPaint(hWnd,&PaintStruct);
    GetClientRect(hWnd,&Rect);
    DrawText(hDC,_TEXT("Х О Р О Ш О"),-1,&Rect,
             DT_SINGLELINE|DT_CENTER|DT_VCENTER);
    EndPaint(hWnd,&PaintStruct);
    return 0;
}
return DefWindowProc(hWnd,Message,wParam,lParam);
}    
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR CmdParam,
                   int nCmdShow) 
{
    HWND hWindow;
    WNDCLASS WClass;
    MSG Msg; 
    TCHAR ProgramName[] = "Моя программа";
    WClass.style = CS_HREDRAW|CS_VREDRAW;
    WClass.lpfnWndProc = HWwindowProc;
    WClass.cbClsExtra = 0;
    WClass.hInstance = hInstance;
    WClass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    WClass.hCursor = LoadCursor(NULL,IDC_ARROW);
    WClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    WClass.lpszMenuName = NULL;
    WClass.lpszClassName = ProgramName;
    
    if (!RegisterClass(&WClass)) {
        MessageBox(NULL,_TEXT("НЕВОЗМОЖНО СОЗДАТЬ КЛАСС"),_TEXT("Error"),MB_OK);
        return 0;
    }
    hWindow = CreateWindow(ProgramName,_TEXT("FirstProgram"),
                           WS_OVERLAPPEDWINDOW,
                           CW_USEDEFAULT,CW_USEDEFAULT,
                           CW_USEDEFAULT,CW_USEDEFAULT,
                           NULL,NULL,
                           hInstance,NULL);
    if (!hWindow) {
        MessageBox(NULL,_TEXT("НЕВОЗМОЖНО СОЗДАТЬ ОКНО"),_TEXT("ERROR"),MB_OK);
        return 0;
    }        
    ShowWindow(hWindow,nCmdShow);
    UpdateWindow(hWindow);
    
    while(GetMessage(&Msg,NULL,0,0)) {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
}

Автор: GremlinProg 22.7.2009, 01:46
пробовал менять имя класса на латиницу?

"Моя программа" -> "MyProgram"

Автор: Logree 22.7.2009, 01:50
Я Это первым делом сделал smile Не помогло... даже _TEXT прилепил и всё равно не хочет работать.

Автор: GremlinProg 22.7.2009, 02:01
перед вызовом RegisterClass добавь:
Код

WClass.cbWndExtra = 0;

Автор: Emura 22.7.2009, 02:04
Logree, пробуй так, может поможет

Код

hWindow = CreateWindow(ProgramName,_TEXT("FirstProgram"),
                           WS_OVERLAPPEDWINDOW,
                           CW_USEDEFAULT,CW_USEDEFAULT,
                           CW_USEDEFAULT,CW_USEDEFAULT,
                           NULL, (HMENU)NULL,
                           hInstance,NULL);


и лучше сразу приучаться занулять переменные,потом меньше хлопот.

как вообще отлавливать ошибку таким способом

Код

if (!hWindow) {
        MessageBox(NULL,_TEXT("НЕВОЗМОЖНО СОЗДАТЬ ОКНО"),_TEXT("ERROR"),MB_OK);


если hWindow не занулен... smile 

Код

HWND hWindow =NULL;



Автор: Logree 22.7.2009, 02:25
Цитата

  WClass.cbWndExtra = 0;

Действительно smile  пропустил пока печатал... Спасибо.

Цитата

HWND hWindow =NULL;
 Учтём.

Это нормально если после закрытия окна по крестику окно закрывается а програма не выгружается из памяти? приходиться через диспетчер задачь завершать.

Автор: GremlinProg 22.7.2009, 02:27
Цитата(Logree @  22.7.2009,  04:25 Найти цитируемый пост)
Это нормально если после закрытия окна по крестику окно закрывается а програма не выгружается из памяти? приходиться через диспетчер задачь завершать.

нет, это не нормально,
добавь обработчик:
Код

case WM_DESTROY:
  PostQuitMessage(S_OK);
  break;

Автор: Emura 22.7.2009, 02:28
смотря что требуется от программы... в большинстве случаев не нормально smile 

в кратце: необходимо отлавливать сообщение закрытия и делать то что требуется.

GremlinProg, опередил )

Автор: Logree 22.7.2009, 02:40
Ну я так и думал smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)