实现一个类似360的button
来源:互联网 发布:淘宝代卖软件 编辑:程序博客网 时间:2024/05/29 19:51
通过改写一个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 classUINT nBS;nBS = GetButtonStyle();// Set initial control typem_nTypeStyle = nBS & BS_TYPEMASK;// Check if this is a checkboxif (nBS & BS_CHECKBOX) m_bIsCheckBox = TRUE;// Set initial default state flagif (m_nTypeStyle == BS_DEFPUSHBUTTON){// Set default state for a default buttonm_bIsDefault = TRUE;// Adjust style for default buttonm_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-drawModifyStyle(BS_TYPEMASK, BS_OWNERDRAW, SWP_FRAMECHANGED);CButton::PreSubclassWindow();}
2)添加一些控制的变量
void QButton::DrawItem(LPDRAWITEMSTRUCT lpDIS) {// TODO: Add your code to draw the specified itemCDC* 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 imageif(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
- 实现一个类似360的button
- 实现一个功能类似Any的类
- 一个类似jsonreader的c++实现
- mac下的一个类似“_kbhit()”实现
- 实现一个类似QQ的社交聊天工具
- android 自己实现的一个类似expandablelistview的一个控件
- 给js的数组实现一个类似ruby的迭代器
- 一个经典的类似Photoshop的Javascript画板实现
- 一个类似的python消息响应机制的实现
- 实现一个简单的类似 TabLayout 的顶部指示器
- -------实现一个类似迅雷的系统“福雷(FULEI)”
- html实现一个类似屏幕解锁的效果
- 实现一个类似的python消息响应机制
- 一个类似CColorDialog中颜色选择的控件实现
- Netty+Zookeeper实现一个类似Dubbo的RPC框架
- Netty+Zookeeper实现一个类似Dubbo的RPC框架
- 用OC实现一个类似java的事件监听机制
- 《Pattern Recognition and Machine Learning》学习笔记 第一章(一)
- igQuery是Google于2011年底正式推出的一项Web服务
- 报团创业
- iOS学习笔记2-UIView的嵌套
- mysql添加和删除用户
- 实现一个类似360的button
- BI笔记之---合理处理SSAS数据库的几点建议
- 调整图像亮度brightness,对比度contrast,饱和度saturation方法整理
- mysql 修改密码
- CImage实现jpeg到bmp内存图像转换
- 使用VC6.0在32位平台上开发64位程序
- Remove Delta Search (Uninstall Guide)
- 异常_自定义异常_finally_package(包)_打jar包
- CxImage的几种应用举例