问一个获取主框架客户区大小的问题 - VC/MFC / 界面


问题:
我有一个多文档视图类的程序,我想在程序关闭的时候保存子窗口的位置和大小,在程
序打开的时候自动还原原有的子窗口配置。

我的做法是,通过GetWindowRect获取子窗口的位置和大小,然后用ScreenToClient转换
为相对于主框架的坐标,再将这个坐标保存;打开程序还原时,通过MoveWindow来恢复
子窗口的坐标。

但我遇到了以下问题:

(1)在保存子窗口位置时,通过ScreenToClient获取的相对于主框架的坐标是从toolb
ar的左上角算起的,就是说toolbar的区域也被算入了客户区,而通过movewindow恢复窗
口时,该函数的左上角点是从toolbar以下的区域算起的,两者相差了一个toolbar的高
度。

(2)在保存子窗口位置时,通过ScreenToClient获取的相对于主框架的坐标是从主框架
最外侧算起的,而通过movewindow恢复窗口时,该函数的有效区域是主框架除边框外的
内部空间,也就是说两者相差了一个边框的宽度。

请问上述问题是什么原因呢?我从MSDN里看,各个函数都说是指client area,难道还有
不同的client area的定义?

-----------------------------------------------------------------------
答案1:
GetClientRect才是获得客户区域

-----------------------------------------------------------------------
答案2:
多文档视图类ScreenToClient时要根据hWnd应为主框架的hMdiClient子窗口句柄,而不是主框架的窗口句柄

-----------------------------------------------------------------------
答案3[推荐答案]
多文档视图类ScreenToClient时的hWnd应为主框架的hMdiClient子窗口句柄,而不是主框架的窗口句柄

-----------------------------------------------------------------------
答案4:
引用 3 楼 chehw 的回复:

多文档视图类ScreenToClient时的hWnd应为主框架的hMdiClient子窗口句柄,而不是主框架的窗口句柄


我还是不明白怎么使用,我现在是在CChildFrm的OnWindowPosChanged消息响应里做如下处理:
GetWindowRect(&m_RectRawWindow);
g_pMainFrm->ScreenToClient(&m_RectRawWindow);
其中g_pMainFrm是指向主框架类的全局指针,怎么使用hMdiClient句柄呢?ScreenToClient只有一个参数呀。

-----------------------------------------------------------------------
答案5:
我理解了,直接用::ScreenToClient就行,谢了

你可能感兴趣的:(VC)