通过改写一个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. angularjs1-5,class,

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  2. 什么是EL表达式

    转自:https://blog.csdn.net/hj7jay/article/details/51302466 1. EL表达式主要作用 EL表达式说白了,就是让JSP写起来更加方便,它属于JSP技 ...

  3. 10. Regular Expression Matching[H]正则表达式匹配

    题目 Given an input string(s) and a pattern(p), implement regular expression matching with support for ...

  4. HD-ACM算法专攻系列(20)——七夕节

    问题描述: AC源码: /**/ #include"iostream" #include"cmath" using namespace std; int mai ...

  5. JavaScript系列--浅析原型链与继承

    一.前言 继承是面向对象(OOP)语言中的一个最为人津津乐道的概念.许多面对对象(OOP)语言都支持两种继承方式::接口继承 和 实现继承 . 接口继承只继承方法签名,而实现继承则继承实际的方法.由于 ...

  6. USACO Sabotage, 2014 Mar 破坏阴谋(二分+贪心)

    一开始看完这题就有个想法: 只要把大于整个序列平均数的最大连续序列就是最优? 那把整个序列都减掉平均数 在做最大连续字序列和且记录长度? 仔细思考一下并不太对: 当子序列最大但长度较大 也许也比不上删 ...

  7. js禁止

    很多时候需要用到js禁止相关的代码: function prohibit() { // 禁止右键 $(document).ready(function() { $(document).bind(&qu ...

  8. [置顶] Elon Musk (伊隆·马斯克):无限的创想与意志的胜利

    Elon Musk (伊隆·马斯克):无限的创想与意志的胜利 很多人说 Steve Jobs 很伟大,这一点我认同.但是,单纯从创造出的产物而言,Elon Musk 的成就毫无疑问远远超越 Steve ...

  9. BZOJ 2244 [SDOI2011]拦截导弹 (三维偏序CDQ+线段树)

    题目大意: 洛谷传送门 不愧为SDOI的duliu题 第一问?二元组的最长不上升子序列长度?裸的三维偏序问题,直接上$CDQ$ 由于是不上升,需要查询某一范围的最大值,并不是前缀最大值,建议用线段树实 ...

  10. 【BZOJ 1486】 [HNOI2009]最小圈

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 我们可以只想那个均值最小的环. 我们不知道那个环由哪些边构成 但我们可以把每条边都减掉mid 那个环受到的影响是什么呢? 如果这个均 ...