1.发送消息,
将消息放入消息队列后立即返回,直到窗口过程处理完消息后才返回。
2. 三种消息的区别
:
在系统菜单中选择“关闭”或单击窗口右上角的“X”按钮,您的窗口过程就会收到它。 正确的处理是调用。 当然,你可以不让它被处理,而是自己处理,比如询问用户是否保存更改等。如果用户选择“取消”,你就忽略这个消息,程序照常运行; 如果用户确认他们想要退出,您就调用它。
:
接下来完成窗口清理工作,最后像窗口过程一样发送。 因为,不会被处理。 也就是说,如果你不处理这个消息,虽然你的窗口已经被销毁了,但是进程并不会结束。 一般都是先释放资源(如申请的内存等),然后再调用。
:
会被发送到消息队列。 请注意,窗口过程将永远不会到达,因为它将返回 FALSE,从而结束消息循环。 最后,进程结束,程序退出。
假设用户执行,用户最终点击了关闭按钮,或者假设用键盘或鼠标从系统菜单中选择了关闭,处理这个键盘或鼠标输入,检测到用户选择了关闭选项后,给出窗口过程发送一条消息。 将此消息传递出去。 向窗口过程发送一条消息作为响应。 再传一遍。 致电回复此消息。 导致消息被发送到窗口过程。 再次调用通过将消息放入消息队列来响应此消息。 该消息导致消息循环终止,然后程序结束。
3.退出程序语句
退出(0);
(0);
奥诺克();();
(,0,0);
(0);
其中,exit(0)是最快的。 在实践中,
///
有三个消息看起来很相似,它们都处理结束事务,它们是、、和。 它们确实相似,但你需要知道它们的区别! 当窗口或应用程序应该关闭时发送消息。 收到消息后,您可以询问用户是否确实要退出。 要知道,当要求用户确认或者发生错误或者发生需要注意的事情时,常常会弹出消息框。
插入:消息框
整数(
HWND hWnd, // 所有者
, // 框中的文本
, // 框标题
UINT uType // 框的样式
);
1. 当您收到消息时,您可以做两件事。 一是您接受默认处理并返回一个值,如果您这样做,应用程序或窗口将按计划关闭; 或者,返回 0,应用程序或窗口保持原样。 这是代码的基本部分:
如果(消息==)
if ((, "您确定要退出吗?", "", | ) == IDNO)
(0);
// ,让他们来处理它
2. 消息有点不同,它是在窗口关闭时发送的。 当收到消息时,窗口已经在视觉上被移除; 但主窗口关闭并不意味着应用程序结束,因为它可以在没有窗口的情况下继续运行。
3. 但是,如果您想在用户关闭主窗口时实际执行此操作并希望这意味着结束应用程序,则必须在收到消息时发送消息。
4. 应用程序结束时发送的消息。 一般可以认为是进程被杀死。
5. 向系统发送终止线程的请求。 系统在终止线程之前还需要做一些内存清理工作。
当我们关闭程序时,我们发送一条消息(函数?),然后调用该函数。 当调用时,系统会向程序发送一条消息并终止整个程序。
****************************************************** *********************************************
一个对话框向另一个对话框发送窗口关闭消息
对话框 A CADlg; 对话 B CBDlg
将A中的B声明为成员变量CBDlg;
A发送消息关闭B:(.(), , 0, 0);
或者直接:.();
****************************************************** *****************************************
,功能上有什么区别
执行以下程序时出错
空白 ::()
::();
*文档;
文档=这个->();
下面的程序执行没有错误。
空白 ::()
*文档;
文档=这个->();
::();
原因分析:
它在窗口关闭之前发送。 您还可以决定是否实际关闭窗口。
它是在窗口关闭过程中发送的,并且窗口已移出屏幕。
您的程序中的错误是在调用 ::(); 之后该表格有
被丢弃了。 该指针指向的窗口对象不再存在,因此发生了错误。
也就是说处理顺序是先处理(窗口未关闭)后处理(窗口关闭)。
::(); 之后的部分不会被执行。 如果需要执行的话可以放在()里,也就是你的第二段。
当调用父类默认处理::()时,系统又发出了
该消息关闭窗口,因此 this 指针仍然可以使用。
等待::()后,this指针指向的窗口对象不再存在。
同样的原因:
空白 ::()
*文档;
文档=这个->();
::();
不会出错
执行以下程序时发生错误:
空白 ::()
::();
*文档;
文档=这个->();
原因如下:
()中调用(),()中发送和; 当()执行结束时,()和()也被执行。 ::()返回后,对象已经被释放,this指针不能再使用。