Duilib中使用(创建)多窗口,以及子窗口的关闭问题
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。o_0。
更新时间:
2018-03-20 17:35:55
温馨提示:
学无止境,技术类文章有它的时效性,请留意文章更新时间,如发现内容有误请留言指出,防止别人"踩坑",我会及时更新文章
注意:使用前提是你已经可以用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就可以啦。主程序要退出的时候就发送一个退出消息