自绘button
来源:互联网 发布:js 手写板插件 编辑:程序博客网 时间:2024/06/05 00:27
众所周知,CBitmapButton类提供了一定的自绘Button的能力,即LoadBitmaps()函数,但没有鼠标进入而改变状态的机制.以下是我的代码(不多),有错误,希望有人能COPY进VC后给予指正.
*****一些数据定义未说明*****
***这是一个接口类,用于对按钮控制变量中来设置自绘的功能***
void CMyButton::GetResId(UINT id1,UINT id2,UINT id3)
{//类似LoadBitmaps()得到资源
m_Id1=id1;
m_Id2=id2;
m_Id3=id3;
}
void CMyButton::OnPaint()
{//DC重绘
CPaintDC dc(this); // device context for painting
//经过分析 鼠标未进入前state为0,进入state为1,按下为2,起来为0,离开为0
//所以需要3个资源
if(state==0)
DrawBmp(&dc,m_Id1);
else if(state==1)
DrawBmp(&dc,m_Id2);
else if(state==2)
DrawBmp(&dc,m_Id3);
}
void CMyButton::OnMouseMove(UINT nFlags, CPoint point)
{//对鼠标消息处理
if(!b_InRect||GetCapture()!=this){//进入
b_InRect=true;//进入标志
SetCapture();//捕获
state=1; //修改状态
Invalidate();//重绘
}
else{
if(!m_ButRect.PtInRect(point)){//离开
b_InRect=false; //清除进入标志
ReleaseCapture();//释放
state=0; //修改状态
Invalidate(); //重绘
}
}
CButton::OnMouseMove(nFlags, point);
}
void CMyButton::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{//得到按钮尺寸
m_ButRect = lpDrawItemStruct->rcItem; //获取按钮尺寸
CButton::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
void CMyButton::DrawBmpState(CPaintDC *pDC, HBITMAP hBitmap)
//PDC双缓存绘图,代码略
void CMyButton::DrawBmp(CPaintDC *dc, UINT id)
{//绘图,以ID为参数
CBitmap pb;
HBITMAP hbmp;
pb.LoadBitmap(id);//加载资源
hbmp=(HBITMAP)pb;//转换
DrawBmpState(dc,hbmp);//绘图
}
void CMyButton::OnLButtonDown(UINT nFlags, CPoint point)
{//处理鼠标按下
SetCapture();
state=2;
Invalidate();
// CButton::OnLButtonDown(nFlags, point);
}
void CMyButton::OnLButtonUp(UINT nFlags, CPoint point)
{//处理鼠标放开
state=0;
Invalidate();
CButton::OnLButtonUp(nFlags, point);
}
双缓冲绘图
void CMyButton::DrawBmpState(CPaintDC *pDC, HBITMAP hBitmap)
{
CRect rect;
GetClientRect(&rect);
CDC MemDC,mdc;
mdc.CreateCompatibleDC(NULL);
MemDC.CreateCompatibleDC(NULL);
CBitmap MemBitmap;
MemBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
MemDC.SelectObject(&MemBitmap);
MemDC.FillSolidRect(0,0,rect.Width(),rect.Height(),RGB(0,0,0));
mdc.SelectObject(hBitmap);
MemDC.BitBlt(0,0,rect.Width(),rect.Height(),&mdc,0,0,SRCCOPY);
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY);
MemBitmap.DeleteObject();
MemDC.DeleteDC();
}
其中在OnLButtonDown注释掉了基类的OnLButtonDown,测试过,如果不去掉,则当按下时会出错.
但如果注释掉的话...则鼠标失去了按下发送的消息作用,从而失去了按钮该有的功能.
所以,这2者不知道如何处理.也不知道是否一些界面中的响应MOUSEMOVE是不是这样处理的.
第一次提问,请大家赐教,谢谢!
http://blog.csdn.net/ken451016394/article/details/7613534
- 自绘button
- WTL-Button自绘
- 自绘button
- 自绘Radio button
- UILIB 简单自绘BUTTON
- Button 自绘(2006-09-13)
- Win32 自绘Button的实现方法
- 【WTL】控件自绘之Button
- MFC 自绘button---基础篇
- 圆角矩形button自绘
- Button按钮控件自绘操作
- Button的自绘制
- 扩展Button,实例演示如何自绘控件外观
- 3.VC(ui)-clistbox 和button的自绘
- MFC初学02——自绘BUTTON
- 【自绘Button之一】带Icon的按钮控件
- MFC (2)Button控件自绘实现
- button控件圆角矩形的自绘方法
- cygwin下面编译proxmark3(at 2015.09.09)
- Hibernate基于Spring模板的DAO基类
- 欢迎使用CSDN-markdown编辑器
- JSON和Java实体之间的数据类型映射
- Leetcode: Gray Code
- 自绘button
- python语法检查利器pychecker
- 初窥Linux 之 ext2/ext3文件系统
- 网络IO模型
- Mysql中in和find_in_set的使用说明
- Fresco 最全最简单的Fresco 可以导入Eclipse FrescoDemo并且直接可以运行
- Processing 练习(7)- 抽象空间_欣赏_000
- arcgis对sqlite数据库的支持情况
- unicode和多字节字符集的区别