,GetClientRect获取的区域绘制时偏离了绘制区域,什么原因?详情如下:请帮忙分析一下

在线等,GetClientRect获取的区域绘制时偏离了绘制区域,什么原因?详情如下:请帮忙分析一下
本帖最后由 VisualEleven 于 2014-08-14 09:38:48 编辑
具体情况如下:
我在对话框上通过静态文本控件绑定了一个视图类,然后通过视图类的OnDraw在上面绘制图形,但是绘制图形时偏离GetClientRect()获取的指定区域,调用OnDraw之前,会调用OnInitalUpdate来初始化视图的大小,代码如下:
CSize sizeTotal;
//sizeTotal.cx = sizeTotal.cy = 100;
sizeTotal.cx = 563;
sizeTotal.cy = 437;
        SetScrollSizes(MM_TEXT,sizeTotal);

初始化完了之后会调用OnDraw方法来绘制图像,OnDraw()代码如下:
void CResultView::OnDraw(CDC* pDC)
{
// TODO: Add your specialized code here and/or call the base class
CBrush brush ;
brush.CreateSolidBrush(RGB(255,0,0));
pDC->SelectObject(brush);
CRect rcClient;
GetClientRect(rcClient);
CRect rcMid = rcClient;
rcMid.left = rcClient.Width()*1/4;
rcMid.right =rcClient.Width()*3/4;
rcMid.top = rcClient.Height()*1/4;
rcMid.bottom = rcClient.Height()*3/4;
TRACE("rcMid.left = %d \n",rcClient.Width()*1/4);
TRACE("rcMid.right = %d \n",rcMid.right);
TRACE("rcMid.top = %d \n",rcMid.top);
TRACE("rcMid.bottom = %d \n",rcMid.bottom);
TRACE("rcClient.widht() = %d \n",rcClient.Width());
TRACE("rcClient.hwidht() = %d \n",rcClient.Height());
pDC->Rectangle(rcMid);
//pDC->Rectangle(rcMid.left,rcMid.top,rcMid.Width(),rcMid.Height());
}

这样绘制的图像截图如下:
这个是刚打开的图像
,GetClientRect获取的区域绘制时偏离了绘制区域,什么原因?详情如下:请帮忙分析一下
视图大小:
,GetClientRect获取的区域绘制时偏离了绘制区域,什么原因?详情如下:请帮忙分析一下

然后最大化窗口后再恢复原来大小时如图:
,GetClientRect获取的区域绘制时偏离了绘制区域,什么原因?详情如下:请帮忙分析一下
可以看到红色矩形向下移动了
此时视图区域如图:
,GetClientRect获取的区域绘制时偏离了绘制区域,什么原因?详情如下:请帮忙分析一下
蓝色边框是截图工具自动感应的, 可以看到此时视图区域超过了窗口范围
上面的代码中我们设置几组TRACE, 运行后数据如下:
刚打开时 数据:
rcMid.left = 140 
rcMid.right = 422 
rcMid.top = 109 
rcMid.bottom = 327 
rcClient.widht() = 563 
rcClient.hwidht() = 437
 
放大之后再恢复的数据:
rcMid.left = 136 
rcMid.right = 408 
rcMid.top = 104 
rcMid.bottom = 313 
rcClient.widht() = 544 
rcClient.hwidht() = 418
 

这两组数据竟然不一样, 不知道为什么?

同时为了最大化时 视图类也跟着最大化,我们在对话框的OnSize中做了这样的代码设置:
void CDisplayResult::OnSize(UINT nType, int cx, int cy)
{
//CDialogEx::OnSize(nType, cx, cy);

m_Resize.OnSize(cx,cy);
TRACE("cx = %d \n",cx);

TRACE("cy = %d \n",cy);


if(m_resultView)
{
m_resultView->SetWindowPos(NULL,0,0,cx-5,cy-80,SWP_NOZORDER);
}

}

此时最大化时 截图如下:
,GetClientRect获取的区域绘制时偏离了绘制区域,什么原因?详情如下:请帮忙分析一下
屏宽1440 , 这里只截图了600多宽度的图像,可以看出红色区域几乎完全偏离了设定rcMid (rcClient.left*1/4,rcClient.top*1/4,rcClient.rightt*3/4,rcClient.bottom*3/4)这个区域
此时TRACE数据:
cx = 1440 
cy = 838 
rcMid.left = 358 
rcMid.right = 1076 
rcMid.top = 189 
rcMid.bottom = 568 
rcClient.widht() = 1435 
rcClient.hwidht() = 758
 
那么此时最大化时红色矩形显示出来的大小有多大? 截图如下:
,GetClientRect获取的区域绘制时偏离了绘制区域,什么原因?详情如下:请帮忙分析一下
从图中可以看出它显示出来的大小是 647X381 而它应该绘制的实际大小是:
rcMid.right -rcMid.left = 1076-358 = 718
rcMid.bottom-rcMid.top = 568-189 = 379


通过数据对比 381 和 379 高度吻合, 但是 718 几乎是358 的两倍,不知道为什么? 
再来看一下左上角的位置截图如下:
,GetClientRect获取的区域绘制时偏离了绘制区域,什么原因?详情如下:请帮忙分析一下
从上图看它的左上角位置为:795,348
但是理论上应该rcMid.left = 358,rcMid.top = 189 啊? 为什么要放大2倍呢? (358,189)*2 = (795,348)
从上面的代码看出来,
pDC->Rectangle(rcMid) pDC是使用的rcMid区域啊, 中间也没有改变,为什么会是这样呢? 完全偏离指定区域来绘制, 请大家帮忙分析一下, 我都搞了一下午了

上面这个问题 总结为:在对话框上通过静态控件绑定一个视图类,如何使得视图类随着窗口的大小而变化,同时,绘制在它上面的图形也应跟着发生位置的变化,如果指定的是一个动态的矩形区域的话。


请大家帮忙分析一下, 谢谢

------解决方案--------------------
,GetClientRect获取的区域绘制时偏离了绘制区域,什么原因?详情如下:请帮忙分析一下
------解决方案--------------------
来学习一下,虽然看了半小时也没看懂楼主的意思。

需要什么功能实现不就好了,不用管那么多吧。我觉得绑定的视图区域也需要按照窗口客户区修改大小,然后在视图类里面修改相对的矩形信息吧。