,GetClientRect获取的区域绘制时偏离了绘制区域,什么原因?详情如下:请帮忙分析一下
在线等,GetClientRect获取的区域绘制时偏离了绘制区域,什么原因?详情如下:请帮忙分析一下
具体情况如下:
我在对话框上通过静态文本控件绑定了一个视图类,然后通过视图类的OnDraw在上面绘制图形,但是绘制图形时偏离GetClientRect()获取的指定区域,调用OnDraw之前,会调用OnInitalUpdate来初始化视图的大小,代码如下:
初始化完了之后会调用OnDraw方法来绘制图像,OnDraw()代码如下:
这样绘制的图像截图如下:
这个是刚打开的图像

视图大小:

然后最大化窗口后再恢复原来大小时如图:

可以看到红色矩形向下移动了
此时视图区域如图:

蓝色边框是截图工具自动感应的, 可以看到此时视图区域超过了窗口范围
上面的代码中我们设置几组TRACE, 运行后数据如下:
刚打开时 数据:
放大之后再恢复的数据:
这两组数据竟然不一样, 不知道为什么?
同时为了最大化时 视图类也跟着最大化,我们在对话框的OnSize中做了这样的代码设置:
此时最大化时 截图如下:

屏宽1440 , 这里只截图了600多宽度的图像,可以看出红色区域几乎完全偏离了设定rcMid (rcClient.left*1/4,rcClient.top*1/4,rcClient.rightt*3/4,rcClient.bottom*3/4)这个区域
此时TRACE数据:
那么此时最大化时红色矩形显示出来的大小有多大? 截图如下:

从图中可以看出它显示出来的大小是 647X381 而它应该绘制的实际大小是:
通过数据对比 381 和 379 高度吻合, 但是 718 几乎是358 的两倍,不知道为什么?
再来看一下左上角的位置截图如下:

从上图看它的左上角位置为:795,348
但是理论上应该rcMid.left = 358,rcMid.top = 189 啊? 为什么要放大2倍呢? (358,189)*2 = (795,348)
从上面的代码看出来,
pDC->Rectangle(rcMid) pDC是使用的rcMid区域啊, 中间也没有改变,为什么会是这样呢? 完全偏离指定区域来绘制, 请大家帮忙分析一下, 我都搞了一下午了
上面这个问题 总结为:在对话框上通过静态控件绑定一个视图类,如何使得视图类随着窗口的大小而变化,同时,绘制在它上面的图形也应跟着发生位置的变化,如果指定的是一个动态的矩形区域的话。
请大家帮忙分析一下, 谢谢
------解决方案--------------------

------解决方案--------------------
来学习一下,虽然看了半小时也没看懂楼主的意思。
需要什么功能实现不就好了,不用管那么多吧。我觉得绑定的视图区域也需要按照窗口客户区修改大小,然后在视图类里面修改相对的矩形信息吧。
具体情况如下:
我在对话框上通过静态文本控件绑定了一个视图类,然后通过视图类的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());
}
这样绘制的图像截图如下:
这个是刚打开的图像
视图大小:
然后最大化窗口后再恢复原来大小时如图:
可以看到红色矩形向下移动了
此时视图区域如图:
蓝色边框是截图工具自动感应的, 可以看到此时视图区域超过了窗口范围
上面的代码中我们设置几组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);
}
}
此时最大化时 截图如下:
屏宽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
那么此时最大化时红色矩形显示出来的大小有多大? 截图如下:
从图中可以看出它显示出来的大小是 647X381 而它应该绘制的实际大小是:
rcMid.right -rcMid.left = 1076-358 = 718
rcMid.bottom-rcMid.top = 568-189 = 379
通过数据对比 381 和 379 高度吻合, 但是 718 几乎是358 的两倍,不知道为什么?
再来看一下左上角的位置截图如下:
从上图看它的左上角位置为:795,348
但是理论上应该rcMid.left = 358,rcMid.top = 189 啊? 为什么要放大2倍呢? (358,189)*2 = (795,348)
从上面的代码看出来,
pDC->Rectangle(rcMid) pDC是使用的rcMid区域啊, 中间也没有改变,为什么会是这样呢? 完全偏离指定区域来绘制, 请大家帮忙分析一下, 我都搞了一下午了
上面这个问题 总结为:在对话框上通过静态控件绑定一个视图类,如何使得视图类随着窗口的大小而变化,同时,绘制在它上面的图形也应跟着发生位置的变化,如果指定的是一个动态的矩形区域的话。
请大家帮忙分析一下, 谢谢
------解决方案--------------------
------解决方案--------------------
来学习一下,虽然看了半小时也没看懂楼主的意思。
需要什么功能实现不就好了,不用管那么多吧。我觉得绑定的视图区域也需要按照窗口客户区修改大小,然后在视图类里面修改相对的矩形信息吧。