实现一个类似360的button
通过改写一个buttonst类,实现360效果的button。
主要可以完成:frame,hover,face效果,并且支持menu,tooltips
1)派生新的类QButton.添加虚函数,设置自绘style
- void QButton::PreSubclassWindow()
- {
- // TODO: Add your specialized code here and/or call the base class
- UINT nBS;
- nBS = GetButtonStyle();
- // Set initial control type
- m_nTypeStyle = nBS & BS_TYPEMASK;
- // Check if this is a checkbox
- if (nBS & BS_CHECKBOX) m_bIsCheckBox = TRUE;
- // Set initial default state flag
- if (m_nTypeStyle == BS_DEFPUSHBUTTON)
- {
- // Set default state for a default button
- m_bIsDefault = TRUE;
- // Adjust style for default button
- m_nTypeStyle = BS_PUSHBUTTON;
- } // If
- // You should not set the Owner Draw before this call
- // (don't use the resource editor "Owner Draw" or
- // ModifyStyle(0, BS_OWNERDRAW) before calling PreSubclassWindow() )
- ASSERT(m_nTypeStyle != BS_OWNERDRAW);
- // Switch to owner-draw
- ModifyStyle(BS_TYPEMASK, BS_OWNERDRAW, SWP_FRAMECHANGED);
- CButton::PreSubclassWindow();
- }
2)添加一些控制的变量
- void QButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)
- {
- // TODO: Add your code to draw the specified item
- CDC* pDC = CDC::FromHandle(lpDIS->hDC);
- CRect rc = lpDIS->rcItem;
- CBitmap bitmap;
- bitmap.CreateCompatibleBitmap(pDC, rc.Width(), rc.Height());
- CDC memdc;
- memdc.CreateCompatibleDC(pDC);
- memdc.SelectObject(bitmap);
- PaintBk(&memdc);
- memdc.SelectObject(GetStockObject(NULL_BRUSH));
- memdc.Rectangle(rc);
- if(m_bIsCheckBox)
- {
- m_bIsPressed = (lpDIS->itemState & ODS_SELECTED) || (m_nCheck != 0);
- }else
- {
- m_bIsPressed = (lpDIS->itemState & ODS_SELECTED);
- }
- m_bIsFocused = (lpDIS->itemState & ODS_FOCUS);
- m_bIsDisabled = (lpDIS->itemState & ODS_DISABLED);
- if(m_bIsDisabled)
- {
- if(m_pImage_disable != NULL)
- m_pImage_disable->Draw(memdc.m_hDC, rc);
- }else
- {
- if(m_bIsPressed)
- {
- if(m_pImage_pressed != NULL){
- m_pImage_face->Draw(memdc.m_hDC, rc);
- CRect rc2;
- rc2 = rc;
- rc2.OffsetRect(2,2);
- m_pImage_pressed->Draw(memdc.m_hDC, rc);
- }
- }else if(m_bIsHovering)
- {//draw hover image
- if(m_pImage_hover != NULL && m_pImage_face != NULL)
- {
- m_pImage_face->Draw(memdc.m_hDC, rc);
- m_pImage_hover->Draw(memdc.m_hDC, rc);
- }
- }else
- {
- if(m_pImage_face != NULL){
- m_pImage_face->Draw(memdc.m_hDC, rc);
- }
- }
- }
- pDC->BitBlt(0, 0, rc.Width(), rc.Height(), &memdc, 0, 0, SRCCOPY);
- TRACE("m_bIsPressed = %d\n", m_bIsPressed);
- }
直接用memdc绘制,frame,hover,face
3)使用cximage来加载png图片资源
- BOOL QButton::LoadDisablePng(UINT nID, LPCTSTR cType)
- {
- if(m_pImage_disable != NULL)
- delete m_pImage_disable;
- m_pImage_disable = new CxImage;
- return m_pImage_disable->LoadResource(FindResource(NULL,MAKEINTRESOURCE(nID),cType), CXIMAGE_FORMAT_PNG);
- }
4)添加mouse hover等支持。
5)测试程序
- OnInitDialog()
- {
- m_btn.LoadFacePng(IDR_PNG8,"PNG");
- m_btn.LoadPressPng(IDR_PNG10,"PNG");
- // m_btn.LoadDisablePng(IDR_PNG10,"PNG");
- m_btn.LoadHoverPng(IDR_PNG9,"PNG");
- m_btn.SetTooltipText("Hunter lv Tool tips!", TRUE);
- m_btn.SetMenu(IDR_MENU1, this->m_hWnd, TRUE);////QButton m_btn
- }

6)需要自己编译cximage的库,然后添加库文件,头文件就可以直接使用。
实现一个类似360的button的更多相关文章
- 制作一个类似苹果VFL的格式化语言来描述UIStackView
在项目中总是希望页面上各处的文字,颜色,字体大小甚至各个视图控件布局都能够在发版之后能够修改以弥补一些前期考虑不周,或者根据统计数据能够随时进行调整,当然是各个版本都能够统一变化.看到这样的要求后,第 ...
- 使用 Canvas 实现一个类似 Google 的可视化的页面错误反馈库
使用 Canvas 实现一个类似 Google 的可视化的页面错误反馈库 iframe 嵌套 iframe iframe 包含 复制的 HTML 页面 和支持可以拖拽的工具栏 鼠标经过上面,智能识别 ...
- 在Salesforce中对某一个Object添加自定义的Button和Link
在Salesforce中可以对某一个Object添加自定义的Button和Link,来完成特定的逻辑过程,接下来以一个简单的实例来描述整个处理流程,实现的基本功能和我另外一篇文章中描述的功能是一致的( ...
- 在Salesforce中可以对某一个Object的Standard Button或Link进行重写
在Salesforce中可以对某一个Object的Standard Button或Link进行重写,来实现我们特定的逻辑过程,比如:在删除某个Object之前要判断该Object的某个Field的状态 ...
- 使用plupload做一个类似qq邮箱附件上传的效果
公司项目中使用的框架是springmvc+hibernate+spring,目前需要做一个类似qq邮箱附件上传的功能,暂时只是上传小类型的附件 处理过程和解决方案都需要添加附件,处理过程和解决方案都可 ...
- 如何制作一个类似Tiny Wings的游戏(2) Cocos2d-x 2.1.4
在第二篇<如何制作一个类似Tiny Wings的游戏>基础上,增加添加主角,并且使用Box2D来模拟主角移动,原文<How To Create A Game Like Tiny Wi ...
- 如何制作一个类似Tiny Wings的游戏 Cocos2d-x 2.1.4
在第一篇<如何使用CCRenderTexture创建动态纹理>基础上,增加创建动态山丘,原文<How To Create A Game Like Tiny Wings with Co ...
- 一个类似抖音 APP 拍摄按钮效果的控件
TouchButton 一个类似抖音 APP 拍摄按钮效果的控件 效果图预览 用法 <net.angrycode.library.TouchButton android:id="@+i ...
- 实现一个类似Chrome新功能提示的popoup
先让我们看一下Chrome的popup是什么样的: 这个“直接搜索网页”与“在打开的标签页之间切换”就是两个功能导航,还做了一个动画效果,会不停的上下晃. 我通过WindowManager的addVi ...
随机推荐
- wifi破解不是真黑客不靠谱?
Wifi破解神器骗局:摆地摊+网络兜售 近日,"万能wifipassword破解器"风靡全国地摊.各地小贩開始兜售这样的蹭网卡.声称可破解各种wifipassword,当场測试也是 ...
- UESTC--1271--Search gold(贪心)
Search gold Time Limit: 1000MS Memory Limit: 65535KB 64bit IO Format: %lld & %llu Submit Sta ...
- Python笔记(三)
# -*- coding:utf-8 -*- # 运算符 a,b=10,20 # 算术运算符:包括+.-.*./.%.**.//运算 print "********************1 ...
- 实现SSRS订阅
以前曾经搞过SSRS的订阅,使用的是公司的邮件服务器,最近QQ群中有妹子问到同样的问题,虽然没能帮人家搞定,下面写出自己参考的资料,以供各位参考: 一.订阅前准备工作(转载自http://blog.s ...
- hadoop配置历史服务器
此文档不建议当教程,仅供参考 配置历史服务器 我是在hadoop1机器上配置的 配置mapred-site.xml <property> <name>mapreduce.job ...
- git提交不用每次都输入用户名密码
克隆项目二种方式: 1. 使用https url克隆, 复制https url 然后到 git clone https-url 2.使用 SSH url 克隆却需要在克隆之前先配置和添加好 SSH ...
- ZBrush软件特性之Stencil模板调控板
在ZBrush中使用Stencil模板我们了解的所有绘图工具,通过它确定模板周围与涂画或模型的位置.本文将详解ZBrush®中如何使用“曲线板”自定义形状. 使用模版 ZBrush模版的作用象我们了解 ...
- Pyhton学习——Day29
#异常与错误# 什么是异常?# 异常就是程序运行时发生错误的信号,在程序出现错误时,则会产生异常,若没有程序处理,则会抛出异常# 导致程序在异常语句处崩溃终止# Traceback 追踪异常信号:** ...
- jupyter的安装
3.6:\Lib\site-packages\pip\models\index.py # PyPI = Index('https://pypi.python.org/') # 替换成 PyPI = I ...
- IETF透露HTTP over QUIC 将重命名为HTTP/3 协议
周一,IETF透露它将HTTP-over-QUIC实验协议重命名为HTTP / 3.HTTP-over-QUIC是一种HTTP重写,用TCP替换TCP. 如果这看起来有点为时过早,那么它与IETF的历 ...