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


Автор: ForceKeeper 18.12.2011, 18:37
Пытаюсь первый раз написать mdi-приложение и вызов CreateMDIWindow() возвращает ноль и при этом GetLastError() тоже ноль возращает. В мсдн написано, что если вернулся нулевой hwnd, то произошла ошибка, а при этом GetLastError() рапортует, что таковых нет. Что за радость такая?

Автор: vol4ek 18.12.2011, 19:53
Дайте людям код посмотреть. Телепатов нет. smile 

Автор: ForceKeeper 18.12.2011, 20:43
Я думал, что ситуация когда ошибка есть, а гетЛастЕррор ее не видит, весьма специфична. Ок. Вот кусок кода
Код

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK ChildProc(HWND hChild, UINT message, WPARAM wParam, LPARAM lParam);
BOOL InitApplication(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow);
VOID GetWindowsError();

HMENU hMenu;
HWND hWndFrame;
HWND hWndClient;
HINSTANCE hInst;

LPCSTR szFrameClassName = "MDI Frame";
LPCSTR szClientClassName = "MDICLIENT";
LPCSTR szChildClassName = "MDI Child";
LPCSTR szFrameTitle = "Имя фрейма";
LPCSTR szChildTitle = "Имя документа";
MDICREATESTRUCT mdiStruct;
WorkspaceManager wsManager;
BOOL isGridEnabled;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    hInst = hInstance;
    MSG msg;
    if (!InitApplication(hInstance))
        return (FALSE);

    if (!InitInstance(hInstance, nCmdShow))
        return(FALSE);

    while (GetMessage(&msg, NULL, 0, 0))
    {
        if(!TranslateMDISysAccel(hWndClient, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return (msg.wParam);
}

BOOL InitApplication(HINSTANCE hInstance)
{
    WNDCLASSEX wc;
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = (WNDPROC)WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_ASTERISK);
    wc.hCursor = LoadCursor (NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW);
    wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENUSTRIP);
    wc.lpszClassName = szFrameClassName;
    wc.hIconSm  = LoadIcon(wc.hInstance, NULL);
    BOOL resFrame = RegisterClassEx(&wc);
    if(!resFrame) 
    {
        GetWindowsError();
    }

    wc.lpfnWndProc = (WNDPROC)ChildProc;
    wc.lpszClassName = szChildClassName;
    //wc.cbWndExtra = DLGWINDOWEXTRA;
    wc.lpszMenuName = NULL;
    BOOL resChild = RegisterClassEx(&wc);
    if(!resChild) 
    {
        GetWindowsError();
    }

    return resFrame && resChild;
}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
    hWndFrame = CreateWindowEx (
        NULL,
        szFrameClassName,
        szFrameTitle,
        WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        NULL,
        NULL,
        hInstance,
        NULL);

    if (!hWndFrame) 
        return (FALSE);
    
    ShowWindow(hWndFrame, nCmdShow);
    UpdateWindow(hWndFrame);
    
    return (TRUE);
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hDC;
    PAINTSTRUCT ps;

    switch (message)
    {
    case WM_CREATE:
        {
            CLIENTCREATESTRUCT clientStruct;
            clientStruct.hWindowMenu = GetSubMenu(GetMenu(hWnd), 0);
            clientStruct.idFirstChild = 50000;

            hWndClient = CreateWindowEx (
                WS_EX_CLIENTEDGE,
                szClientClassName,
                NULL,
                WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL,
                CW_USEDEFAULT,
                CW_USEDEFAULT,
                CW_USEDEFAULT,
                CW_USEDEFAULT,
                hWnd,
                NULL,
                GetModuleHandle(NULL),
                &clientStruct);
            if(!hWndClient)
            {
                GetWindowsError();
            }

            ShowWindow(hWndClient, SW_SHOW);

            mdiStruct.szClass = szChildClassName;
            mdiStruct.szTitle = szChildTitle;
            mdiStruct.hOwner = hInst;
            mdiStruct.x = CW_USEDEFAULT;
            mdiStruct.y = CW_USEDEFAULT;
            mdiStruct.cx = CW_USEDEFAULT;
            mdiStruct.cy = CW_USEDEFAULT;
            mdiStruct.style = NULL;
            mdiStruct.lParam = NULL;

            HWND hwndSystemInformation = (HWND) SendMessage(hWndClient,
                                    WM_MDICREATE, 
                                    0,
                                (LPARAM) (LPMDICREATESTRUCT) &mdiStruct) ;

В hwndSystemInformation пишется ноль

Автор: vol4ek 18.12.2011, 20:57
http://www.kalnitsky.org/blog/2010/12/16/mdi-application-by-means-winapi

Автор: ForceKeeper 19.12.2011, 02:06
Спасибо, оказалось я в процедуре дочерних окон при обработке сообщений забыл перед 

Код

DefMDIChildProc(hWnd, message, wParam, lParam);


поставить return

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