mfc中CClientDC类绘图,窗口缩放图像消失的问题

2025-11-21 05:41:24

1、当然如果直接在Ondraw中画的,改变窗口大小时会调用OnDraw函数,也就是对画面进行重绘(调整画面得大小,或别其他窗口覆盖)时,不会出现这种情况;但是如果是在按钮的消息响应函数里边,进行缩放时不会重绘,图像会立刻消失。所以绘图操作还是必须放在Ondraw中或者Onpaint中的。

mfc中CClientDC类绘图,窗口缩放图像消失的问题

2、如果一定要让按钮控制绘图操作,那么可以设置一个bool变量,当bool=true时执行ondraw函数,否则不执行就可以了。需要注意的是将图形进行缩放变换时,要先调用Invalidate()函数使窗口无效来清除窗口,将保存的图形信息修改之后再调用OnDraw()函数进行重绘。

mfc中CClientDC类绘图,窗口缩放图像消失的问题

3、好多需要用菜单按钮控制绘图的操作都可以采用这种方法,可以设置多个选项来响应,使用多个变量值(枚举类型)控制哪种绘图操作即可。

4、具体实例部分代码如下:

先声明 bool flag;

然后在构造函数中初始化 flag=FALSE;

void Cmfc_menu_yyView::Onpushbutton()

{

flag=TRUE;

Invalidate();  //更新

}

void Cmfc_menu_yyView::OnDraw(CDC* pDC)

{

Cmfc_menu_yyDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

if (!pDoc)

return;

if(flag)

{

CRect rect;

GetClientRect(&rect);

CDC MemDC; //首先定义一个显示设备对象

CBitmap MemBitmap;//定义一个位图对象

//随后建立与屏幕显示兼容的内存显示设备

MemDC.CreateCompatibleDC(NULL);

//这时还不能绘图,因为没有地方画 ^_^

//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小

MemBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);

//将位图选入到内存显示设备中

//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上

CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);

//先用背景色将位图清除干净,这里我用的是白色作为背景

//你也可以用自己应该用的颜色

MemDC.FillSolidRect(0,0,rect.Width(),rect.Height(),RGB(255,255,255));

//绘图

for(i=0;i<nx;i++)

for (j=0;j<nz;j++)

{

MemDC.SetPixel(i,j,RGB(250*vel[i][j]/vel_max,0,0));

}

//将内存中的图拷贝到屏幕上进行显示

pDC->BitBlt(0,0,rect.right,rect.bottom,&MemDC,0,0,SRCCOPY);

//绘图完成后的清理

MemBitmap.DeleteObject();

MemDC.DeleteDC();

}

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢