按钮自绘,当鼠标点击按钮后,居然又看到按钮上的文字了

liulin2016 2013-10-11 07:41:49
对话框上有3个按钮,每个按钮子类化,我们的CMyButton类。

代码在下面,所作的工作仅仅是贴图。

可是我发现个bug,当点击后,按钮又恢复了 原来的样子(这里所谓的原来的样子,指的是,你用mfc拖一个按钮到界面上,此时按钮是原生的,没有绘制过的, 上面有文字。 这就是我这里说的原来的样子)

由于原来按钮上有文字,当我点击按钮后,我惊奇的发现, 按钮恢复了原生态,现在不知道该怎么办,

我想简单处理,不想搞复杂。多谢





BEGIN_MESSAGE_MAP(CMyButton, CButton)
ON_WM_PAINT()

END_MESSAGE_MAP()



// CMyButton 消息处理程序





void CMyButton::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CButton::OnPaint()
TCHAR strModuelName[MAX_PATH]={0};
GetModuleFileName(GetModuleHandle(NULL),strModuelName,MAX_PATH);
TCHAR* pstr = _tcsrchr(strModuelName,_T('\\'));
ASSERT(pstr);
*(pstr+1) = _T('\0');
lstrcat(strModuelName,_T("\\ButtonPics\\"));
CString strTmp = strModuelName;
strTmp += m_strBitmapResources;
HBITMAP hBitmap = (HBITMAP)::LoadImage(GetModuleHandle(NULL), strTmp, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

//背景贴图实现
CDC MemDC;
//CBitmap对象
CBitmap Bitmap,*pOldBitmap;
//BITMAP句柄
BITMAP bm;
ASSERT(hBitmap);
Bitmap.Attach(hBitmap);
//加载位图
//将位图资源与句柄绑定
Bitmap.GetObject(sizeof(BITMAP),&bm);
//创建与内存兼容的DC
MemDC.CreateCompatibleDC(&dc);
//替换原位图
pOldBitmap=(CBitmap*)(MemDC.SelectObject(&Bitmap));
//获取绘制的区域
CRect rcClient;
GetClientRect(&rcClient);
//dc.DrawFrameControl(&rcClient,DFC_BUTTON ,DFCS_BUTTONPUSH);
//绘制到客户区
SetStretchBltMode( dc.GetSafeHdc(), HALFTONE );
dc.StretchBlt(0,0,rcClient.Width(),rcClient.Height(),&MemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
//dc.BitBlt(0,0,rcClient.Width(),rcClient.Height(),&MemDC,0,0,SRCCOPY);
ASSERT(pOldBitmap);
MemDC.SelectObject(pOldBitmap);
Bitmap.Detach();
Bitmap.DeleteObject();
pOldBitmap->DeleteObject();
MemDC.DeleteDC();
}
...全文
224 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuwujian 2013-12-10
  • 打赏
  • 举报
回复
OnEraseBk里面把原来的背景都给擦除了
zhaoqi001 2013-12-10
  • 打赏
  • 举报
回复
http://www.codeproject.com/Articles/57/CButtonST-v3-9-MFC-Flat-buttons
琅琊榜 2013-10-17
  • 打赏
  • 举报
回复
楼上说的有理
schlafenhamster 2013-10-17
  • 打赏
  • 举报
回复
这就是 onpaint 与 drawitem 的 不同, “当点击后” CButton 跳过了 onpaint , 自己 把 text 输出到 按钮 上了。
qdtroy 2013-10-13
  • 打赏
  • 举报
回复
如果subclass控件,则要处理DrawItem绘制,不要处理Paint 如果是从CWnd继承则直接在Paint里面处理即可
liulin2016 2013-10-12
  • 打赏
  • 举报
回复
引用 5 楼 liulin2016 的回复:
[quote=引用 3 楼 ohyeszq 的回复:] 同楼上。 如果不行,在自绘的时候判断,当按钮获取焦点的时候重绘。
在drawitem里自绘,貌似只有这个函数可以判断焦点吧?[/quote] 我把onpaint干掉了,代码移动到drawitem里,似乎没有看到诡异问题 且,我并没有判断是否有焦点, 直接设置为bs_owerner风格
liulin2016 2013-10-12
  • 打赏
  • 举报
回复
引用 3 楼 ohyeszq 的回复:
同楼上。 如果不行,在自绘的时候判断,当按钮获取焦点的时候重绘。
在drawitem里自绘,貌似只有这个函数可以判断焦点吧?
liulin2016 2013-10-12
  • 打赏
  • 举报
回复
引用 2 楼 worldy 的回复:
在按键点击事件中,或者mousedown事件中加入 Invalidate()试试
还是解决不了,怎么这么奇怪啊
ohyeszq 2013-10-12
  • 打赏
  • 举报
回复
同楼上。 如果不行,在自绘的时候判断,当按钮获取焦点的时候重绘。
worldy 2013-10-11
  • 打赏
  • 举报
回复
在按键点击事件中,或者mousedown事件中加入 Invalidate()试试
gz_qmc 2013-10-11
  • 打赏
  • 举报
回复
看了你的留言,希望你直接从CWnd设计出自己的按钮 而不是从CButton派生

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧