• 全部
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

怎样得到一个MDI的除去ToolBar, ControlBar 后的矩形大小

z_j 2001-07-18 09:16:38
如下图:
________________________________________
| ToolBar |
|______________________________________|
| | |
|DockBar | |
| | |
| | Rect |
| | |
| | |
|________|_____________________________|

用 GetClientRect 得到是包括 toolbar ,Dockbar在内的区域大小,如何得到上图中 Rect 的大小
...全文
48 点赞 收藏 4
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
nustchen 2001-07-19
非常easy,调用MFC函数
RepositionBars( 0, 0xffff, 0, reposQuery, &rtRest );
参数reposQuery就代码查询区域大小,rtRest就是剩余区域的大小
简单吧。
回复
tiongkohlang 2001-07-18
即使不是mdi程序,由于涉及到对客户区的操作,上述讨论应该也是有益的。
回复
tiongkohlang 2001-07-18
ahphone说的不行,人家问的是除去客户区内各种窗口后剩下的客户区的大小怎么解决。
为什么会有这种问题呢?因为如果亲身不依赖mfc编一些程序就会发现,无论是sdi程序还是mdi程序,都涉及到调整客户窗口的位置的问题。对于mdi程序,因为DefFrameProc仅仅会根据客户区的大小来调整mdiclient,所以一但你的client rectangle里边还有toolbar之类的控件或者窗口,你的程序的UI就要完蛋。所以必须调整一下这个mdiclient。
我建议两种方法。
1,如果你能够精确的确定所需要排除的窗口的位置,那么你可以自己编一个函数,运用GetClientRect和GetWIndowRect所得到的矩形进行一些计算,就可以得到所需要的矩形。然后把mdiclient移动到相应的位置。
我给你举一个例子。
LRESULT
MDIFrame_AdjustClientPosition
(
LPMDIFRAME pmf
)
{
UINT x,y,wWidth,wHeight;
RECT rcToolbar,rcStatusbar,rcClient;
if (IsWindowVisible(pmf->hwndToolbar))
GetWindowRect(pmf->hwndToolbar,&rcToolbar);
else
SetRectEmpty(&rcToolbar);
if (IsWindowVisible(pmf->hwndStatusbar))
GetWindowRect(pmf->hwndStatusbar,&rcStatusbar);
else
SetRectEmpty(&rcStatusbar);
GetClientRect(pmf->hwnd,&rcClient);
x=rcClient.left;
y=rcClient.top+(rcToolbar.bottom-rcToolbar.top);
wWidth=rcClient.right-rcClient.left;
wHeight=rcClient.bottom-rcClient.top
-(rcToolbar.bottom-rcToolbar.top)
-(rcStatusbar.bottom-rcStatusbar.top);
MoveWindow(pmf->hwndClient,x,y,wWidth,wHeight,TRUE);
return 0;
}
2,如果你大量的使用各种bars那么又一个GetEffectiveClientRect函数。这是微软公司在common control api 里边提供的。从名称上看,就可以意识到这个函数和以上所遇到的问题有关,可见微软意识到了上述的程序设计问题。这个函数的原型是
void GetEffectiveClientRect(
HWND hWnd,
LPRECT lprc,
LPINT lpInfo
);
msdn的解释是:
Parameters
hWnd
Handle to the window that has the client area to check.
lprc
Address of a RECT structure that receives the dimensions of the rectangle.
lpInfo
Address of an array of integers that identify controls in the client area. Each control requires a pair of consecutive elements. The first element of the pair must be nonzero and the second element of the pair must be the control identifier. The last element pair in the array must be zero to identify the end of the array.
我没有用过这个函数,因此就把微软的原文呈现在整个地方。
另外为了解决一些其他的UI程序设计中的问题,还有一个相关的函数:
BOOL ShowHideMenuCtl(
HWND hWnd,
UINT uFlags,
LPINT lpInfo
);
这个函数是用来解决用菜单的标志来标示control是否可见的问题的。

不过令我不解的是,mfc已经解决了上述问题,不知道为什么z_j还会问。
回复
ahphone 2001-07-18
就是窗口的矩形减掉标题栏的矩形吧
GetWindowRect()
标题栏高度:GetSystemMetrics(SM_CYCAPTION)
呵呵!我也别说了,要是不嫌繁,这个GetSystemMetrics多用几把
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2001-07-18 09:16
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……