【求助重绘问题】其他窗口移到我的对话框上时,对话框中的重绘控件花了

时间:2022-01-29 13:38:50
贴代码和症状!
我的绘图都在onpaint里面完成的,主要是在一个picture控件上绘图.

现在的问题是:例如一个像windows任务管理器的窗口移动到我的对话框上面的话(部分遮挡),对话框中的picture控件中的绘图就花了(其他控件没有花).但是,我的对话框在最小化、拖动、完全遮挡是没有问题的,请问各位大神们,怎么处理这样的问题啊!

if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}

{
//定义一个DC对象
CPaintDC dc(this->GetDlgItem(IDC_SHOWPOSITION));   
//定义一个矩形对象
CRect rect_ShowPosition;   
GetDlgItem(IDC_SHOWPOSITION)->GetWindowRect(&rect_ShowPosition);

//画背景
CBrush bgBrush(BLACK_BRUSH);
dc.SelectObject(bgBrush);
dc.Rectangle(0,0,rect_ShowPosition.Width(),rect_ShowPosition.Height());

//设置映射方式 使坐X轴正向为右 Y轴正向为上 1个逻辑单位为1个像素

dc.SetMapMode(MM_ISOTROPIC);
dc.SetWindowExt(rect_ShowPosition.right,rect_ShowPosition.bottom);   //逻辑单位
dc.SetViewportExt(rect_ShowPosition.right,-rect_ShowPosition.bottom);   //像素 Y 轴向上

//画完背景以后设置 原点为空间的中心 已方便绘制坐标系
dc.SetViewportOrg(rect_ShowPosition.Width()/2,rect_ShowPosition.Height()/2);


//画网格
CPen PenGreen(PS_SOLID,1,RGB(59,202,48));
dc.SelectObject(PenGreen);
//右边的竖线
for(int x=0;x<rect_ShowPosition.Width()/2;x+=5)
{
dc.MoveTo(x,-rect_ShowPosition.Height()/2);
dc.LineTo(x,rect_ShowPosition.Height()/2);
}
//左边的竖线
for(x=0;x>-rect_ShowPosition.Width()/2;x-=5)
{
dc.MoveTo(x,-rect_ShowPosition.Height()/2);
dc.LineTo(x,rect_ShowPosition.Height()/2);
}
//上边的横线
for(int y=0;y<rect_ShowPosition.Height()/2;y+=5)
{
dc.MoveTo(-rect_ShowPosition.Width()/2,y);
dc.LineTo(rect_ShowPosition.Width()/2,y);
}
//下边的横线
for(y=0;y>-rect_ShowPosition.Height()/2;y-=5)
{
dc.MoveTo(rect_ShowPosition.Width()/2,y);
dc.LineTo(-rect_ShowPosition.Width()/2,y);
}



//画出坐标系
CPen PenBlue(PS_SOLID,2,RGB(255,255,255));
dc.SelectObject(PenBlue);
//画X轴
dc.MoveTo(-rect_ShowPosition.Width()/2,0);
dc.LineTo(rect_ShowPosition.Width()/2,0);
//画Y轴
dc.MoveTo(0,-rect_ShowPosition.Height()/2);
dc.LineTo(0,rect_ShowPosition.Height()/2);
//x,y,o
dc.SetTextColor(RGB(255,255,255));
dc.SetBkMode(TRANSPARENT);
dc.TextOut(rect_ShowPosition.Width()/2-10,20,"x");
dc.TextOut(5,rect_ShowPosition.Height()/2,"y");
dc.TextOut(5,0,"O");
//原点
CBrush originPoint(RGB(255,255,255));
dc.SelectObject(originPoint);
dc.Ellipse(0-3,0+3,0+3,0-3);   

9 个解决方案

#1


用TRACE输出运行过程,看下当被覆盖时是否有使控件invalidate

#2


哪有这么用的
如果你要通过PicCtrl绘图
就冲在CStatic在其OnPaint中完成
你这么用会有很多无法预知的问题
而且个人建议不要用CStatic控件做派生
最好通过自定义控件实现
你可以参考这两篇文章
http://blog.csdn.net/xianglitian/article/details/6075653
http://blog.csdn.net/xianglitian/article/details/6100767

#3


用双缓冲去绘图。

#4


引用 2 楼 xianglitian 的回复:
哪有这么用的
如果你要通过PicCtrl绘图
就冲在CStatic在其OnPaint中完成
你这么用会有很多无法预知的问题
而且个人建议不要用CStatic控件做派生
最好通过自定义控件实现
你可以参考这两篇文章
http://blog.csdn.net/xianglitian/article/details/6075653
http://blog.csdn.net/xiangli……


你的这两篇太复杂了~看着我有点晕~
请问我贴的代码怎么改才能不出现问题呢?

#5


引用 1 楼 gold_water 的回复:
用TRACE输出运行过程,看下当被覆盖时是否有使控件invalidate


具体怎么搞~大神 求指点啊

#6


引用 3 楼 zq282502532 的回复:
用双缓冲去绘图。


不用双缓冲 怎么搞

#7


MapMode用完之后要换回去(MM_TEXT)

#8


不要用Picturectrl
直接画dialog上

#9


引用 7 楼 shunruo 的回复:
MapMode用完之后要换回去(MM_TEXT)



大猫大神 具体怎么搞 我很笨的

#1


用TRACE输出运行过程,看下当被覆盖时是否有使控件invalidate

#2


哪有这么用的
如果你要通过PicCtrl绘图
就冲在CStatic在其OnPaint中完成
你这么用会有很多无法预知的问题
而且个人建议不要用CStatic控件做派生
最好通过自定义控件实现
你可以参考这两篇文章
http://blog.csdn.net/xianglitian/article/details/6075653
http://blog.csdn.net/xianglitian/article/details/6100767

#3


用双缓冲去绘图。

#4


引用 2 楼 xianglitian 的回复:
哪有这么用的
如果你要通过PicCtrl绘图
就冲在CStatic在其OnPaint中完成
你这么用会有很多无法预知的问题
而且个人建议不要用CStatic控件做派生
最好通过自定义控件实现
你可以参考这两篇文章
http://blog.csdn.net/xianglitian/article/details/6075653
http://blog.csdn.net/xiangli……


你的这两篇太复杂了~看着我有点晕~
请问我贴的代码怎么改才能不出现问题呢?

#5


引用 1 楼 gold_water 的回复:
用TRACE输出运行过程,看下当被覆盖时是否有使控件invalidate


具体怎么搞~大神 求指点啊

#6


引用 3 楼 zq282502532 的回复:
用双缓冲去绘图。


不用双缓冲 怎么搞

#7


MapMode用完之后要换回去(MM_TEXT)

#8


不要用Picturectrl
直接画dialog上

#9


引用 7 楼 shunruo 的回复:
MapMode用完之后要换回去(MM_TEXT)



大猫大神 具体怎么搞 我很笨的