弹出消息的疑问(MessageBox or AfxMessageBox)

flyskytoday 2006-05-25 05:17:01
弹出消息的疑问(MessageBox or AfxMessageBox)

MessageBox("11111");
MessageBox(NULL,"22222","提示",MB_OK);

上面两两方式显示对话框

第一种必须先按确定才能使父窗口获得焦点(程序执行到暂停)

而第二种即使弹出消息时父窗口同样能获得焦点


想问一下
1.如何在第二种方式下必须关闭子窗口才能使父窗口获得焦点
2.常常感谢他们的格式好象不固定有时必须用全局地,为什么呢?
还有这方面资料?
...全文
487 18 打赏 收藏 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
feiying19834 2010-06-10
  • 打赏
  • 举报
回复
至于禁用关闭按钮,如下:
CMenu *pSysMenu=My_Dlg->GetSystemMenu(FALSE);
pSysMenu->EnableMenuItem(SC_CLOSE,MF_DISABLED);
其中My_Dlg就是你自定义的对话框类指针
feiying19834 2010-06-10
  • 打赏
  • 举报
回复
首先,获得父窗口指针。例如在新线程里将参数lpParam强制转换为自己定义的对话框类:MyDlg * mydlg1 = (MyDlg*)lpParam,然后调用mydlg1->MessageBox("22222 ", "提示 ",MB_OK),就可以了。
直接用MessageBox(hParent,"22222 ", "提示 ",MB_OK)?没试过
wltg2001 2006-05-26
  • 打赏
  • 举报
回复
你调用API的话最后一个参数可以有很多选择,一般用MB_OK也就是只有一个OK的按钮,你可以选择其它的参数,具体参见MSDN。
wxfy1977 2006-05-26
  • 打赏
  • 举报
回复
如果在非窗口类中调用,它是调用的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);
flyskytoday 2006-05-26
  • 打赏
  • 举报
回复
对了,我还发现

人家出来地有选择的对话框右上角地小叉子也变成灰色地了,这又是如何设置地啊?
thanks...
flyskytoday 2006-05-26
  • 打赏
  • 举报
回复
模式对话框上没有两个或三个选择啊
wltg2001 2006-05-26
  • 打赏
  • 举报
回复
无模式对话框下是不能阻塞的,你可以用模式对话框啊,对MessageBox来说它们并没有什么多大的区别,第一个参数写上主窗口句柄就行了。
jasonshark 2006-05-26
  • 打赏
  • 举报
回复
::MessageBox(hParentWnd,_T("你确定吗?"),_T("提示"),MB_OKCANCEL)
flyskytoday 2006-05-26
  • 打赏
  • 举报
回复
真地谢谢大家

现在我的问题是如何把非模式对话框变成阻塞
比如象下面对话框

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

必须在获得当前焦点
或者说必须要返回一个值(返值之前程序在这暂停),才能继续执行下面
wltg2001 2006-05-26
  • 打赏
  • 举报
回复
所谓模式对话框是指你必须先关闭这个对话框,这个应用程序才能响应,无模式对话框不必这样,不关闭它,应用程序也可以接受响应,至于MessageBox的参数应该是四个,但是这要看你调用的MessageBox是什么,如果是API的话你必须写四个参数,但是有时候你调用的是MFC中的类的成员函数,成员函数中有的参数有默认值,所以可以不写出来。
芮言 2006-05-26
  • 打赏
  • 举报
回复
模式对话框是已经有了地对话框,非模式对话框是自己Create的。
flyskytoday 2006-05-26
  • 打赏
  • 举报
回复
谢谢大家关注
楼上两位兄弟地答案居然不相同,更纳闷

MessageBox有时有一个参数,有时有三个,有时有四个,搞不懂?

什么情况我才知道它们是模式与非模式呢?难道是一个参数和四个参数地区别?

---------------------------------------------------------------------

wltg2001(红猪) ( ) 信誉:100
前一种是模式对话框,后一种是无模式对话框

0011411(爱也许是假的,可是当时的快乐是真的。) ( ) 信誉:93
MessageBox("11111"); //是无模式对话框
MessageBox(NULL,"22222","提示",MB_OK);//是可以弹出一个模式对话框...
KeSummer 2006-05-25
  • 打赏
  • 举报
回复
第一种其实已经传入了窗口了句柄的.
0011411 2006-05-25
  • 打赏
  • 举报
回复
MessageBox("11111"); //是无模式对话框
MessageBox(NULL,"22222","提示",MB_OK);//是可以弹出一个模式对话框,但是当参数1为NULL的时候,和第一个效果一样。参数2是弹出窗口的信息,参数3是弹出窗口的标题信息,参数4是只弹出窗口的样式,MB_OK是只只有一个OK按钮的对话框
jasonshark 2006-05-25
  • 打赏
  • 举报
回复
MessageBox("11111")这个是MFC窗口类成员函数
MessageBox(NULL,"22222","提示",MB_OK);这个是API
CUG122032 2006-05-25
  • 打赏
  • 举报
回复
把NULL换成你想失去焦点的窗口的句柄.
CUG122032 2006-05-25
  • 打赏
  • 举报
回复
关注
wltg2001 2006-05-25
  • 打赏
  • 举报
回复
前一种是模式对话框,后一种是无模式对话框

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧