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

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

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

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

2)添加一些控制的变量

  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. pDC->BitBlt(0, 0, rc.Width(), rc.Height(), &memdc, 0, 0, SRCCOPY);
  53. TRACE("m_bIsPressed = %d\n", m_bIsPressed);
  54. }

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

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

  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)测试程序

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

实现一个类似360的button的更多相关文章

  1. 制作一个类似苹果VFL的格式化语言来描述UIStackView

    在项目中总是希望页面上各处的文字,颜色,字体大小甚至各个视图控件布局都能够在发版之后能够修改以弥补一些前期考虑不周,或者根据统计数据能够随时进行调整,当然是各个版本都能够统一变化.看到这样的要求后,第 ...

  2. 使用 Canvas 实现一个类似 Google 的可视化的页面错误反馈库

    使用 Canvas 实现一个类似 Google 的可视化的页面错误反馈库 iframe 嵌套 iframe iframe 包含 复制的 HTML 页面 和支持可以拖拽的工具栏 鼠标经过上面,智能识别 ...

  3. 在Salesforce中对某一个Object添加自定义的Button和Link

    在Salesforce中可以对某一个Object添加自定义的Button和Link,来完成特定的逻辑过程,接下来以一个简单的实例来描述整个处理流程,实现的基本功能和我另外一篇文章中描述的功能是一致的( ...

  4. 在Salesforce中可以对某一个Object的Standard Button或Link进行重写

    在Salesforce中可以对某一个Object的Standard Button或Link进行重写,来实现我们特定的逻辑过程,比如:在删除某个Object之前要判断该Object的某个Field的状态 ...

  5. 使用plupload做一个类似qq邮箱附件上传的效果

    公司项目中使用的框架是springmvc+hibernate+spring,目前需要做一个类似qq邮箱附件上传的功能,暂时只是上传小类型的附件 处理过程和解决方案都需要添加附件,处理过程和解决方案都可 ...

  6. 如何制作一个类似Tiny Wings的游戏(2) Cocos2d-x 2.1.4

    在第二篇<如何制作一个类似Tiny Wings的游戏>基础上,增加添加主角,并且使用Box2D来模拟主角移动,原文<How To Create A Game Like Tiny Wi ...

  7. 如何制作一个类似Tiny Wings的游戏 Cocos2d-x 2.1.4

    在第一篇<如何使用CCRenderTexture创建动态纹理>基础上,增加创建动态山丘,原文<How To Create A Game Like Tiny Wings with Co ...

  8. 一个类似抖音 APP 拍摄按钮效果的控件

    TouchButton 一个类似抖音 APP 拍摄按钮效果的控件 效果图预览 用法 <net.angrycode.library.TouchButton android:id="@+i ...

  9. 实现一个类似Chrome新功能提示的popoup

    先让我们看一下Chrome的popup是什么样的: 这个“直接搜索网页”与“在打开的标签页之间切换”就是两个功能导航,还做了一个动画效果,会不停的上下晃. 我通过WindowManager的addVi ...

随机推荐

  1. 几种AutoLayout自动布局所经常使用的布局约束类型

    width表示约束ui控件的固定宽度 height表示约束ui控件的固定高度 Leading Space to Superview 与父视图的左边界线保持固定距离 Trailing Space to ...

  2. vue项目中遇到的打印,以及处理重新排版后不显示echarts图片问题。

    1. 项目中用到的打印 页面: css: 控制好宽度一般A4 我调试的是794px多了放不下,小了填不满.当时多页打印的时候,一定要控制好每一个页面内容显示的高度不要超过一个页面,当然根据自己项目来. ...

  3. [转自百度贴吧-本人亲测有效]Adobe XD 打开立即闪退问题修复

    出现闪退的原因还是因为缺少C++组件, 下载 DirectXRepairV3.7软件 原文: https://tieba.baidu.com/p/5961511474 软件下载: http://xia ...

  4. 0-NULL-nullptr

    NULL In C A null-pointer constant is an integral constant expression that evaluates to zero (like 0 ...

  5. RxSwift 之变换操作

    https://www.aliyun.com/jiaocheng/349821.html RxSwift入坑解读-你所需要知道的各种概念 http://www.open-open.com/lib/vi ...

  6. Unity 声音播放不受Time.scale为0的影响

    其他会暂停,目前发现声音不受影响 嗯,就这样.

  7. Guitar Pro 的双十一特惠活动,正在如火如荼进行中...

    11月11日这个令人兴奋的日子又来了.没错,“双十一”所有网购达人狂欢的日子.同时期待已久的Guitar Pro 也将在“双十一”当天,把福利分享与你我.11月11日Guitar Pro 将在麦软商城 ...

  8. 一个完整的Flexbox指南(转载)

    本文由大漠根据Chris Coyier的<A Complete Guide to Flexbox>所译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点.如需转载此 ...

  9. 路飞学城Python-Day25

  10. IOS - 6\7下UINavigationBar的颜色的方法改变 ——转载http://www.th7.cn/Program/IOS/201310/155057.shtml

    IOS7下设置UINavigationBar的颜色的方法已经改变(当然如果是用自定义图片的话请忽略---) 首先是区别iOS7和之前版本的方法如下: //如果是iOS7以前的话if (floor(NS ...