注意:使用前提是你已经可以用duilib创建一个新窗口,并且正常运行,这个时候想实现子窗口一些弹窗啊什么的实现一些复杂的功能
duilib中有一个 WindowImplBase类已经封装好啦基本的一些函数调用,一般情况下写窗口的时候都要继承这个类,写一个窗口很简单如下WeChatWnd *wechatWnd = new WeChatWnd;
wechatWnd->Create(m_hWnd, _T("微信窗口管理"), UI_WNDSTYLE_DIALOG, UI_WNDSTYLE_EX_FRAME);
wechatWnd->CenterWindow();
wechatWnd->ShowModal();
delete wechatWnd;
显示啦一个模态窗口
我们知道windows中退出程序一般是 关闭窗口WM_CLOSE -> 销毁窗口 WM_DESTROY -> 退出程序 WM_QUIT
WindowImplBase里面已经写好啦 OnClose和OnDestroy事件 在窗口调用Close()方法关闭时会依次调用这两个过程关闭和销毁,但是最后一个退出的消息是没有发出的,是需要我们自己处理的一般情况下需要我们重写OnDestroy方法来实现程序的退出如下:LRESULT MainWnd::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) {
PostQuitMessage(0);
return 0;
}
发出WM_QUIT消息退出程序,
下面看下showModel都 做了什么UINT CWindowWnd::ShowModal()
{
ASSERT(::IsWindow(m_hWnd));
UINT nRet = 0;
HWND hWndParent = GetWindowOwner(m_hWnd);
::ShowWindow(m_hWnd, SW_SHOWNORMAL);
::EnableWindow(hWndParent, FALSE);
MSG msg = { 0 };
while( ::IsWindow(m_hWnd) && ::GetMessage(&msg, NULL, 0, 0) ) {
if( msg.message == WM_CLOSE && msg.hwnd == m_hWnd ) {
nRet = msg.wParam;
::EnableWindow(hWndParent, TRUE);
::SetFocus(hWndParent);
}
if( !CPaintManagerUI::TranslateMessage(&msg) ) {
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
if( msg.message == WM_QUIT ) break;
}
::EnableWindow(hWndParent, TRUE);
::SetFocus(hWndParent);
if( msg.message == WM_QUIT ) ::PostQuitMessage(msg.wParam);
return nRet;
}
先将父窗口Disable掉,然后接管UI主线程的消息循环,在模态框关闭后,再将消息循环放归UI主线程。
所以一般情况下子窗口就直接close就可以啦。主程序要退出的时候就发送一个退出消息
后记:DuiLib一般情况下都是这个流程,不排除有些人的不能用,duilib的分支太多啦,好多人都自己维护一份代码自己用源码肯定有改动