弹出消息的疑问(MessageBox or AfxMessageBox)MessageBox("11111");
MessageBox(NULL,"22222","提示",MB_OK);上面两两方式显示对话框第一种必须先按确定才能使父窗口获得焦点(程序执行到暂停)而第二种即使弹出消息时父窗口同样能获得焦点
想问一下
1.如何在第二种方式下必须关闭子窗口才能使父窗口获得焦点
2.常常感谢他们的格式好象不固定有时必须用全局地,为什么呢?
还有这方面资料?

解决方案 »

  1.   

    把NULL换成你想失去焦点的窗口的句柄.
      

  2.   

    MessageBox("11111")这个是MFC窗口类成员函数 
    MessageBox(NULL,"22222","提示",MB_OK);这个是API
      

  3.   

    MessageBox("11111");  //是无模式对话框
    MessageBox(NULL,"22222","提示",MB_OK);//是可以弹出一个模式对话框,但是当参数1为NULL的时候,和第一个效果一样。参数2是弹出窗口的信息,参数3是弹出窗口的标题信息,参数4是只弹出窗口的样式,MB_OK是只只有一个OK按钮的对话框
      

  4.   

    谢谢大家关注
    楼上两位兄弟地答案居然不相同,更纳闷MessageBox有时有一个参数,有时有三个,有时有四个,搞不懂?什么情况我才知道它们是模式与非模式呢?难道是一个参数和四个参数地区别?---------------------------------------------------------------------wltg2001(红猪) ( ) 信誉:100 
    前一种是模式对话框,后一种是无模式对话框0011411(爱也许是假的,可是当时的快乐是真的。) ( ) 信誉:93
    MessageBox("11111");  //是无模式对话框
    MessageBox(NULL,"22222","提示",MB_OK);//是可以弹出一个模式对话框...
      

  5.   

    所谓模式对话框是指你必须先关闭这个对话框,这个应用程序才能响应,无模式对话框不必这样,不关闭它,应用程序也可以接受响应,至于MessageBox的参数应该是四个,但是这要看你调用的MessageBox是什么,如果是API的话你必须写四个参数,但是有时候你调用的是MFC中的类的成员函数,成员函数中有的参数有默认值,所以可以不写出来。
      

  6.   

    真地谢谢大家现在我的问题是如何把非模式对话框变成阻塞
    比如象下面对话框::MessageBox(NULL,_T("你确定吗?"),_T("提示"),MB_OKCANCEL)必须在获得当前焦点
    或者说必须要返回一个值(返值之前程序在这暂停),才能继续执行下面
      

  7.   

    ::MessageBox(hParentWnd,_T("你确定吗?"),_T("提示"),MB_OKCANCEL)
      

  8.   

    无模式对话框下是不能阻塞的,你可以用模式对话框啊,对MessageBox来说它们并没有什么多大的区别,第一个参数写上主窗口句柄就行了。
      

  9.   

    对了,我还发现人家出来地有选择的对话框右上角地小叉子也变成灰色地了,这又是如何设置地啊?
    thanks...
      

  10.   

    如果在非窗口类中调用,它是调用的API函数,原型为:
    int MessageBox(          
      HWND hWnd,//父窗口句柄
        LPCTSTR lpText,//消息文本
        LPCTSTR lpCaption,//消息框标题
        UINT uType//消息框中图标按钮类型
    );如果在窗口类中直接调用,它是调用的CWnd::MessageBox,
    原型为int MessageBox(
       LPCTSTR lpszText,//消息文本
       LPCTSTR lpszCaption = NULL,//消息框标题
       UINT nType = MB_OK //消息框中图标按钮类型
    );
    窗口句柄已默认传入。如果在非窗口类中调用,又要让它阻塞,则必须首选获得它的父窗口的句柄(即要被阻塞的窗口句柄),然后将其传给第一个参数,如:
    HWND hParent;//父窗口的句柄,必须赋值
    MessageBox(hParent,,_T("你确定吗?"),_T("提示"),MB_OKCANCEL);
    如果在窗口类中直接调用,又按全局方式调用,则可这样调用:
    MessageBox(GetSafeHwnd( ),_T("你确定吗?"),_T("提示"),MB_OKCANCEL);
      

  11.   

    你调用API的话最后一个参数可以有很多选择,一般用MB_OK也就是只有一个OK的按钮,你可以选择其它的参数,具体参见MSDN。
      

  12.   

    首先,获得父窗口指针。例如在新线程里将参数lpParam强制转换为自己定义的对话框类:MyDlg * mydlg1 = (MyDlg*)lpParam,然后调用mydlg1->MessageBox("22222 ", "提示 ",MB_OK),就可以了。
    直接用MessageBox(hParent,"22222 ", "提示 ",MB_OK)?没试过
      

  13.   

    至于禁用关闭按钮,如下:
    CMenu *pSysMenu=My_Dlg->GetSystemMenu(FALSE);
    pSysMenu->EnableMenuItem(SC_CLOSE,MF_DISABLED);
    其中My_Dlg就是你自定义的对话框类指针