duilib初始化无法获取控件位置(所有位置都为0)

13 篇文章 0 订阅
9 篇文章 0 订阅

duilib中,我们往往在InitWindow虚函数中获取指定控件位置,调整控制其他控件大小等,但是使用getpos获取的矩形位置为0,所有我们没法在其中最我们自己想要的操作,经过duilib的调试跟踪发现:在窗口创建后第一次刷屏WM_Paint的时候,第一次调整pRoot根节点容器的所有子控件位置就在这个时候;而虚函数InitWindow是在Oncreate中调用的,所有在InitWindow的时候所有控件位置为0,也就是构造时候的空值;整理一下顺序:


(1) 窗口Create,也就是调用CWndWindow或CWindowBaseImpl的create方法创建窗口;

(2)捕获WM_Create消息,在OnCreate处理函数里会调用InitWindow虚函数,此时子控件位置都未初始化;

(3)窗口创建后第一次刷新的时候也就是第一次处理WM_PAINT的时候,会调用pRoot根节点的SetPos,根节点的SetPos会循环递归设置所有子控件的位置;

(4)在(3)过程之后会触发windowinit消息,表示窗口初始化完毕;


定位截图如下:

         WM_PAINT 消息第一次刷新操作:

if(m_bFirstLayout)

{

m_bFirstLayout = false;

SendNotify(m_pRoot, DUI_MSGTYPE_WINDOWINIT, 0, 0,false);

}


在SendNotify中给所有通知对象发送了窗口初始化消息,消息发出者pSender即为pRoot,而WindowBaseImpl在创建的时候

已经调用AddNotify(this)将自己加入PaintMgr通知列表当中去了,所有WindowBaseImpl可以得到通知消息!

我们需要做的就是在WindowBaseImp子类中的虚方法Notify中处理该消息DUI_MSGTYPE_WINDOWINIT("windowinit")即可,

在这里我们可以获取到所有控件位置已经准备就绪,实现我么想做的事!

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Duilib是一个基于C++的开源UI库,它提供了丰富的控件和功能,可以用于快速开发Windows桌面应用程序。在Duilib中,你可以自定义控件来满足特定的需求。 下面是一个示例,演示如何在Duilib中创建一个自定义控件: ```cpp // 自定义控件的头文件 CustomControl.h #pragma once #include "UIlib.h" class CCustomControl : public DuiLib::CControlUI { public: CCustomControl(); virtual ~CCustomControl(); LPCTSTR GetClass() const; LPVOID GetInterface(LPCTSTR pstrName); void DoEvent(DuiLib::TEventUI& event); void PaintStatusImage(HDC hDC); protected: bool m_bMouseHover; bool m_bMousePressed; }; // 自定义控件的实现文件 CustomControl.cpp #include "CustomControl.h" CCustomControl::CCustomControl() : m_bMouseHover(false) , m_bMousePressed(false) { } CCustomControl::~CCustomControl() { } LPCTSTR CCustomControl::GetClass() const { return _T("CustomControl"); } LPVOID CCustomControl::GetInterface(LPCTSTR pstrName) { if (_tcscmp(pstrName, _T("CustomControl")) == 0) return static_cast<CCustomControl*>(this); return CControlUI::GetInterface(pstrName); } void CCustomControl::DoEvent(DuiLib::TEventUI& event) { if (event.Type == DuiLib::UIEVENT_MOUSEENTER) { m_bMouseHover = true; Invalidate(); } else if (event.Type == DuiLib::UIEVENT_MOUSELEAVE) { m_bMouseHover = false; Invalidate(); } else if (event.Type == DuiLib::UIEVENT_BUTTONDOWN) { m_bMousePressed = true; Invalidate(); } else if (event.Type == DuiLib::UIEVENT_BUTTONUP) { m_bMousePressed = false; Invalidate(); } CControlUI::DoEvent(event); } void CCustomControl::PaintStatusImage(HDC hDC) { if (m_bMousePressed) { // 绘制按下状态的控件外观 } else if (m_bMouseHover) { // 绘制鼠标悬停状态的控件外观 } else { // 绘制正常状态的控件外观 } } ``` 在上面的示例中,我们创建了一个名为`CCustomControl`的自定义控件类,继承自`DuiLib::CControlUI`。在这个类中,我们重写了一些方法来处理控件的事件和绘制外观。你可以根据自己的需求来实现这些方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝壳里的沙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值