Duilib中使用(创建)多窗口,以及子窗口的关闭问题

来源:赵克立博客 分类: C/C++ 标签:duilib发布时间:2014-07-17 00:07:00最后更新:2018-03-20 17:35:55浏览:5913
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。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就可以啦。主程序要退出的时候就发送一个退出消息


后记:DuiLib一般情况下都是这个流程,不排除有些人的不能用,duilib的分支太多啦,好多人都自己维护一份代码自己用源码肯定有改动


微信号:kelicom QQ群:215861553 紧急求助须知
Win32/PHP/JS/Android/Python