通过改写一个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. log4j日志存储到数据库

    一.前提条件 系统必须是使用LOG4J进行日志管理,否则方法无效. 系统必须包含commons-logging-xxx.jar,log4j-xxx.jar这两个JAR包,XXX为版本号. 二.操作步骤 ...

  2. iis 部署

    配置错误1: 由于权限不足而无法读取配置文件 建立一个新用户,分配所有权限 http://blog.csdn.net/jaychouliyu/article/details/7237143 配置错误2 ...

  3. Qt-信号和槽-多对多

    前言:介绍1对多,多对1以及多对多的案例. 一.1对多 演示内容:在QLineEdit输入时,同步label,text browser以及调试输出板同步显示. 1.1 新建工程 1.2 添加部件 拖入 ...

  4. 广播Intent的三种方式总结

    1.android有序广播和无序广播的区别 BroadcastReceiver所对应的广播分两类:普通广播和有序广播. 普通广播通过Context.sendBroadcast()方法来发送.它是完全异 ...

  5. Oracle学习系类篇(四)

    .分析函数 分析函数oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组,然后计算基于组的邹忠统计值,并且每一组的每一行都可以返回一个统计值. 分析函数和聚合函数的不同之处 ...

  6. React组件化开发

    环境搭建: 1.安装node.js 2.安装cnpm  # npm install -g cnpm --registry=https://registry.npm.taobao.org 3.全局安装c ...

  7. html 编码与解码

    var HtmlUtil = { /*1.用浏览器内部转换器实现html转码*/ htmlEncode:function (html){ //1.首先动态创建一个容器标签元素,如DIV var tem ...

  8. 阿里logo库

    http://www.iconfont.cn/home/index?spm=a313x.7781069.1998910419.2

  9. 第二章 Python数据类型详解

    基本概念 迭代(iteration):如果给定一个list或tuple,我们可以通过for循环来遍历,这种遍历我们称为迭代(iteration) 可变:value改变,id不变,可变类型是不可hash ...

  10. Oracle的分页查询及内联视图和函数处理

    1.Oracle的分页常用方式: select * from(select * ,ROWNUM num from table where ROWNUM<=20 ) where num>0; ...