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的库,然后添加库文件,头文件就可以直接使用。

  • 相关阅读:
    [VB]用API打开浏览文件夹对话框,选择文件夹
    C# 16进制与字符串、字节数组之间的转换
    DIV未知高度的垂直居中代码
    Webbrowser控件判断网页加载完毕的简单方法
    一些控制鼠标的例子!
    Kernel device tree: simplebus
    Display Serial Interface (From WIKI)
    消费提示:常见 处理器/显卡 性能排名网站 汇总
    HDMI notes From HDMI wiki
    Linux graphics stack 理解
  • 原文地址:https://www.cnblogs.com/lidabo/p/6923390.html
Copyright © 2011-2022 走看看