以下是一个使用Duilib多重子窗口向主窗口发送消息的完整示例:
// 主窗口类
class CMainWnd : public WindowImplBase {
public:
static CMainWnd* s_pMainWnd;
virtual LPCTSTR GetWindowClassName() const override {
return _T("CMainWnd");
}
virtual CDuiString GetSkinFolder() override {
return _T("");
}
virtual CDuiString GetSkinFile() override {
return _T("main.xml"); // 主窗口布局文件
}
virtual void InitWindow() override {
s_pMainWnd = this;
// 其他初始化操作...
}
LRESULT HandleCustomMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
case WM_MY_MESSAGE:
// 处理自定义消息
break;
// 其他消息处理...
}
return __super::HandleCustomMessage(uMsg, wParam, lParam);
}
};
CMainWnd* CMainWnd::s_pMainWnd = nullptr;
// 子窗口类
class CSubWnd : public WindowImplBase {
public:
virtual LPCTSTR GetWindowClassName() const override {
return _T("CSubWnd");
}
virtual CDuiString GetSkinFolder() override {
return _T("");
}
virtual CDuiString GetSkinFile() override {
return _T("sub.xml"); // 子窗口布局文件
}
void SendMessageToMainWindow(WPARAM wParam, LPARAM lParam) {
if (CMainWnd::s_pMainWnd) {
CMainWnd::s_pMainWnd->SendMessage(WM_MY_MESSAGE, wParam, lParam);
}
}
};
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPSTR /*lpCmdLine*/, int nCmdShow) {
// 初始化Duilib
CPaintManagerUI::SetInstance(hInstance);
CPaintManagerUI::InitResourceCallback(MakeDelegate(&OnLoadResourceCallback));
// 创建主窗口对象
CMainWnd mainWnd;
// 创建子窗口对象
CSubWnd subWnd;
// 显示主窗口和子窗口
mainWnd.Create(NULL, _T("Main Window"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
subWnd.Create(mainWnd.GetHWND(), _T("Sub Window"), UI_WNDSTYLE_CHILD | WS_VISIBLE);
// 进入消息循环
MSG msg = { 0 };
while (::GetMessage(&msg, NULL, 0, 0)) {
if (!CPaintManagerUI::TranslateMessage(&msg)) {
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
return static_cast<int>(msg.wParam);
}
在这个示例中,我们定义了一个CMainWnd
类作为主窗口,另外创建了一个CSubWnd
类作为子窗口。在子窗口类中,通过静态指针变量s_pMainWnd
获取主窗口对象,并调用其SendMessage()
函数向主窗口发送自定义消息。在主窗口类中,重写了消息处理函数HandleCustomMessage()
来处理自定义消息。
请注意,在实际使用时,你需要根据你的布局文件和具体需求进行相应的修改和补充。
内容由零声教学AI助手提供,问题来源于学员提问