动态调整CControlBar的位置

jianpeng114746 2009-05-03 12:29:09
你们好!
我现在遇到一个非常的难题。请问如何动态调整CCOntrolBar的大小啊?
我在一个单文档的工程里面 建了两个CControlBar,启动时,这两个CControlBar上下停靠在左边(这个我已经做好了),现在的问题就是: 如何动态的调整这两个CCOntrolBar的高度啊?(比如:启动时,上面那个CCOntrolBar的高度是200,下面那个CCOntrolBar的高度也是200,现在我想点击一个按钮,使上面那个CControlBar的高度变成280,下面那个高度就是120,通过MoveWindow显然是不行啊), 请高手说详细一点,我查了下,有的人就说用哪些API。。。等,我觉得那不现实。
如果问题解决,我愿意再给200分。谢谢!
...全文
509 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xwsn007 2009-07-27
  • 打赏
  • 举报
回复
http://blog.csdn.net/icycoffee/archive/2008/03/04/2145528.aspx
qingting007 2009-07-27
  • 打赏
  • 举报
回复
函数具体是加在什么位置呢?
biweilun 2009-05-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 TianChong 的回复:]
后面有代码,楼主别急。

RepositionBars用来改变客户窗口中控制条的尺寸大小或者位置,其实现如下:
void CWnd::RepositionBars(UINT nIDFirst, UINT nIDLast, UINT nIDLeftOver,UINT nFlags, LPRECT lpRectParam, LPCRECT lpRectClient, BOOL bStretch)

其中:
参数1和参数2定义了需要重新放置的子窗口ID的范围,一般是0到0xFFFF。
参数3指定了一个子窗口ID,它拥有客户窗口剩下的空间,一般是AFX_IDW_PANE_FIRST…
[/Quote]
4楼说得很好
TianChong 2009-05-04
  • 打赏
  • 举报
回复
后面有代码,楼主别急。

RepositionBars用来改变客户窗口中控制条的尺寸大小或者位置,其实现如下:
void CWnd::RepositionBars(UINT nIDFirst, UINT nIDLast, UINT nIDLeftOver,UINT nFlags, LPRECT lpRectParam, LPCRECT lpRectClient, BOOL bStretch)

其中:
参数1和参数2定义了需要重新放置的子窗口ID的范围,一般是0到0xFFFF。
参数3指定了一个子窗口ID,它拥有客户窗口剩下的空间,一般是AFX_IDW_PANE_FIRST,表示视的窗口ID。
参数4指定了操作类型,缺省是CWnd::ReposDefault,表示执行窗口放置操作,参数5不会用到;若取值CWnd::ReposQuery,则表示尝试进行窗口放置(Layout) ,但最后不执行这个操作,只是把参数5初始化成客户区的尺寸大小;若取值CWnd::ReposExtra,则把参数5的值加到参数2表示的子窗口的客户区域,并执行窗口放置操作。
参数6表示传递给函数的可用窗口客户区的尺寸,如果空则使用窗口客户区尺寸。

如果执行layout操作的话,该函数的核心处理就是:
首先,调用::BeginDeferWindowPos初始化一个Windows内部的多窗口位置结构(Multiple-window - position structure)hDWP;
然后,让各个子窗口逐个调用::DeferWindowPos,更新hDWP。在调用::DeferWindowPos之前,要作一个确定子窗口大小的工作。这些工作通过给各个控制子窗口发送消息WM_SIZEPARENT来完成。

控制子窗口通过函数OnSizeParent响应WM_SIZEPARENT消息,先确定自己的尺寸,然后,如果需要进行窗口布置(WM_SIZEPARENT消息参数lParam包含了一个非空的HDWP结构(lpLayout->hDWP)),则OnSizeParent将调用AfxRepositionWindow函数计算本控制窗口的位置,结果保存到hDWP中。

在所有的控制窗口尺寸确定之后,剩下的留给窗口hWndLeftOver(如果存在的话)。确定了hWndLeftOver的大小之后,调用AfxRepositionWindow函数计算其位置,结果保存到hDWP中。

上面提到的函数AfxRepositionWindow间接调用了::DeferWindowPos。

最后,::EndDeferWindowPos,使用hDWP安排所有子窗口的位置和大小。

好了,代码来了:


CRect rcClientStart;
CRect rcClientNow;
GetClientRect(rcClientStart);

// To reposition and resize the control bar

RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST,0, reposQuery, rcClientNow);
CPoint ptOffset(rcClientNow.left - rcClientStart.left,rcClientNow.top-rcClientStart.top);

CRect rcChild;
CWnd* pwndChild = GetWindow(GW_CHILD);

while (pwndChild)
{
pwndChild->GetWindowRect(rcChild);
ScreenToClient(rcChild);
rcChild.OffsetRect(ptOffset);
pwndChild->MoveWindow(rcChild, FALSE);
pwndChild = pwndChild->GetNextWindow();
}
CRect rcWindow;
GetWindowRect(rcWindow);
rcWindow.right += rcClientStart.Width() - rcClientNow.Width();
rcWindow.bottom += rcClientStart.Height() - rcClientNow.Height();
MoveWindow(rcWindow, FALSE);

// And position the control bars
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
jianpeng114746 2009-05-03
  • 打赏
  • 举报
回复
首先回复一楼的: 你给的两个网页我以前都看过了,我曾经试了好久,就是一直没有彻底成功啊,所以才来问了。
回复二楼的:能不能说具体点啊?问题解决我肯定立即给分。
我说了,我是试了好久,所以我现在需要具体一点的,最好有源码。
xsc2001 2009-05-03
  • 打赏
  • 举报
回复
就是用RepositionBars函数来改变COntrolBar的尺寸大小和位置.

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧