1

GUI アプリケーションで子プロセスを開始する際に問題が発生しました。以下は私のWndProcです。ID_TOOLS_NEWPROCESS ケースで、ダイアログ ボックスを開く新しいプロセスを開始したいと考えています。これにより、新しいウィンドウが開いたときにメイン ウィンドウの応答性を維持できますか?

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;

switch (message)
{
case WM_COMMAND:
    wmId    = LOWORD(wParam);
    wmEvent = HIWORD(wParam);
    // Parse the menu selections:
    switch (wmId)
    {
    case IDM_ABOUT:
        DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
        break;
    case IDM_EXIT:
        DestroyWindow(hWnd);
        break;
    case ID_TOOLS_NEWPROCESS:
        DialogBox(hInst, MAKEINTRESOURCE(IDD_NEWBOX), hWnd, NEW);
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    break;
case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);
    // Draw text in the main window
    TextOut(hdc, 10, 10, L"Main Window",11);
    EndPaint(hWnd, &ps);
    break;
case WM_DESTROY:
    PostQuitMessage(0);
    break;
default:
    return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

明確に説明できたことを願っています。この問題に関する助けをいただければ幸いです。

  • ダン。

編集: @Roger Stewart

about は、メッセージ ポンプとして以下を使用しています。

INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam,         LPARAM lParam)
{

UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
    return (INT_PTR)TRUE;

case WM_COMMAND:
    if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDOK)
    {
        EndDialog(hDlg, LOWORD(wParam));
        return (INT_PTR)TRUE;
    }
    break;
}
return (INT_PTR)FALSE;
}

ここでの問題は、about ボックスが開いていると、about ボックスが閉じられるまで背後のメイン ウィンドウが応答しないことです。メイン ウィンドウが応答している状態で、複数のダイアログ ボックスを開いて制御できるようにしたいと考えています。

編集2: これは私が今持っているコードですが、アバウトボックスを開いたままメインウィンドウを選択することはできません。

about ボックスのメッセージ ハンドラ:

INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{

UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
    return (INT_PTR)TRUE;

case WM_ACTIVATE:
    if (0 == wParam)             // becoming inactive
        hDlgCurrent = NULL;
    else                         // becoming active
        hDlgCurrent = hDlg;
    return FALSE;

case WM_COMMAND:
    if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDOK)
    {
        EndDialog(hDlg, LOWORD(wParam));
        return (INT_PTR)TRUE;
    }
    break;
}
return (INT_PTR)FALSE;
}

メイン メッセージ ループ:

     while (GetMessage(&msg, NULL, 0, 0))
     {
     if (NULL == hDlgCurrent || !IsDialogMessage(hDlgCurrent, &msg))
        {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
        }
     }

@David - これがまだ望ましい結果を返さない理由を明らかにしていただけますか。

4

1 に答える 1

0

ありがとう@デビッド。解決策は実際に使用することでしCreateDialog()DialogBox()

私のプログラムも、私が望むように機能しています。

-ダン。

于 2012-04-24T09:50:19.957 に答える