duilib 子窗口位置_Duilib中使用(创建)多窗口,以及子窗口的关闭问题

本文介绍了如何利用duilib库创建和管理子窗口,特别是模态对话框的实现。通过继承WindowImplBase类并重写OnDestroy方法来确保程序正确退出。在ShowModal()函数中,子窗口接管消息循环,关闭时恢复父窗口并传递消息。了解这些基础知识对于使用duilib进行窗口交互和复杂功能的开发至关重要。
摘要由CSDN通过智能技术生成

注意:使用前提是你已经可以用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的分支太多啦,好多人都自己维护一份代码自己用源码肯定有改动

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值