模式对话框和非模式对话框

qq845284425 2009-05-16 12:44:04

请教

1 模式对话框和非模式对话框都是继承于CDialog,只是创建的方式不同,对不对?

2 对于对话框投递的自定义消息,父窗口必须重载WndProc窗口过程函数才能捕获该消息,对不对呀?
...全文
115 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
oyljerry 2009-05-16
  • 打赏
  • 举报
回复
1.模态,非模态,主要就是消息循环的处理不同
2.可以自己添加ON_MESSAGE 宏等MFC方式,或者GetMessage处理消息...
rebecca_zjy 2009-05-16
  • 打赏
  • 举报
回复
1、应该对的吧
补充一句,你大概已经知道的:
模式对话框获得焦点以后,它的父对话框是不会获得焦点的,要把它关闭以后父对话框才会获得焦点。非模式的就可以在对话框间转换焦点。

2、好像在子窗口的PreTranslateMessage里传递消息就好了吧,,因为总是父窗口先得到消息的。不知道这样对不对
hurryboylqs 2009-05-16
  • 打赏
  • 举报
回复
不尽对,

1:只要学点SDK编程方式,这个疑问就不会有了,创建时使用的函数不同
除此之外,模态对话框会强制本对话框接收本线程的所有鼠标焦点,所以你弹出模态
对话框之后,直到该对话框销毁你才能操作其他窗口。

2: MFC的话,用消息映射用ON_MESSAGE来响应自定义消息即可,当然你的方法也可
但一般不这样做
biweilun 2009-05-16
  • 打赏
  • 举报
回复
模式和非模式的创建方式不同,消息循环方式也不同。模式的消息由系统默认处理,非模式自己用自己写的的消息循环队列。

2是可以的,一般用重载消息循环实现
LeviZhou 2009-05-16
  • 打赏
  • 举报
回复
貌似子类化也能达到效果
SetWindowLong 也行
  • 打赏
  • 举报
回复
学习一下。
Jobobo 2009-05-16
  • 打赏
  • 举报
回复
对话框的自定义消息可以指定投向父窗口吧,然后在父窗口直接用消息的响应函数就行了。
在发送消息的时候先找到你要发送消息的窗口,下面这个例子中我是从一个对话框向SDI的View类中发送消息的:
CMainFrame* pMainFrm=(CMainFrame*)AfxGetMainWnd();
CMessageTestView* pView=(CMessageTestView*)pMainFrm->GetActiveView();
pView->PostMessage(WM_MYMESSAGE,NULL,NULL);
其中WM_MYMESSAGE为自定义消息。

在View类的头文件和源文件中分别加入响应函数集映射就可以了。
.h:
//{{AFX_MSG(CMessageTestView)
......

afx_msg void MyMessage();
//}}AFX_MSG

.cpp:
BEGIN_MESSAGE_MAP(CMessageTestView, CView)
......

ON_MESSAGE(WM_MYMESSAGE,MyMessage)
END_MESSAGE_MAP()

void CMessageTestView::MyMessage()
{
......
}

希望对你有用
dong364 2009-05-16
  • 打赏
  • 举报
回复
1. 对于DoModal(), lz你可以跟进去看看, 父窗口已经被disable掉了, mfc是采用了钩子
2. 如果是自定义的msg, 一般用ON_MESSAGE宏, 如果是来自于键盘鼠标的消息, 可用PreTranslateMessage, 用重载WndProc也可

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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