duilib自定义控件

来源:互联网 发布:网络追踪命令 编辑:程序博客网 时间:2024/06/08 02:15

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);