DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

通过改写一个buttonst类,实现360效果的button。

主要可以完成:frame,hover,face效果,并且支持menu,tooltips

1)派生新的类QButton.添加虚函数,设置自绘style

 

[cpp] view plain copy
 
  1. void QButton::PreSubclassWindow()   
  2. {  
  3. // TODO: Add your specialized code here and/or call the base class  
  4. UINT nBS;  
  5.   
  6. nBS = GetButtonStyle();  
  7.   
  8. // Set initial control type  
  9. m_nTypeStyle = nBS & BS_TYPEMASK;  
  10.   
  11. // Check if this is a checkbox  
  12. if (nBS & BS_CHECKBOX) m_bIsCheckBox = TRUE;  
  13.   
  14. // Set initial default state flag  
  15. if (m_nTypeStyle == BS_DEFPUSHBUTTON)  
  16. {  
  17. // Set default state for a default button  
  18. m_bIsDefault = TRUE;  
  19.   
  20. // Adjust style for default button  
  21. m_nTypeStyle = BS_PUSHBUTTON;  
  22. // If  
  23.   
  24. // You should not set the Owner Draw before this call  
  25. // (don't use the resource editor "Owner Draw" or  
  26. // ModifyStyle(0, BS_OWNERDRAW) before calling PreSubclassWindow() )  
  27. ASSERT(m_nTypeStyle != BS_OWNERDRAW);  
  28.   
  29. // Switch to owner-draw  
  30. ModifyStyle(BS_TYPEMASK, BS_OWNERDRAW, SWP_FRAMECHANGED);  
  31. CButton::PreSubclassWindow();  
  32. }  



 

2)添加一些控制的变量

 

[cpp] view plain copy
 
  1. void QButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)   
  2. {  
  3. // TODO: Add your code to draw the specified item  
  4. CDC* pDC = CDC::FromHandle(lpDIS->hDC);  
  5. CRect rc = lpDIS->rcItem;  
  6. CBitmap bitmap;  
  7. bitmap.CreateCompatibleBitmap(pDC, rc.Width(), rc.Height());  
  8. CDC memdc;  
  9. memdc.CreateCompatibleDC(pDC);  
  10. memdc.SelectObject(bitmap);  
  11. PaintBk(&memdc);  
  12. memdc.SelectObject(GetStockObject(NULL_BRUSH));  
  13. memdc.Rectangle(rc);  
  14. if(m_bIsCheckBox)  
  15. {  
  16. m_bIsPressed = (lpDIS->itemState & ODS_SELECTED) || (m_nCheck != 0);  
  17. }else  
  18. {  
  19. m_bIsPressed = (lpDIS->itemState & ODS_SELECTED);  
  20. }  
  21. m_bIsFocused = (lpDIS->itemState & ODS_FOCUS);  
  22. m_bIsDisabled = (lpDIS->itemState & ODS_DISABLED);  
  23. if(m_bIsDisabled)  
  24. {  
  25. if(m_pImage_disable != NULL)  
  26. m_pImage_disable->Draw(memdc.m_hDC, rc);  
  27. }else  
  28. {  
  29. if(m_bIsPressed)  
  30. {  
  31. if(m_pImage_pressed != NULL){  
  32. m_pImage_face->Draw(memdc.m_hDC, rc);  
  33. CRect rc2;  
  34. rc2 = rc;  
  35. rc2.OffsetRect(2,2);  
  36. m_pImage_pressed->Draw(memdc.m_hDC, rc);  
  37. }  
  38. }else if(m_bIsHovering)  
  39. {//draw hover image  
  40. if(m_pImage_hover != NULL && m_pImage_face != NULL)  
  41. {  
  42. m_pImage_face->Draw(memdc.m_hDC, rc);  
  43. m_pImage_hover->Draw(memdc.m_hDC, rc);  
  44. }  
  45. }else  
  46. {  
  47. if(m_pImage_face != NULL){  
  48. m_pImage_face->Draw(memdc.m_hDC, rc);  
  49. }  
  50. }  
  51. }  
  52.   
  53. pDC->BitBlt(0, 0, rc.Width(), rc.Height(), &memdc, 0, 0, SRCCOPY);  
  54. TRACE("m_bIsPressed = %d\n", m_bIsPressed);  
  55. }  

直接用memdc绘制,frame,hover,face

3)使用cximage来加载png图片资源

 

[cpp] view plain copy
 
  1. BOOL QButton::LoadDisablePng(UINT nID, LPCTSTR cType)  
  2. {  
  3. if(m_pImage_disable != NULL)  
  4. delete m_pImage_disable;  
  5. m_pImage_disable = new CxImage;  
  6. return m_pImage_disable->LoadResource(FindResource(NULL,MAKEINTRESOURCE(nID),cType), CXIMAGE_FORMAT_PNG);  
  7. }  


4)添加mouse hover等支持。

5)测试程序

 

[cpp] view plain copy
 
  1. OnInitDialog()  
  2. {  
  3. m_btn.LoadFacePng(IDR_PNG8,"PNG");   
  4.   m_btn.LoadPressPng(IDR_PNG10,"PNG");  
  5.  // m_btn.LoadDisablePng(IDR_PNG10,"PNG");  
  6.   m_btn.LoadHoverPng(IDR_PNG9,"PNG");  
  7. m_btn.SetTooltipText("Hunter lv Tool tips!", TRUE);  
  8. m_btn.SetMenu(IDR_MENU1, this->m_hWnd, TRUE);////QButton m_btn  
  9. }  

 

6)需要自己编译cximage的库,然后添加库文件,头文件就可以直接使用。

posted on 2017-05-31 11:46  DoubleLi  阅读(603)  评论(0编辑  收藏  举报