当前位置:   article > 正文

CListUI 使用注意

void setbkcolor(dword dwbackcolor);

CListContainerElementUI 没有实现setpos。而是调用CContainerUI的SetPos(),从而导致了元素排版不正确。如果重写CListContainerElementUI的setpos则会导致CtreeUI的问题。解决方法:

Step One:

   新建类CListContainerElementUIEx,来实现setpos。此时虽然排版正确了,但在拖动滚动条时,可能导致排版不正确。

  1. class UILIB_API CListContainerElementUIEx:public CListContainerElementUI
  2. {
  3.    public:
  4.     CListContainerElementUIEx();
  5. virtual void Invalidate();
  6.     virtual void SetPos(RECT rc);
  7. };

   成员实现:

  1. CListContainerElementUIEx::CListContainerElementUIEx()
  2. {
  3. }
  4. void CListContainerElementUIEx::SetPos(RECT rc)
  5. {
  6. CContainerUI::SetPos(rc);
  7.     rc = m_rcItem;  
  8. rc.left += m_rcInset.left;  
  9.     rc.top += m_rcInset.top;  
  10.     rc.right -= m_rcInset.right;  
  11.     rc.bottom -= m_rcInset.bottom;  
  12.   
  13.     TListInfoUI *plistinfo = GetOwner()->GetListInfo(); 
  14. SIZE szAvailable = { rc.right - rc.left, rc.bottom - rc.top }; 
  15. forint it2 = 0; it2 < m_items.GetSize(); it2++ )  
  16.     {  
  17.         CControlUI* pControl = static_cast<CControlUI*>(m_items[it2]);  
  18.         if( !pControl->IsVisible() )   
  19.             continue;  
  20.         if( pControl->IsFloat() )   
  21.         {  
  22.             SetFloatPos(it2);  
  23.             continue;  
  24.         }  
  25.         RECT rcPadding = pControl->GetPadding();
  26. SIZE sz = pControl->EstimateSize(szAvailable);  
  27.         if( sz.cx == 0 )   
  28.         {  
  29.             if( sz.cx < pControl->GetMinWidth() )   
  30.                 sz.cx = pControl->GetMinWidth();  
  31.             if( sz.cx > pControl->GetMaxWidth() )   
  32.                 sz.cx = pControl->GetMaxWidth();  
  33.         }  
  34.         else   
  35.         {  
  36.             if( sz.cx < pControl->GetMinWidth() )   
  37.                 sz.cx = pControl->GetMinWidth();  
  38.             if( sz.cx > pControl->GetMaxWidth() )  
  39.                 sz.cx = pControl->GetMaxWidth();  
  40.         }  
  41.   
  42.         sz.cy = pControl->GetFixedHeight();  
  43.         if( sz.cy == 0 )   
  44.             sz.cy = rc.bottom - rc.top - rcPadding.top - rcPadding.bottom;  
  45.         if( sz.cy < 0 )   
  46.             sz.cy = 0;  
  47.         if( sz.cy < pControl->GetMinHeight() )   
  48.             sz.cy = pControl->GetMinHeight();  
  49.         if( sz.cy > pControl->GetMaxHeight() )   
  50.             sz.cy = pControl->GetMaxHeight();  
  51.   
  52.   
  53.         RECT rcCtrl = { plistinfo->rcColumn[it2].left + rcPadding.left,  
  54.             rc.top + rcPadding.top,  
  55.             plistinfo->rcColumn[it2].right + rcPadding.left,   
  56.             rc.top + sz.cy + rcPadding.top + rcPadding.bottom };  
  57.         pControl->SetPos(rcCtrl);
  58. }
  59. }
  60. void CListContainerElementUIEx::Invalidate()
  61. {
  62. CListContainerElementUI::Invalidate();
  63. }

Step two:

 在UIDefine.h文件中定义:

#define  DUI_CTR_LISTCONTAINERELEMENTEX          (_T("ListContainerElementEx"))

在CDialogBuilder的_Parse方法中添加以下代码:

  1. case 22:
  2. if( _tcscmp(pstrClass,DUI_CTR_LISTCONTAINERELEMENTEX) == 0 )
  3. pControl = new CListContainerElementUIEx;
  4. break;

  Step three:

在实现DuiLib::WindowImplBase类中添加以下方法,目的修复滚动条导致的排版不正确:

  

  1. LRESULT XOnLButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  2. LRESULT XOnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) ;

(例如CListWnd类):

  1. class CListWnd :public DuiLib::WindowImplBase, public DuiLib::IListCallbackUI,public DuiLib::IDialogBuilderCallback
  2. {
  3. public:
  4.  virtual LPCTSTR GetItemText(DuiLib::CControlUI* pList, int iItem, int iSubItem);
  5.  CListWnd();
  6.  ~CListWnd(void);
  7.  virtual void InitWindow();
  8.  virtual void Notify(DuiLib::TNotifyUI& msg);
  9.  virtual LPCTSTR GetWindowClassName() const;
  10.  //
  11.  virtual DuiLib::CDuiString GetSkinFolder();
  12.  virtual DuiLib::CDuiString GetSkinFile();/**/
  13.  virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
  14.  virtual LRESULT OnSysCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  15.  virtual DuiLib::UILIB_RESOURCETYPE GetResourceType() const;
  16.  DWORD GetBkColor();
  17.          void SetBkColor(DWORD dwBackColor);
  18.          virtual LRESULT OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  19.  DuiLib::CControlUI* FindControlByName(CString Name);
  20.  DuiLib::CListUI* m_pListUi;
  21.  void OnFinalMessage( HWND hWnd );
  22.  void NeedUpdate();
  23.  /****添加方法***/
  24.  LRESULT XOnLButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  25.  LRESULT XOnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) ;
  26. protected:
  27. CString m_strSkinFolder;
  28. CString m_strSkinFile;
  29. DuiLib::CTreeNodeUI* m_pNodeNeedMove;
  30. DuiLib::CControlUI* m_pDragingCtrl;
  31. CString WndName;
  32. };

  实现:

  1. #include "StdAfx.h"
  2. #include "ListWnd.h"
  3. #include <list>
  4. struct SkinChangedParam
  5. {
  6. DWORD bkcolor;
  7. DuiLib::CDuiString bgimage;
  8. };
  9. const TCHAR* const kBackgroundControlName = _T("bg");
  10. CListWnd::CListWnd()
  11. {
  12. }
  13. CListWnd::~CListWnd(void)
  14. {
  15. }
  16. LPCTSTR CListWnd::GetItemText(DuiLib::CControlUI* pList, int iItem, int iSubItem)
  17. {
  18. return "SSS";
  19. }
  20. void CListWnd::InitWindow(){
  21.  
  22. };
  23. void CListWnd::Notify(DuiLib::TNotifyUI& msg){
  24. }
  25. LPCTSTR CListWnd::GetWindowClassName() const 
  26. {
  27. return _T("CListWnd");
  28. }
  29. DuiLib::CDuiString CListWnd::GetSkinFolder()
  30. {
  31.     return  (DuiLib::CDuiString)m_strSkinFolder;
  32. }
  33. DuiLib::CDuiString CListWnd::GetSkinFile()
  34. {
  35. return m_strSkinFile;
  36. }
  37. LRESULT CListWnd::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
  38.    LRESULT Ok=0;
  39.    BOOL bHandled =true;
  40.    if(uMsg ==WM_LBUTTONUP)     
  41.    Ok=XOnLButtonUp(uMsg, wParam, lParam, bHandled); /**/
  42.  
  43.    if(uMsg ==WM_MOUSEMOVE)    
  44.    Ok=XOnMouseMove(uMsg, wParam, lParam, bHandled); /**/
  45.  
  46.    return WindowImplBase::HandleMessage(uMsg,wParam, lParam);
  47.   
  48. }
  49. //WM_LBUTTONUP消息处理函数  
  50. LRESULT CListWnd::XOnLButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)  
  51. {  
  52.  POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
  53.          
  54.  DuiLib::CControlUI* pNewHover =this->m_PaintManager.FindControl(pt);
  55.  if(pNewHover!=NULL)
  56.  { 
  57.  CString abcd=pNewHover->GetClass();
  58.  if(abcd!=_T("ScrollBarUI"))
  59.  return 0;
  60.  DuiLib::CControlUI* pParent=pNewHover->GetParent();
  61.  if(pParent!=NULL)
  62.  {
  63.  CString name=pParent->GetClass();
  64.  pParent=pParent->GetParent();
  65.  name=pParent->GetClass();
  66.  if(name==_T("ListUI"))
  67.  {
  68.     m_pListUi->SetPos(m_pListUi->GetPos()); 
  69.  }
  70.  }
  71.  }
  72.     return 0;  
  73. }  
  74.   
  75. //WM_MOUSEMOVE消息处理函数  
  76. LRESULT CListWnd::XOnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)  
  77. {  
  78. if(!(wParam&MK_LBUTTON))
  79.    return 0;
  80.     POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
  81.          
  82.  DuiLib::CControlUI* pNewHover =this->m_PaintManager.FindControl(pt);
  83.  if(pNewHover!=NULL)
  84.  { 
  85.  CString abcd=pNewHover->GetClass();
  86.  if(abcd!=_T("ScrollBarUI"))
  87.  return 0;
  88.  DuiLib::CControlUI* pParent=pNewHover->GetParent();
  89.  if(pParent!=NULL)
  90.  {
  91.  CString name=pParent->GetClass();
  92.  pParent=pParent->GetParent();
  93.  name=pParent->GetClass();
  94.  if(name==_T("ListUI"))
  95.  {
  96.     m_pListUi->SetPos(m_pListUi->GetPos()); 
  97.  }
  98.  }
  99.  }
  100.     return 0;  
  101. }  
  102. LRESULT CListWnd::OnSysCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  103. {
  104. #if defined(WIN32) && !defined(UNDER_CE)
  105. BOOL bZoomed = ::IsZoomed(m_hWnd);
  106. LRESULT lRes = CWindowWnd::HandleMessage(uMsg, wParam, lParam);
  107. if (::IsZoomed(m_hWnd) != bZoomed)
  108. {
  109. }
  110. #else
  111. return __super::OnSysCommand(uMsg, wParam, lParam, bHandled);
  112. #endif
  113. return 0;
  114. }
  115. DuiLib::UILIB_RESOURCETYPE CListWnd::GetResourceType() const
  116. {
  117. return DuiLib::UILIB_FILE;
  118. }
  119. DWORD CListWnd::GetBkColor()
  120. {
  121. DuiLib::CControlUI* background = m_PaintManager.FindControl(kBackgroundControlName);
  122. if (background != NULL)
  123. return background->GetBkColor();
  124. return 0;
  125. }
  126. void CListWnd::SetBkColor(DWORD dwBackColor)
  127. {
  128. DuiLib::CControlUI* background = m_PaintManager.FindControl(kBackgroundControlName);
  129. if (background != NULL)
  130. {
  131. background->SetBkImage(_T(""));
  132. background->SetBkColor(dwBackColor);
  133. background->NeedUpdate();
  134. SkinChangedParam param;
  135. param.bkcolor = background->GetBkColor();
  136. param.bgimage = background->GetBkImage();
  137. //skin_changed_observer_.Broadcast(param);
  138. }
  139. }
  140. LRESULT CListWnd::OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  141. {
  142. return 1;
  143. }
  144.  void CListWnd::OnFinalMessage( HWND hWnd )
  145.  {
  146.     WindowImplBase::OnFinalMessage(hWnd);
  147. delete this;
  148.  }
  149. DuiLib::CControlUI* CListWnd::FindControlByName(CString Name)
  150. {
  151. return this->m_PaintManager.FindControl(Name);
  152. }
  153. CString CListWnd::GetWndName()
  154. {
  155. return this->WndName;
  156. }
  157. void CListWnd::NeedUpdate(){
  158. /**用以刷新**/
  159.     RECT rcClient;
  160. ::GetClientRect(GetHWND(), &rcClient);
  161.          if( !::IsRectEmpty(&rcClient) ) 
  162. {
  163. this->m_PaintManager.GetRoot()->SetPos(rcClient);
  164.  }
  165. }

效果图:

153459_WPcQ_343244.jpg

转载于:https://my.oschina.net/u/343244/blog/372758

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/502504
推荐阅读
相关标签
  

闽ICP备14008679号