duilib自定义控件

1.控件接口

       重写  GetClass()  和 GetInterface 接口

       

  1. class CSkinPikerPictureItemUI : public CButtonUI  
  2. {  
  3. public:  
  4.     CSkinPikerPictureItemUI();  
  5.   
  6.     LPCTSTR GetClass() const;  
  7.     LPVOID GetInterface(LPCTSTR pstrName);  
  8.   
  9.     void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue);  
  10.     void PaintStatusImage(HDC hDC);  
  11.   
  12. private:  
  13.     CDuiString m_BkName;  
  14.     CDuiString m_Author;  
  15. };  
   
  1. LPCTSTR CSkinPikerPictureItemUI::GetClass() const  
  2. {  
  3.     return kSkinPickerPictureItemClassName;  
  4. }  
  5.   
  6. LPVOID CSkinPikerPictureItemUI::GetInterface(LPCTSTR pstrName)  
  7. {  
  8.     if( _tcscmp(pstrName, kSkinPickerPictureItemInterface) == 0 ) return static_cast<CSkinPikerPictureItemUI*>(this);  
  9.     return CButtonUI::GetInterface(pstrName);  
  10. }  
  11.   
2. 识别控件
     通常情况下,可以让窗体类继承IDialogBuilderCallback接口并且重写CreateControl(DuiLib自带的WindowImplBase窗体类已经继承了这个接口,如果是继承WindowImplBase的话就直接重写CreateControl就可以了)。函数处理方法是比较传入的字符串,根据字符串来决定返回什么控件的指针,这个传入的字符串就是xml文件中控件的标签,比如<Button />中的字符串Button。

  1. CControlUI* CSkinPickerDialog::CreateControl(LPCTSTR pstrClass)   
  2. {  
  3.     if (_tcsicmp(pstrClass, kSkinPickerPictureItemInterface) == 0)  
  4.         return  new CSkinPikerPictureItemUI();  
  5.   
  6.     return NULL;  
  7. }  
  
       方法2: 添加回调函数,让程序识别控件
     继承 IDialogBuilderCallback,添加createcontrol接口
    class CDialogBuilderCallbackEx : public IDialogBuilderCallback
    {
    public:
CControlUI* CreateControl(LPCTSTR pstrClass) 
{
if( _tcscmp(pstrClass, _T("ComputerExamine")) == 0 ) 
return new ComputerExamineUI;
return NULL;
}
     };
    在主对话框创建时添加回调
     LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
   {
      LONG styleValue = ::GetWindowLong(*this, GWL_STYLE);
      styleValue &= ~WS_CAPTION;
      ::SetWindowLong(*this, GWL_STYLE, styleValue | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
      m_pm.Init(m_hWnd);
      CDialogBuilder builder;
      CDialogBuilderCallbackEx cb;
      CControlUI* pRoot = builder.Create(_T("skin.xml"), (UINT)0,  &cb, &m_pm);

      ASSERT(pRoot && "Failed to parse XML");
      m_pm.AttachDialog(pRoot);
      m_pm.AddNotifier(this);
     Init();
     return 0;
     }
   

3自定义控件为了让界面更丰富,常用重载函数:
 virtual void DoEvent(TEventUI& event);
virtual void DoPaint(HDC hDC, const RECT& rcPaint);
virtual void PaintBkColor(HDC hDC);
virtual void PaintBkImage(HDC hDC);
virtual void PaintStatusImage(HDC hDC);
virtual void PaintText(HDC hDC);
virtual void PaintBorder(HDC hDC);
virtual void DoInit();
virtual void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue);
virtual bool IsVisible() const;
virtual void SetVisible(bool bVisible = true);
virtual void SetInternVisible(bool bVisible = true); // 仅供内部调用,有些UI拥有窗口句柄,需要重写此函数
virtual void SetPos(RECT rc);
      

  
  















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值