mfc单文档程序嵌入对话框尺寸确定问题(vs10)

wojiayutou 2015-03-02 10:22:29
程序基于VS10提供的单文档demo生成的。
左侧建立outlook导航栏,下侧建立output窗口。

样式如图所示。
现在想在右上角空白处添加一个Dialog对话框,具体思路如下:
建立对话框(类C**box),继承于CDialogEx。
生成类ControlPanel,继承于CDockablePane,添加:
C**box m_dlg;
相应添加
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnDestroy( );三个函数。

后续于CMainFrame::OnCreate函数添加代码如下:
m_wndPanel.Create(_T("Rtppp"),this,CRect(0,0,300,300),TRUE,666,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI /*| C BRS_ALIGN_TOP *//*| CBRS_ALIGN_RIGHT*/);
m_wndPanel.EnableDocking(CBRS_ALIGN_RIGHT);
DockPane(&m_wndPanel);
其中ControlPanel m_wndPanel;

CMainFrame::OnCreate函数中关于outlookbar和output窗口代码如下所示:
// 导航窗格将创建在左侧,因此将暂时禁用左侧的停靠:
EnableDocking(CBRS_ALIGN_TOP | CBRS_ALIGN_BOTTOM | CBRS_ALIGN_RIGHT);

// 创建并设置“Outlook”导航栏:
if (!CreateOutlookBar(m_wndNavigationBar, ID_VIEW_NAVIGATION, m_wndOutlookPane, m_wndTree, m_wndCalendar, 250))
{
TRACE0("未能创建导航窗格\n");
return -1; // 未能创建
}

// 已创建 Outlook 栏,应允许在左侧停靠。
EnableDocking(CBRS_ALIGN_LEFT);
EnableAutoHidePanes(CBRS_ALIGN_RIGHT);

// 创建停靠窗口
if (!CreateDockingWindows())
{
TRACE0("未能创建停靠窗口\n");
return -1;
}

m_wndOutput.EnableDocking(CBRS_ALIGN_ANY);
DockPane(&m_wndOutput);

程序运行效果如下所示:


其中插入的对话框未能完全填充满界面右上角空间。
请问对话框应该怎样设置,才能根据outlookbar和output窗口的大小,确定剩余空间的大小,以此确定对话框的尺寸?

谢谢各位,望不吝指教!!!
...全文
572 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
JoeyKo 2015-07-12
  • 打赏
  • 举报
回复
请问你左侧Outlook导航栏怎么设置的?
脚本之家 2015-06-25
  • 打赏
  • 举报
回复
我也遇到类似问题。
qq3011642 2015-05-02
  • 打赏
  • 举报
回复
你好,我看到你在csdn上发的关于dialog嵌套的帖子,我想和你交流一下这个个问题。因为我现在也要用到。想加一下你的QQ,可以么。
lougd 2015-03-03
  • 打赏
  • 举报
回复
引用 8 楼 wojiayutou 的回复:
[quote=引用 6 楼 u011391040 的回复:] [quote=引用 5 楼 wojiayutou 的回复:] [quote=引用 3 楼 LittleCommit 的回复:] 理论上使用MoveWindow和SetWindowPos函数都可以实现,具体用法,你可以百度一下或查看msdn
我已经在cdockpanel中设置了对话框随着dockpanel大小变化。 但是现在的问题是cdockpanel怎么获取剩余空间的大小?[/quote] GetWindowRect:获取窗体大小,带边框 GetClientRect:获取客户区大小,不带边框[/quote] 您好,我根据您说的添加了相应代码,如下所示: CRect temp; /*GetWindowRect(temp);*/ this->GetClientRect(&temp); m_wndPanel.Create(_T("Rtppp"),this,temp,TRUE,666, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_TOP | CBRS_FLOAT_MULTI); m_wndPanel.EnableDocking(CBRS_ALIGN_RIGHT); DockPane(&m_wndPanel); 但是运行出来的结果仍然是未能全部填充,请问问题可能出在哪里? [/quote] 看一下获取的rect对吗?在创建窗口的OnInitDialog里用MoveWindow设置下试试。
wojiayutou 2015-03-03
  • 打赏
  • 举报
回复
引用 6 楼 u011391040 的回复:
[quote=引用 5 楼 wojiayutou 的回复:]
[quote=引用 3 楼 LittleCommit 的回复:]
理论上使用MoveWindow和SetWindowPos函数都可以实现,具体用法,你可以百度一下或查看msdn


我已经在cdockpanel中设置了对话框随着dockpanel大小变化。
但是现在的问题是cdockpanel怎么获取剩余空间的大小?[/quote]
GetWindowRect:获取窗体大小,带边框
GetClientRect:获取客户区大小,不带边框[/quote]


您好,我根据您说的添加了相应代码,如下所示:
CRect temp;
/*GetWindowRect(temp);*/
this->GetClientRect(&temp);

m_wndPanel.Create(_T("Rtppp"),this,temp,TRUE,666,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_TOP | CBRS_FLOAT_MULTI);
m_wndPanel.EnableDocking(CBRS_ALIGN_RIGHT);
DockPane(&m_wndPanel);

但是运行出来的结果仍然是未能全部填充,请问问题可能出在哪里?
wojiayutou 2015-03-03
  • 打赏
  • 举报
回复
引用 4 楼 sunnyloves 的回复:
空白处完全填对话框吗 那里是view的区域 直接在CxxView里动态创建你的对话框元素就好了
请问能不能给一个示范,对这方面不太清楚。 另外,使用dockpanel不可以吗?不一定局限于对话框,只要将中间空白区域填充完全就可以了
lougd 2015-03-03
  • 打赏
  • 举报
回复
引用 5 楼 wojiayutou 的回复:
[quote=引用 3 楼 LittleCommit 的回复:] 理论上使用MoveWindow和SetWindowPos函数都可以实现,具体用法,你可以百度一下或查看msdn
我已经在cdockpanel中设置了对话框随着dockpanel大小变化。 但是现在的问题是cdockpanel怎么获取剩余空间的大小?[/quote] GetWindowRect:获取窗体大小,带边框 GetClientRect:获取客户区大小,不带边框
wojiayutou 2015-03-03
  • 打赏
  • 举报
回复
引用 3 楼 LittleCommit 的回复:
理论上使用MoveWindow和SetWindowPos函数都可以实现,具体用法,你可以百度一下或查看msdn
我已经在cdockpanel中设置了对话框随着dockpanel大小变化。 但是现在的问题是cdockpanel怎么获取剩余空间的大小?
洗洗睡去 2015-03-03
  • 打赏
  • 举报
回复
空白处完全填对话框吗 那里是view的区域 直接在CxxView里动态创建你的对话框元素就好了
LittleCommit 2015-03-03
  • 打赏
  • 举报
回复
理论上使用MoveWindow和SetWindowPos函数都可以实现,具体用法,你可以百度一下或查看msdn
LittleCommit 2015-03-03
  • 打赏
  • 举报
回复
如果你的对话框是在ControlPanel类里创建的话,那么你需要在ControlPanel类的Onsize函数里重新设置对话框的大小为ControlPanel的大小(即对话框充满整个窗口),这样当ControlPanel的大小改变时,对话框的大小也会随之改变的。
wojiayutou 2015-03-03
  • 打赏
  • 举报
回复
求各位给与帮助
洗洗睡去 2015-03-03
  • 打赏
  • 举报
回复
引用 10 楼 wojiayutou 的回复:
[quote=引用 4 楼 sunnyloves 的回复:] 空白处完全填对话框吗 那里是view的区域 直接在CxxView里动态创建你的对话框元素就好了
谢谢,按照您的方法已经设置好了,感谢您的帮助![/quote] 还有个办法是创建项目的时候 不从CView派生 而从CFormview派生
wojiayutou 2015-03-03
  • 打赏
  • 举报
回复
引用 4 楼 sunnyloves 的回复:
空白处完全填对话框吗 那里是view的区域 直接在CxxView里动态创建你的对话框元素就好了
谢谢,按照您的方法已经设置好了,感谢您的帮助!

15,979

社区成员

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

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