通过改写一个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. UVA 11609 - Anne's game cayley定理

    Lily: “Chantarelle was part of my exotic phase.”Buffy: “It’s nice. It’s a mushroom.”Lily: “It is? Tha ...

  2. ES failed to notify ClusterStateListener java.lang.IllegalStateException: environment is not locked

    ES出现异常: failed to notify ClusterStateListenerjava.lang.IllegalStateException: environment is not loc ...

  3. C# First and FirstOrDefault 方法详解

    在工作中我们经常会遇到有关LINQ 的一些问题.这时我们就用到lambda 表达式. 下面是我在工作遇到的. First  and FirstOrDefault  这两方法.我今天把它记录一下. 需要 ...

  4. SQL*PLUS命令的使用大全

    Oracle的sql*plus是与oracle进行交互的客户端工具.在sql*plus中,可以运行sql*plus命令与sql*plus语句. 我们通常所说的DML.DDL.DCL语句都是sql*pl ...

  5. rel= "noopener"

    rel= "noopener" <a href= "https://www.xiaogezi.cn/" target= "_blank" ...

  6. Android宝宝点点乐游戏源码完整版

    Android宝宝点点乐游戏源码完整版,是我从其他网站转载过来的,就是那个安卓教程网,该游戏目前已经上线了百度应用商店了,大家可以去搜索一下,看看演示吧. <ignore_js_op> & ...

  7. vue中slot的用法案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 动态库连接器–动态库链接信息(Mach-O文件格式和程序从加载到执行过程)

    section cmd 说明 举例 __text 主程序代码   __stubs 用于动态库链接的桩   __stub_helper 用于动态库链接的桩   __cstring 常亮字符串符号表描述信 ...

  9. 最新消息,CDRX7冰点价再返现,你知道么?

    一年一度的七夕又到来了,这不很多的单身狗朋友们都已经自备好了狗粮,准备在家里宅上一天呢? 开个玩笑今天小编就为各位带来了 一个劲爆大消息... Deng/deng/deng/deng..就是备受万众瞩 ...

  10. CorelDRAW简单绘制的一杯满满的橙汁教程

    CorelDRAW怎么画一杯橙汁?方法很简单,首先绘制一个闭合路径,执行线性渐变,填充颜色:复制图形,使用刻刀工具裁剪两半,更改不透明度:然后为橙汁增加底部椭圆:修剪橙子片:绘制吸管:最后加上一层橙子 ...