关于MFC背景BMP图上控件更新问题

CodeInfo_ 2012-09-21 05:04:46
我是在Static对话框内显示了一张载入资源的BMP背景图,图分成左右两边 ,上面右边放着放着一些TAB标签控件和按钮,在按下按钮后会在背景图的左边显示一个非态对话框。
发现问题是,刚开始时,背景图右边的控件完全在图的上面,正常。
但一按下按钮在图的左边产生非模态对话框时,背景图右边的控件就都被背景图给覆盖了,鼠标移动到被覆盖的控件位置上电机,被覆盖的控件才会显示出来!!

我的理解是在产生这个非模态对话框时,焦点移动到了这个新产生的对话框,窗口重绘。将没有获得焦点的控件全覆盖了?????是否是这样呢??


该函数在Onpaint()中
else
{
CDialog::OnPaint();//如果注释掉这句,那么一开始,全部控件都被覆盖了!

//静态框窗口
CWnd *pWnd = GetDlgItem(IDC_STATIC_Bitmap);
if(pWnd && pWnd->GetSafeHwnd())
{
//客户区大小
CRect rcClient;
pWnd->GetClientRect(rcClient);

//DC句柄
CDC *pDC = pWnd->GetDC();

//兼容内存DC
CDC memDC;
memDC.CreateCompatibleDC(pDC);

//加载位图
CBitmap memBitmap;
memBitmap.LoadBitmap(IDB_BITMAP2);

//获取位图信息
BITMAP bmpInfo;
memBitmap.GetBitmap(&bmpInfo);

//位图选人内存DC
CBitmap *pOldBitmap = memDC.SelectObject(&memBitmap);

//半色调 避免缩放颜色失真
int iStretchBltMode = pDC->SetStretchBltMode(HALFTONE);

//贴图到目标DC
pDC->StretchBlt(rcClient.left,rcClient.top, rcClient.Width(), rcClient.Height(),
&memDC,
0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight,
SRCCOPY);

//恢复模式
pDC->SetStretchBltMode(iStretchBltMode);

//结束清理
memDC.SelectObject(pOldBitmap);
memDC.DeleteDC();
memBitmap.DeleteObject();
pWnd->ReleaseDC(pDC);
}
}
}
...全文
136 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
CodeInfo_ 2012-09-22
  • 打赏
  • 举报
回复
好的,谢谢啊[Quote=引用 8 楼 的回复:]
有一定概率不透明是什么意思?我现在是可以达到目的的,是不是我不改动任何东西,会有一天它又突然不透明了?

你在不同的背景上面移动下就知道效果了。实践出真知啊
[/Quote]
傻X 2012-09-22
  • 打赏
  • 举报
回复
有一定概率不透明是什么意思?我现在是可以达到目的的,是不是我不改动任何东西,会有一天它又突然不透明了?

你在不同的背景上面移动下就知道效果了。实践出真知啊
CodeInfo_ 2012-09-22
  • 打赏
  • 举报
回复
呃。。。那有背景图时,怎么又显示出控件了?不是透明了吗?[Quote=引用 6 楼 的回复:]
引用 4 楼 的回复:
就是对话框没有背景???

引用 2 楼 的回复:
引用 1 楼 的回复:
本人已经找到解决的方法了,想问问对话框中“透明”这个选项是干嘛的?是这个控件的底色透明吗?那为什么连该控件上面黑色的字体都会不见呢?

对话框背景透明,点一下任务栏的程序让它得到焦点就可见了。

对话框窗体透明
[/Quote]
qlizhang 2012-09-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
就是对话框没有背景???

引用 2 楼 的回复:
引用 1 楼 的回复:
本人已经找到解决的方法了,想问问对话框中“透明”这个选项是干嘛的?是这个控件的底色透明吗?那为什么连该控件上面黑色的字体都会不见呢?

对话框背景透明,点一下任务栏的程序让它得到焦点就可见了。
[/Quote]
对话框窗体透明
CodeInfo_ 2012-09-21
  • 打赏
  • 举报
回复
有一定概率不透明是什么意思?我现在是可以达到目的的,是不是我不改动任何东西,会有一天它又突然不透明了?[Quote=引用 3 楼 的回复:]
这个属性是代表透明,但是效果不是很理想。控件可能不透明,有一定概率不透明。
你使用过就知道了。

不建议使用,真正的透明用
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
组合
SetLayeredWindowAttributes……
[/Quote]
CodeInfo_ 2012-09-21
  • 打赏
  • 举报
回复
就是对话框没有背景???[Quote=引用 2 楼 的回复:]
引用 1 楼 的回复:
本人已经找到解决的方法了,想问问对话框中“透明”这个选项是干嘛的?是这个控件的底色透明吗?那为什么连该控件上面黑色的字体都会不见呢?

对话框背景透明,点一下任务栏的程序让它得到焦点就可见了。
[/Quote]
傻X 2012-09-21
  • 打赏
  • 举报
回复
这个属性是代表透明,但是效果不是很理想。控件可能不透明,有一定概率不透明。
你使用过就知道了。

不建议使用,真正的透明用
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
组合
SetLayeredWindowAttributes

实现
qlizhang 2012-09-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
本人已经找到解决的方法了,想问问对话框中“透明”这个选项是干嘛的?是这个控件的底色透明吗?那为什么连该控件上面黑色的字体都会不见呢?
[/Quote]
对话框背景透明,点一下任务栏的程序让它得到焦点就可见了。
CodeInfo_ 2012-09-21
  • 打赏
  • 举报
回复
本人已经找到解决的方法了,想问问对话框中“透明”这个选项是干嘛的?是这个控件的底色透明吗?那为什么连该控件上面黑色的字体都会不见呢?

15,979

社区成员

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

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