如图,我在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
搬了,貌似不行啊
#3
你对话框是放什么里面?view里面吗?很有可能是对话框父窗口onsize 前画了一次,onsize之后又画了一次,两次用getclientrect获得的尺寸不同。
#4
在父类什么都没干啊,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);
}
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
CRect rect;
GetClientRect(&rect);我就是用这句话获取到的VIEW的矩形区域
后面用StretchBlt函数将图片放在这个矩形区域里的,我还有其他的几个对话框,都是用的一样的代码,就这个显示不正常,很奇怪,这个对话框里面什么重绘的都没写过,是不是要手动加一个,重绘下窗口?
#7
5L不是告诉你要按红色的提示,添加几条代码了吗?你按提示把相关代码添加进去
因为绘画背景的时候,pDC的裁剪区应该只有需要重绘的部分,不是整个窗口,因此应该将整个裁剪区扩大,否则,你StretchBlt过去的原来已经有的部分,被裁剪掉了
因为绘画背景的时候,pDC的裁剪区应该只有需要重绘的部分,不是整个窗口,因此应该将整个裁剪区扩大,否则,你StretchBlt过去的原来已经有的部分,被裁剪掉了
#8
#9
学习了,帮顶。求分。谢谢。
#10
刚才试了下,到时第1次打开的时候确实是完整的一个了,但是下一页时,图片还会在显示一次大点的,而且,发音按钮,音标和单词的STATIC控件显示都不正常
#11
怎么个不正常法?
#12
变成这样
点击下一页之后
控件显示的不正常了,图片还是绘制了2次,第1次小一点,虽然是全了,第2次更大点
#13
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dccompatible,0,0,bmp.bmWidth,bmp.bmHeight,
SRCCOPY);
如果 要 合成 就不能 用 SRCCOPY
如果 要 合成 就不能 用 SRCCOPY
#14
不是说你做了什么,是view在显示的过程中会调用onsize几次,会引起onerasebkgnd.
#15
你对话框是放什么里面?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;
}
?
static BOOL bfirst=TRUE;
if(bfirst)
{
bfirst=false;
}
?
#17
OnEraseBkgnd(pDC);里永远是return true;
一切都在OnPaint里完成
一切都在OnPaint里完成
#18
为什么
static BOOL bfirst=TRUE;
if(bfirst)
{
bfirst=false;
}
?
#19
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知
见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知
见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法
#20
发给我看看.
#21
onpaint里可直接实现整张图的替换
#22
OnEraseBkgnd直接return TRUE,OnPaint/OnDraw()中绘图
#1
代码搬到OnPaint中
#2
代码搬到OnPaint中
搬了,貌似不行啊
#3
你对话框是放什么里面?view里面吗?很有可能是对话框父窗口onsize 前画了一次,onsize之后又画了一次,两次用getclientrect获得的尺寸不同。
#4
你对话框是放什么里面?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);
}
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
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过去的原来已经有的部分,被裁剪掉了
因为绘画背景的时候,pDC的裁剪区应该只有需要重绘的部分,不是整个窗口,因此应该将整个裁剪区扩大,否则,你StretchBlt过去的原来已经有的部分,被裁剪掉了
#8
#9
学习了,帮顶。求分。谢谢。
#10
5L不是告诉你要按红色的提示,添加几条代码了吗?你按提示把相关代码添加进去
因为绘画背景的时候,pDC的裁剪区应该只有需要重绘的部分,不是整个窗口,因此应该将整个裁剪区扩大,否则,你StretchBlt过去的原来已经有的部分,被裁剪掉了
刚才试了下,到时第1次打开的时候确实是完整的一个了,但是下一页时,图片还会在显示一次大点的,而且,发音按钮,音标和单词的STATIC控件显示都不正常
#11
怎么个不正常法?
#12
怎么个不正常法?
变成这样
点击下一页之后
控件显示的不正常了,图片还是绘制了2次,第1次小一点,虽然是全了,第2次更大点
#13
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dccompatible,0,0,bmp.bmWidth,bmp.bmHeight,
SRCCOPY);
如果 要 合成 就不能 用 SRCCOPY
如果 要 合成 就不能 用 SRCCOPY
#14
你对话框是放什么里面?view里面吗?很有可能是对话框父窗口onsize 前画了一次,onsize之后又画了一次,两次用getclientrect获得的尺寸不同。
在父类什么都没干啊,ONsize什么都没干啊,我还有其他的对话框,也是同样的代码,但是其他的对话框实现很正常,只有这个有问题,对话框里也没什么设置了啊
不是说你做了什么,是view在显示的过程中会调用onsize几次,会引起onerasebkgnd.
#15
你对话框是放什么里面?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;
}
?
static BOOL bfirst=TRUE;
if(bfirst)
{
bfirst=false;
}
?
#17
OnEraseBkgnd(pDC);里永远是return true;
一切都在OnPaint里完成
一切都在OnPaint里完成
#18
为什么
static BOOL bfirst=TRUE;
if(bfirst)
{
bfirst=false;
}
?
#19
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知
见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知
见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法
#20
发给我看看.
#21
onpaint里可直接实现整张图的替换
#22
OnEraseBkgnd直接return TRUE,OnPaint/OnDraw()中绘图