我写windows 32程序,主窗口是一个dialog,相关代码如下:         MessageBox(NULL,TEXT("设置失败!"),TEXT("haha"),MB_OKCANCEL); // 主消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg) && (hDlg == 0 || !IsDialogMessage(hDlg,&msg)))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}程序运行后,对话框显示出来,为什么上面代码中的MessageBox没有反应(没有messagebox弹出),这个明明是在主消息循环之前就应该执行的?我想应该跟消息到来的先后顺序有关,但是想不明白具体怎么回事,麻烦高手指点下!

解决方案 »

  1.   

    是MFC的对话框程序吧??
    没有执行到 MessageBox 这句话换单文档可以
      

  2.   

    没用MFC主要代码如下:int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);  // TODO: 在此放置代码。
    MSG msg;
    HACCEL hAccelTable; // 初始化全局字符串
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_ZYLBADA, szWindowClass, MAX_LOADSTRING);
    /*MyRegisterClass(hInstance);*/  /*我直接creatdialog的,所以注释掉这个*/
    // 执行应用程序初始化:
    if (!InitInstance (hInstance, nCmdShow))
    {
    return FALSE;
    } hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_ZYLBADA));

            MessageBox(NULL,TEXT("设置失败!"),TEXT("haha"),MB_OKCANCEL);
    // 主消息循环:
    while (GetMessage(&msg, NULL, 0, 0))
    {
    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg) && (hDlg == 0 || !IsDialogMessage(hDlg,&msg)))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    } return (int) msg.wParam;
    }
      

  3.   

    我找到原因了,是处理WM_PAINT消息时,返回了TRUE,应该写FALSE请问,消息响应时返回TRUE和FALSE的区别是什么?
      

  4.   

    窗口过程函数处理消息时,必须返回0,也就是FALSE,表示该消息已经处理过了,否则windows将不停的处理该消息,就成死循环了
      

  5.   


    我没你说的这么牛X,看《Programming Windows》 Fifth Edition,windows and messages
      

  6.   


    不应该是这样,如果我想改变默认的消息处理方式,就得返回TRUE,否则WINDOWS是继续处理这个消息的,5楼朋友好像说反了
      

  7.   


    那俺请你再仔细看看。有很多Windows消息需要返回特殊的,如HANDLE,BOOL,LRESULT,当然要求返回0的也有