对话框背景重绘!

时间:2022-12-16 14:36:48
对话框背景重绘!
如图,我在OnEraseBkgnd里贴图
BOOL CXue_char::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CBitmap bitmap;
bitmap.LoadBitmapA(IDB_BTM_ABC);
BITMAP bmp;
bitmap.GetBitmap(&bmp);
CDC dccompatible;
dccompatible.CreateCompatibleDC(pDC);
dccompatible.SelectObject(&bitmap);
CRect rect;
GetClientRect(&rect);
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dccompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
return true;
//return CDialogEx::OnEraseBkgnd(pDC);
}

但是显示的结果,是会明显看到第1次显示一个小一点的图片,然后在显示拉伸后的图片,切换到别的界面,然后在切换回来就可以正常显示了,可以看的出来明显是切换使窗口重绘了,但是我想问的是对话框的背景图片重绘,在哪实现呢?

22 个解决方案

#1


代码搬到OnPaint中

#2


引用 1 楼 schlafenhamster 的回复:
代码搬到OnPaint中

搬了,貌似不行啊

#3


你对话框是放什么里面?view里面吗?很有可能是对话框父窗口onsize 前画了一次,onsize之后又画了一次,两次用getclientrect获得的尺寸不同。

#4


引用 3 楼 zzdmfk 的回复:
你对话框是放什么里面?view里面吗?很有可能是对话框父窗口onsize 前画了一次,onsize之后又画了一次,两次用getclientrect获得的尺寸不同。

在父类什么都没干啊,ONsize什么都没干啊,我还有其他的对话框,也是同样的代码,但是其他的对话框实现很正常,只有这个有问题,对话框里也没什么设置了啊

#5


lz的代码基本应该没有问题,红色的位置加入相关代码试试

BOOL CXue_char::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CBitmap bitmap;
bitmap.LoadBitmapA(IDB_BTM_ABC);
BITMAP bmp;
bitmap.GetBitmap(&bmp);
CDC dccompatible;
dccompatible.CreateCompatibleDC(pDC);
dccompatible.SelectObject(&bitmap);
CRect rect;
GetClientRect(&rect);
//CreateRectRgn 创建和窗口一样大的区域
//将创建的区域选入pDC

pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dccompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
//恢复区域
//删除创建的区域


return true;
//return CDialogEx::OnEraseBkgnd(pDC);
}

#6


引用 5 楼 worldy 的回复:
lz的代码基本应该没有问题,红色的位置加入相关代码试试

BOOL CXue_char::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CBitmap bitmap;
bitmap.LoadBitmapA(IDB_BTM_ABC);
BITMAP bmp;
bitmap.GetBitmap(&bmp);
CDC dccompatible;
dccompatible.CreateCompatibleDC(pDC);
dccompatible.SelectObject(&bitmap);
CRect rect;
GetClientRect(&rect);
//CreateRectRgn 创建和窗口一样大的区域
//将创建的区域选入pDC

pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dccompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
//恢复区域
//删除创建的区域


return true;
//return CDialogEx::OnEraseBkgnd(pDC);
}

CRect rect;
GetClientRect(&rect);我就是用这句话获取到的VIEW的矩形区域
后面用StretchBlt函数将图片放在这个矩形区域里的,我还有其他的几个对话框,都是用的一样的代码,就这个显示不正常,很奇怪,这个对话框里面什么重绘的都没写过,是不是要手动加一个,重绘下窗口?

#7


5L不是告诉你要按红色的提示,添加几条代码了吗?你按提示把相关代码添加进去

因为绘画背景的时候,pDC的裁剪区应该只有需要重绘的部分,不是整个窗口,因此应该将整个裁剪区扩大,否则,你StretchBlt过去的原来已经有的部分,被裁剪掉了

#8


对话框背景重绘!

#9


学习了,帮顶。求分。谢谢。

#10


引用 7 楼 worldy 的回复:
5L不是告诉你要按红色的提示,添加几条代码了吗?你按提示把相关代码添加进去

因为绘画背景的时候,pDC的裁剪区应该只有需要重绘的部分,不是整个窗口,因此应该将整个裁剪区扩大,否则,你StretchBlt过去的原来已经有的部分,被裁剪掉了

刚才试了下,到时第1次打开的时候确实是完整的一个了,但是下一页时,图片还会在显示一次大点的,而且,发音按钮,音标和单词的STATIC控件显示都不正常

#11


怎么个不正常法?

#12


引用 11 楼 worldy 的回复:
怎么个不正常法?

变成这样 对话框背景重绘!
点击下一页之后
对话框背景重绘!

控件显示的不正常了,图片还是绘制了2次,第1次小一点,虽然是全了,第2次更大点

#13


pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dccompatible,0,0,bmp.bmWidth,bmp.bmHeight, SRCCOPY);

如果 要 合成 就不能 用 SRCCOPY

#14


引用 4 楼 u010094317 的回复:
Quote: 引用 3 楼 zzdmfk 的回复:

你对话框是放什么里面?view里面吗?很有可能是对话框父窗口onsize 前画了一次,onsize之后又画了一次,两次用getclientrect获得的尺寸不同。

在父类什么都没干啊,ONsize什么都没干啊,我还有其他的对话框,也是同样的代码,但是其他的对话框实现很正常,只有这个有问题,对话框里也没什么设置了啊

不是说你做了什么,是view在显示的过程中会调用onsize几次,会引起onerasebkgnd.

#15


引用 14 楼 zzdmfk 的回复:
Quote: 引用 4 楼 u010094317 的回复:

Quote: 引用 3 楼 zzdmfk 的回复:

你对话框是放什么里面?view里面吗?很有可能是对话框父窗口onsize 前画了一次,onsize之后又画了一次,两次用getclientrect获得的尺寸不同。

在父类什么都没干啊,ONsize什么都没干啊,我还有其他的对话框,也是同样的代码,但是其他的对话框实现很正常,只有这个有问题,对话框里也没什么设置了啊

不是说你做了什么,是view在显示的过程中会调用onsize几次,会引起onerasebkgnd.

你可以试试:


如图,我在OnEraseBkgnd里贴图
BOOL CXue_char::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
static BOOL bfirst=TRUE;
if(bfirst)
{
bfirst=false;
}else{
CBitmap bitmap;
bitmap.LoadBitmapA(IDB_BTM_ABC);
BITMAP bmp;
bitmap.GetBitmap(&bmp);
CDC dccompatible;
dccompatible.CreateCompatibleDC(pDC);
dccompatible.SelectObject(&bitmap);
CRect rect;
GetClientRect(&rect);
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dccompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
}
return true;
//return CDialogEx::OnEraseBkgnd(pDC);
}
但是显示的结果,是会明显看到第1次显示一个小一点的图片,然后在显示拉伸后的图片,切换到别的界面,然后在切换回来就可以正常显示了,可以看的出来明显是切换使窗口重绘了,但是我想问的是对话框的背景图片重绘,在哪实现呢?

#16


为什么
static BOOL bfirst=TRUE;
if(bfirst)
{
bfirst=false;
}

#17


OnEraseBkgnd(pDC);里永远是return true;
一切都在OnPaint里完成

#18


引用 16 楼 schlafenhamster 的回复:
为什么
static BOOL bfirst=TRUE;
if(bfirst)
{
bfirst=false;
}
就是onsize引起的第一次擦除不画图。

#19


您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法

#20


对话框背景重绘!发给我看看.

#21


onpaint里可直接实现整张图的替换

#22


OnEraseBkgnd直接return TRUE,OnPaint/OnDraw()中绘图

#1


代码搬到OnPaint中

#2


引用 1 楼 schlafenhamster 的回复:
代码搬到OnPaint中

搬了,貌似不行啊

#3


你对话框是放什么里面?view里面吗?很有可能是对话框父窗口onsize 前画了一次,onsize之后又画了一次,两次用getclientrect获得的尺寸不同。

#4


引用 3 楼 zzdmfk 的回复:
你对话框是放什么里面?view里面吗?很有可能是对话框父窗口onsize 前画了一次,onsize之后又画了一次,两次用getclientrect获得的尺寸不同。

在父类什么都没干啊,ONsize什么都没干啊,我还有其他的对话框,也是同样的代码,但是其他的对话框实现很正常,只有这个有问题,对话框里也没什么设置了啊

#5


lz的代码基本应该没有问题,红色的位置加入相关代码试试

BOOL CXue_char::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CBitmap bitmap;
bitmap.LoadBitmapA(IDB_BTM_ABC);
BITMAP bmp;
bitmap.GetBitmap(&bmp);
CDC dccompatible;
dccompatible.CreateCompatibleDC(pDC);
dccompatible.SelectObject(&bitmap);
CRect rect;
GetClientRect(&rect);
//CreateRectRgn 创建和窗口一样大的区域
//将创建的区域选入pDC

pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dccompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
//恢复区域
//删除创建的区域


return true;
//return CDialogEx::OnEraseBkgnd(pDC);
}

#6


引用 5 楼 worldy 的回复:
lz的代码基本应该没有问题,红色的位置加入相关代码试试

BOOL CXue_char::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CBitmap bitmap;
bitmap.LoadBitmapA(IDB_BTM_ABC);
BITMAP bmp;
bitmap.GetBitmap(&bmp);
CDC dccompatible;
dccompatible.CreateCompatibleDC(pDC);
dccompatible.SelectObject(&bitmap);
CRect rect;
GetClientRect(&rect);
//CreateRectRgn 创建和窗口一样大的区域
//将创建的区域选入pDC

pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dccompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
//恢复区域
//删除创建的区域


return true;
//return CDialogEx::OnEraseBkgnd(pDC);
}

CRect rect;
GetClientRect(&rect);我就是用这句话获取到的VIEW的矩形区域
后面用StretchBlt函数将图片放在这个矩形区域里的,我还有其他的几个对话框,都是用的一样的代码,就这个显示不正常,很奇怪,这个对话框里面什么重绘的都没写过,是不是要手动加一个,重绘下窗口?

#7


5L不是告诉你要按红色的提示,添加几条代码了吗?你按提示把相关代码添加进去

因为绘画背景的时候,pDC的裁剪区应该只有需要重绘的部分,不是整个窗口,因此应该将整个裁剪区扩大,否则,你StretchBlt过去的原来已经有的部分,被裁剪掉了

#8


对话框背景重绘!

#9


学习了,帮顶。求分。谢谢。

#10


引用 7 楼 worldy 的回复:
5L不是告诉你要按红色的提示,添加几条代码了吗?你按提示把相关代码添加进去

因为绘画背景的时候,pDC的裁剪区应该只有需要重绘的部分,不是整个窗口,因此应该将整个裁剪区扩大,否则,你StretchBlt过去的原来已经有的部分,被裁剪掉了

刚才试了下,到时第1次打开的时候确实是完整的一个了,但是下一页时,图片还会在显示一次大点的,而且,发音按钮,音标和单词的STATIC控件显示都不正常

#11


怎么个不正常法?

#12


引用 11 楼 worldy 的回复:
怎么个不正常法?

变成这样 对话框背景重绘!
点击下一页之后
对话框背景重绘!

控件显示的不正常了,图片还是绘制了2次,第1次小一点,虽然是全了,第2次更大点

#13


pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dccompatible,0,0,bmp.bmWidth,bmp.bmHeight, SRCCOPY);

如果 要 合成 就不能 用 SRCCOPY

#14


引用 4 楼 u010094317 的回复:
Quote: 引用 3 楼 zzdmfk 的回复:

你对话框是放什么里面?view里面吗?很有可能是对话框父窗口onsize 前画了一次,onsize之后又画了一次,两次用getclientrect获得的尺寸不同。

在父类什么都没干啊,ONsize什么都没干啊,我还有其他的对话框,也是同样的代码,但是其他的对话框实现很正常,只有这个有问题,对话框里也没什么设置了啊

不是说你做了什么,是view在显示的过程中会调用onsize几次,会引起onerasebkgnd.

#15


引用 14 楼 zzdmfk 的回复:
Quote: 引用 4 楼 u010094317 的回复:

Quote: 引用 3 楼 zzdmfk 的回复:

你对话框是放什么里面?view里面吗?很有可能是对话框父窗口onsize 前画了一次,onsize之后又画了一次,两次用getclientrect获得的尺寸不同。

在父类什么都没干啊,ONsize什么都没干啊,我还有其他的对话框,也是同样的代码,但是其他的对话框实现很正常,只有这个有问题,对话框里也没什么设置了啊

不是说你做了什么,是view在显示的过程中会调用onsize几次,会引起onerasebkgnd.

你可以试试:


如图,我在OnEraseBkgnd里贴图
BOOL CXue_char::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
static BOOL bfirst=TRUE;
if(bfirst)
{
bfirst=false;
}else{
CBitmap bitmap;
bitmap.LoadBitmapA(IDB_BTM_ABC);
BITMAP bmp;
bitmap.GetBitmap(&bmp);
CDC dccompatible;
dccompatible.CreateCompatibleDC(pDC);
dccompatible.SelectObject(&bitmap);
CRect rect;
GetClientRect(&rect);
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dccompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
}
return true;
//return CDialogEx::OnEraseBkgnd(pDC);
}
但是显示的结果,是会明显看到第1次显示一个小一点的图片,然后在显示拉伸后的图片,切换到别的界面,然后在切换回来就可以正常显示了,可以看的出来明显是切换使窗口重绘了,但是我想问的是对话框的背景图片重绘,在哪实现呢?

#16


为什么
static BOOL bfirst=TRUE;
if(bfirst)
{
bfirst=false;
}

#17


OnEraseBkgnd(pDC);里永远是return true;
一切都在OnPaint里完成

#18


引用 16 楼 schlafenhamster 的回复:
为什么
static BOOL bfirst=TRUE;
if(bfirst)
{
bfirst=false;
}
就是onsize引起的第一次擦除不画图。

#19


您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法

#20


对话框背景重绘!发给我看看.

#21


onpaint里可直接实现整张图的替换

#22


OnEraseBkgnd直接return TRUE,OnPaint/OnDraw()中绘图