0

メインウィンドウにトップメニューがある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;
}
4

1 に答える 1

5

WndProc が呼び出されるたびにメニューを作成しているため、ハンドルが不足している可能性があります。この関数はよく呼び出されます。

アプリの初期化中に一度メニューを作成します。

于 2012-11-05T19:07:05.103 に答える