点击几下后,WinAPI菜单会冻结

时间:2012-11-05 19:04:52

标签: c++ c winapi

我在win32中有一个应用程序,它的主窗口有一个顶层菜单,这个菜单有2个选项,每个菜单都有子菜单。

问题是......在点击其选项后,它突然冻结了。应用程序的其余部分保持正常响应,但是当我单击菜单选项时,按钮按下按下并且子菜单没有出现,我需要重新启动应用程序,否则它将不再工作。

我知道这是与内存分配有关的东西,也许我需要释放一些分配,但是由于我是这种编程的新手,我可以说只是看着它。

一些代码..我认为它在窗口过程中我操纵WM_COMMAND那是错误的:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{

int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;

HMENU hMenubar = CreateMenu();
HMENU hFile = CreateMenu();
HMENU hEDIT = CreateMenu();
HMENU hHelp = CreateMenu();     



switch (message)
{


case WM_COMMAND:
    wmId    = LOWORD(wParam);
    wmEvent = HIWORD(wParam);

    // Parse the menu selections:

    switch (wmId)
    {
    case ID_FILE_DIALOG2:
        DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG2), hWnd, Add);
        break;

    case ID_FILE_TESTE:

    Check();

    break;

    case ID_FILE_DIALOG1:
        DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, Conf);
        break;

    case ID_OPEN:
        Open();
        break;

    case IDM_ABOUT:
        DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
        break;

    case IDM_EXIT:
        DestroyWindow(hWnd);
        PostQuitMessage(0);
        break;

    default:
        return DefWindowProc(hWnd, message, wParam, lParam);

    }
    break;

case WM_PAINT:

    break;

case WM_CLOSE:
    DestroyWindow(hWnd);
        PostQuitMessage(0);
break;

case WM_DESTROY:

break;

default: 
    return DefWindowProc(hWnd, message, wParam, lParam);

}
return 0;
}

1 个答案:

答案 0 :(得分:5)

每次调用WndProc时都会创建菜单,因此可能用完了句柄。这个函数被调用了很多!

在应用初始化期间创建一次菜单。