簡體   English   中英

C ++ GUI應用程序:在WndProc中啟動子進程(無MFC)

[英]C++ GUI App: Starting a child process in WndProc ( no MFC )

我在使用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

關於將以下內容用作其消息泵:

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

這里的問題在於,當“關於”框打開時,后面的主窗口無法響應,直到“關於”框關閉。 我希望能夠在主窗口仍處於響應狀態的情況下打開和控制多個對話框。

編輯2:這是我現在擁有的代碼,但是我仍然無法選擇“關於”框打開的主窗口。

關於框的消息處理程序:

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-您能否闡明為什么它仍然沒有返回期望的結果。

謝謝@大衛。 解決方案的確是使用CreateDialog()而不是DialogBox()

我的程序現在也可以正常運行了。

-擔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM