我的绘图都在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
如果你要通过PicCtrl绘图
就冲在CStatic在其OnPaint中完成
你这么用会有很多无法预知的问题
而且个人建议不要用CStatic控件做派生
最好通过自定义控件实现
你可以参考这两篇文章
http://blog.csdn.net/xianglitian/article/details/6075653
http://blog.csdn.net/xianglitian/article/details/6100767
#3
用双缓冲去绘图。
#4
你的这两篇太复杂了~看着我有点晕~
请问我贴的代码怎么改才能不出现问题呢?
#5
具体怎么搞~大神 求指点啊
#6
不用双缓冲 怎么搞
#7
MapMode用完之后要换回去(MM_TEXT)
#8
不要用Picturectrl
直接画dialog上
直接画dialog上
#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
如果你要通过PicCtrl绘图
就冲在CStatic在其OnPaint中完成
你这么用会有很多无法预知的问题
而且个人建议不要用CStatic控件做派生
最好通过自定义控件实现
你可以参考这两篇文章
http://blog.csdn.net/xianglitian/article/details/6075653
http://blog.csdn.net/xianglitian/article/details/6100767
#3
用双缓冲去绘图。
#4
你的这两篇太复杂了~看着我有点晕~
请问我贴的代码怎么改才能不出现问题呢?
#5
具体怎么搞~大神 求指点啊
#6
不用双缓冲 怎么搞
#7
MapMode用完之后要换回去(MM_TEXT)
#8
不要用Picturectrl
直接画dialog上
直接画dialog上
#9
大猫大神 具体怎么搞 我很笨的