关于自绘按钮的问题,高手进来帮助一下

snmhm1991 2010-12-28 04:19:14
我打算在自己自绘一个透明的按钮,用ico图标文件进行自绘。
重载了按钮类的DrawItem()函数,

CBitmap Bmp; //类中定义的
Bmp.LoadBitmapW(IDB_BITMAP1);

void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC* pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
CRect BtnRect=lpDrawItemStruct->rcItem;

//---------------------关于背景----------------------

CDC memDC;
memDC.CreateCompatibleDC(pDC);
memDC.SelectObject(Bmp);
pDC->BitBlt(0,0,BtnRect.Width(),BtnRect.Height(),&memDC,BtnRect.right,BtnRect.top,SRCCOPY);
//为什么在这里的BtnRect.right与BtnRect.top,不同的按钮取的值都是一样的?????
//而且都是0???


//---------------------------------------------------
::DrawIconEx(lpDrawItemStruct->hDC,0,0,AfxGetApp()->LoadIconW(NormalIcon),IconSize,IconSize,0,NULL,DI_NORMAL);
//在这一句绘制制一个ico的按钮,
}

第一个问题:

为什么在里面绘制了一个ico图标后但是背景不是透明的呢??????可以怎么解决呀????

第二个问题就是上面所问的了

请帮帮我
...全文
225 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2011-01-26
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖

相关规定详见界面界面版关于版主结帖工作的具体办法
snmhm1991 2010-12-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xianglitian 的回复:]

0,0就对了
因为是按钮自身的客户区坐标么
关于OnErasbkgnd
你不是已经有方法了么
返回true啊
[/Quote]


正如我上面的OnEraseBkgnd()对于它的实现原理我有点不清楚
向立天 2010-12-29
  • 打赏
  • 举报
回复
0,0就对了
因为是按钮自身的客户区坐标么
关于OnErasbkgnd
你不是已经有方法了么
返回true啊
fangchao918628 2010-12-29
  • 打赏
  • 举报
回复
snmhm1991 2010-12-29
  • 打赏
  • 举报
回复
嗯,是0,我看了一下其他的代码。怎么发现只要自己重载一个OnEraseBkgnd()函数并直接返回一个值而不是默认的值就可以解决ico图片背景为非透明的问题,但是在按钮中再次调用Invalidtae()函数,却无法擦除以前按钮的图片画一个新的图片(出现多重图片):

查资料后得知是因为默认的OnEraseBkgnd()函数设置了一个默认的白色背景画刷,那么可以用什么方式来这个背景画刷呢????

或者帮我解释下下面的问题:


BOOL CMyButton::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

if(m_Erase){
CRect clientRect;
GetClientRect(&clientRect);
int cx=clientRect.Width ();
int cy=clientRect.Height ();
// Store our orignal DC. //用来存储一个原本的DC,以便后面使用
CBitmap bitmap;
memDC.CreateCompatibleDC (pDC);
bitmap.CreateCompatibleBitmap (pDC,cx,cy);
memDC.SelectObject (&bitmap);
memDC.BitBlt (0,0,cx,cy,pDC,0,0,SRCCOPY);
m_Erase=false; //画窗口本身,只用得着使用一次
}
return true;
}

memDC.SelectObject (&bitmap);
memDC.BitBlt (0,0,cx,cy,pDC,0,0,SRCCOPY);
这两句,上面的给一兼容的CDC选择一个位图,但是下面的用memDC来进行绘制有什么作用???


这段代码是如何实现的使按钮的刷新背景为主背景而不是其他的颜色的呢???
求解释
向立天 2010-12-29
  • 打赏
  • 举报
回复
为什么在这里的BtnRect.right与BtnRect.top,不同的按钮取的值都是一样的?
------------------------------
值是多少?
0,0?
向立天 2010-12-29
  • 打赏
  • 举报
回复
OnEraseBkgnd没什么复杂的
在窗口重绘的时候先会通过OnEraseBkgnd将先前绘制的内容删除
然后再通过OnPaint函数绘制新的内容
问题是怎么删除
OnEraseBkgnd的机制就是用一种颜色把绘制区域填充一下
这个颜色就是我们通常所说的背景色
如果OnEraseBkgnd什么都不做
那么之前窗口中的内容就还会在那里
snmhm1991 2010-12-28
  • 打赏
  • 举报
回复
怎么没人呢???大家帮帮我吧
snmhm1991 2010-12-28
  • 打赏
  • 举报
回复
我看了下上面的附件。感觉上面的代码太多了,感到很迷茫,能不能告诉我解决这个问题的关键的思路???
我试过了用背景色去填充按钮,就如我上面的问题,可是老是背景的位置取不对,

去背景色的关键思路?????
Eleven 2010-12-28
  • 打赏
  • 举报
回复

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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