2012-04-20 95 views
1

我在GUI应用程序中启动子进程时遇到问题。以下是我的WndProc。我想ID_TOOLS_NEWPROCESS的情况下启动一个新的进程,将打开对话框。这将允许主窗口在新窗口打开时保持响应状态吗?C++ GUI应用程序:在WndProc中启动子进程(无MFC)

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斯图尔特

的有关使用了以下的消息泵:

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

@大卫 - 你能可能能够解释为什么这仍然没有返回所需的结果的一些情况。

+3

您不需要一个新的过程来显示无模式对话框。使用'CreateDialog'和'ShowWindow'。此外,新的对话框将需要自己的消息泵(它自己的WndProc)。 – 2012-04-20 13:53:31

+0

@Roger Stewart我更新了我的帖子,提供更多信息。如果你能进一步帮助我,那会很好。 – L337BEAN 2012-04-23 09:09:14

+0

@Roger新对话框不需要自己的消息泵。它可以使用主线程消息泵。尽管如此,你必须使用'IsDialogMessage'。 – 2012-04-23 09:11:05

回答

0

Thanks @David。该解决方案确实使用CreateDialog()而不是DialogBox()

我的程序现在正在运行,因为我也喜欢它。

-Dan。

+0

你介意分享代码吗?谢谢。 – niieani 2014-11-30 01:33:57