zoukankan      html  css  js  c++  java
  • 实现一个类似360的button

    通过改写一个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 ", 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的库,然后添加库文件,头文件就可以直接使用。

  • 相关阅读:
    Linux Core Dump
    ODP.NET Managed正式推出
    获取EditText的光标位置
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1028 数的计算
  • 原文地址:https://www.cnblogs.com/lidabo/p/6923390.html
Copyright © 2011-2022 走看看