在进行Windows应用程序开发时,经常需要实现一些特定的窗口行为,比如让一个窗口的状态(激活或非激活)与它的拥有者窗口同步,或者在应用程序失去激活状态时自动隐藏窗口。本文将介绍如何通过消息映射来实现这些功能。
以下是将要实现的功能:
将以一个示例应用程序的源代码为基础来进行说明。
首先,在源文件中包含ISyncActiveImpl.h头文件。
#include "ISyncActiveImpl.h"
接着,从ISyncActiveImpl<>派生类。
class CMainDlg : public CDialogImpl, public ISyncActiveImpl, public CMessageFilter {
public:
CMainDlg() : ISyncActiveImpl(FALSE, TRUE) {
// 这个对话框不与拥有者同步激活状态,并且始终可见
}
};
在类的构造函数中,确保使用正确的参数实例化ISyncActiveImpl<>类。
CMainDlg() : ISyncActiveImpl(FALSE, TRUE) {
// 这个对话框不与拥有者同步激活状态,并且始终可见
}
对于创建浮动窗口或工具栏窗口:
CFloatingWindow() : ISyncActiveImpl(TRUE) {
// 这个窗口将与拥有者同步激活状态,并且在拥有者被隐藏/最小化或应用程序失去激活状态时自动隐藏
}
在类的消息映射中添加CHAIN_MSG_MAP宏。
BEGIN_MSG_MAP(CMainDlg)
CHAIN_MSG_MAP(ISyncActiveImpl)
END_MSG_MAP()
注意:确保将其插入消息映射的第一个条目。这是因为ISyncActiveImpl<>类需要拦截一些通用消息(例如WM_CREATE)。
同步窗口的激活状态的关键在于处理或发送WM_NCACTIVATE消息。通过处理这个消息,可以强制窗口以激活或非激活状态进行绘制。
窗口的自动隐藏是通过处理WM_ACTIVATEAPP消息实现的。
另外两个需要处理的重要消息是WM_ACTIVATE和WM_SHOWWINDOW,可以在源代码和MSDN中找到关于它们的信息。