有关CButtonST的一个问题

funnymfc 2009-06-19 01:59:14
程序有几个透明button,下面是EraseBkgnd。

BOOL CbtnDlg::OnEraseBkgnd(CDC* pDC)
{
if(m_bmp.GetSafeHandle() && m_nType)
{
CRect rect;
GetClientRect(rect);

CDC bgDC;
bgDC.CreateCompatibleDC(NULL);
bgDC.SelectObject(&m_bmp);

BITMAP bmp;
m_bmp.GetBitmap(&bmp);
int nWidth = bmp.bmWidth;
int nHeight = bmp.bmHeight;

switch(m_nType)
{
case BITMAP_CENTER:
CbtnDlg::OnEraseBkgnd(pDC);
BITMAP bmp;
m_bmp.GetBitmap (&bmp);
pDC->BitBlt ((rect.Width() - bmp.bmWidth) / 2, (rect.Height() - bmp.bmHeight) / 2, bmp.bmWidth, bmp.bmHeight, &bgDC, 0, 0, SRCCOPY);
return TRUE;
case BITMAP_STRETCH:
pDC->SetStretchBltMode(HALFTONE);
pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &bgDC, 0, 0, nWidth, nHeight, SRCCOPY);
m_checkbox1.SetBk(pDC);
m_checkbox2.SetBk(pDC);
m_checkbox3.SetBk(pDC);
return TRUE;
default:
CBrush bgBrush(&m_bmp);
pDC->FillRect(rect,&bgBrush);
return TRUE;
}
}
else
CbtnDlg::OnEraseBkgnd(pDC);

return TRUE; //Let's get rid of flickering
}


在xp下面正常显示是这样的:

但是在Vista下面,把光标移到按钮上面的时候会变黑:

解决办法是把
m_checkbox1.SetBk(pDC);
m_checkbox2.SetBk(pDC);
m_checkbox3.SetBk(pDC);这三行注释掉。但是又带来一个新的问题:
在xp下面如果有一个前端窗口(比如把任务管理器设置成最顶端)已经启动,再启动我的这个程序,会发现按钮被覆盖了:

请问这个问题如何解决?
...全文
66 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
funnymfc 2009-06-20
  • 打赏
  • 举报
回复
解决了,办法是在一楼代码:
m_checkbox1.SetBk(pDC);
m_checkbox2.SetBk(pDC);
m_checkbox3.SetBk(pDC);
后追加:
m_checkbox1.SetIcon(IDI_ON, IDI_OFF);
m_checkbox1.DrawTransparent();
m_checkbox2.SetIcon(IDI_ON, IDI_OFF);
m_checkbox2.DrawTransparent();
m_checkbox3.SetIcon(IDI_ON, IDI_OFF);
m_checkbox3.DrawTransparent();
而不是放在OnInitDialog中
funnymfc 2009-06-19
  • 打赏
  • 举报
回复
还发现了一个问题,把Vista主题调成经典主题就不存在"光标移到按钮上面的时候会变黑"的情况.
weidong0210 2009-06-19
  • 打赏
  • 举报
回复
up
funnymfc 2009-06-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 chris820313 的回复:]
放在OnPaint会报错,因为OnPaint里面没有定义pDC。

Orz......
CDC *pDC=this->GetDC();
这不就行了……
[/Quote]
这个还是没有解决前端窗口覆盖透明按钮的问题,
在xp下面如果有一个前端窗口(比如把任务管理器设置成最顶端)已经启动,再启动我的这个程序,会发现按钮被覆盖了:

funnymfc 2009-06-19
  • 打赏
  • 举报
回复
现在XP下面也有问题了:

都成黑色了。
源代码:
http://d.namipan.com/downfile/btn.rar/2f27a240ab07e9895741a9073be06fd86e3f54e576e81600
有兴趣的朋友可以帮忙看看。解决再加分!
Eleven 2009-06-19
  • 打赏
  • 举报
回复
路过,看看
  • 打赏
  • 举报
回复
放在OnPaint会报错,因为OnPaint里面没有定义pDC。

Orz......
CDC *pDC=this->GetDC();
这不就行了……
funnymfc 2009-06-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 DavidHsing 的回复:]
把你的代码移到 OnPaint 里面看看
[/Quote]
m_checkbox1.SetBk(pDC); 放在OnPaint会报错,因为OnPaint里面没有定义pDC。
我的想法是在设置背景图的时候把按钮背景色弄成跟背景图一样。所以放在OnEraseBkgnd里。
beyonld 2009-06-19
  • 打赏
  • 举报
回复
关注
j8daxue 2009-06-19
  • 打赏
  • 举报
回复
CButtonST那个透明效果是基于他自己设计的对话框,CTransparetnDlg.源码里面有
DavidHsing 2009-06-19
  • 打赏
  • 举报
回复
把你的代码移到 OnPaint 里面看看
funnymfc 2009-06-19
  • 打赏
  • 举报
回复
源代码下载:
http://d.namipan.com/downfile/btn.rar/5f57805c469d5033e705ceac581bf84b9b0d047686bf0100
是VC2008工程,装了Vista和VS2008的朋友如果有兴趣可以帮忙看看。

16,472

社区成员

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

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

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