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;
}

我希望我已经清楚地解释了这一点,对此问题的任何帮助将不胜感激。

  • 担。

编辑: @罗杰斯图尔特

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 回答