通过改写一个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. apiCloud中的数据库操作mcm-js-sdk的使用

    1.引入js <!-- 引入mcm-js-sdk Begin --> <script type="text/javascript" src="../pl ...

  2. Java中Array、List、Set、Map

    一.Java中数组 数组用来存放固定数量的同类元素,声明方法: T[] ref,T ref[],如int[] intAry; int intAry[].推荐用T[]的方式,后一种方式为兼容C++习惯写 ...

  3. Re:从0开始的微服务架构--(二)快速快速体验微服务架构?--转

    原文地址:https://mp.weixin.qq.com/s/QO1QDQWnjHZp8EvGDrxZvw 这是专题的第二篇文章,看看如何搭建一个简单模式的微服务架构. 记得好久之前看到一个大牛说过 ...

  4. Route学习笔记

    前言 UrlRoutingModule.class:这块的代码关联了上一篇中路由部分的一个详细说明 一:Route的讲解 1. 路由模板匹配 添加路由: MapRoute 剔除的路由:IgnoreRo ...

  5. Linux目录结构(一)

    linux文件系统的最顶端是/,称为linux的root,所有的目录.文件.设备都在/之下. 文件类型 linux有四种基本文件系统类型:普通文件.目录文件.连续文件和特殊文件.可以用file命令来识 ...

  6. 关于优化for循环的注意的事项

    for循环注意事项: 1.for循环内部尽量少做数据库查询之类的IO代价大的操作 2.尽量控制for循环的次数,不多做无用功 3.能一次加载在内存中的,就不要通过循环来多次查询数据库,除非数据量过大. ...

  7. JS实现HTML打印机效果

    5月最近在学Django,所以所有的Demo都没有PO出去 <!DOCTYPE html> <html lang="en"> <head> &l ...

  8. python之类与对象属性的增删改查

    类属性与对象属性的增删改查 类属性的增删改查 class School: """ 文档 """ Teacher = "老王&quo ...

  9. js获取英文名字的首字母

    场景:网站登录之后要将用户姓名的英文名字的首字母转换成大写的放上去. var str='zhang san'; var arr=str.split(" "); var fristC ...

  10. web自动化-selenium2入门讲解(mac版本)

    最近要做一个selenium2的分享,于是总结了下我用selenium2的感受,希望分享出来,可以对入门的小伙伴有一点帮助,也希望得到大佬的指教   一,环境搭建maven+selenium2+tes ...