谁知道怎么实现窗口停靠的功能? MFC
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了谁知道怎么实现窗口停靠的功能? MFC相关的知识,希望对你有一定的参考价值。
像VC6.0这个程序 ,你可以把工具栏拖出来成为一个窗口,也可以把它拖到边上成为框架的一部分,我想知道这个效果如何实现,希望大家帮忙。
不只是工具栏 我是想说任何一个窗口 怎么实现?
不只是工具栏 我是想说任何一个窗口 怎么实现?
追答你这个窗口要停靠在什么地方?是父窗口还是整个电脑的桌面?要是父窗口的话就响应一下窗口拖动消息,在一定的坐标范围内就自动靠到父窗口,这样能实现类似的功能
参考技术A 使窗口移动时具有停靠吸附功能http://hi.baidu.com/qiujiejia/blog/item/9bdb4fef77839406fdfa3ca3.html 参考技术B m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);//m_wndToolBar可以停靠
EnableDocking(CBRS_ALIGN_ANY);//窗口允许被停靠
DockControlBar(&m_wndToolBar);
在 CMainFrame::OnCreate函数中填写代码。孙鑫老师的第四课专门讲到了这点,可以在网上视频查看 参考技术C VC 2008 SP1或者VC 2010有新特性窗口,基类是CPane,自己从这个类继承,可以实现VS 2008那样的停靠窗口
MFC 停靠窗口及其停靠位置
【中文标题】MFC 停靠窗口及其停靠位置【英文标题】:MFC docking windows and where they dock 【发布时间】:2010-03-02 17:38:02 【问题描述】:我已经创建(生成)了一个带有选项卡式文档的 MDI 项目 VS2008 专业版。 Visual Studio 使用文件/类视图生成应用程序 窗口、属性窗口、输出窗口和第一个MDI文件/ 看法。
我想控制 windows 停靠的边。我以为这个 在 BOOL CMainFrame::CreateDockingWindows() 中完成,我改变了 CBRS_TOP 到 CBRS_BOTTOM 和 CBRS_RIGHT 到 CBRS_LEFT ,但窗口 在客户区还是一样。没有什么不同的 什么用于 CBRS_xxxx 的窗口样式属性。地点和方式 我可以控制这些窗口停靠在客户区的什么位置吗? 我当时换了:
BOOL CMainFrame::CreateDockingWindows()
BOOL bNameValid;
// Create class view
CString strClassView;
bNameValid = strClassView.LoadString(IDS_CLASS_VIEW);
ASSERT(bNameValid);
if (!m_wndClassView.Create(strClassView, this, CRect(0, 0, 200, 200), TRUE,ID_VIEW_CLASSVIEW, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |
WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI))
TRACE0("Failed to create Class View window\n");
return FALSE; // failed to create
// Create file view
CString strFileView;
bNameValid = strFileView.LoadString(IDS_FILE_VIEW);
ASSERT(bNameValid);
if (!m_wndFileView.Create(strFileView, this, CRect(0, 0, 200, 200),TRUE, ID_VIEW_FILEVIEW, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |
WS_CLIPCHILDREN | CBRS_LEFT| CBRS_FLOAT_MULTI))
TRACE0("Failed to create File View window\n");
return FALSE; // failed to create
// Create output window
CString strOutputWnd;
bNameValid = strOutputWnd.LoadString(IDS_OUTPUT_WND);
ASSERT(bNameValid);
if (!m_wndOutput.Create(strOutputWnd, this, CRect(0, 0, 100, 100),
TRUE, ID_VIEW_OUTPUTWND, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |
WS_CLIPCHILDREN | CBRS_BOTTOM | CBRS_FLOAT_MULTI))
TRACE0("Failed to create Output window\n");
return FALSE; // failed to create
// Create properties window
CString strPropertiesWnd;
bNameValid = strPropertiesWnd.LoadString(IDS_PROPERTIES_WND);
ASSERT(bNameValid);
if (!m_wndProperties.Create(strPropertiesWnd, this, CRect(0, 0, 200, 200), TRUE, ID_VIEW_PROPERTIESWND, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |CBRS_RIGHT | CBRS_FLOAT_MULTI))
TRACE0("Failed to create Properties window\n");
return FALSE; // failed to create
SetDockingWindowIcons(theApp.m_bHiColorIcons);
return TRUE;
有人可以帮我解释一下如何控制边 这些窗口停靠? 谢谢。
【问题讨论】:
【参考方案1】:IIRC、CBRS_TOP 等是针对它们可以停靠的位置,而不是它们在您启动应用程序时停靠的位置。保存在注册表中,基本上会显示上次关闭应用程序时的位置。
在过去(这不适用于 Feature Pack 停靠框架)如果您想在启动时停靠到特定的一侧,您必须将您希望工具栏停靠的一侧设置为唯一允许的一侧(例如右边),创建工具栏,停靠它(有一个 SetDocked() 或类似的东西),然后将允许的停靠边修改为您想要允许的方向。我不确定这种行为在当前版本中是否仍然存在,但我认为它确实存在,因为这是建立在低级停靠工具栏功能之上的东西,而功能包的东西只是建立在它之上。
不是一个真正的答案,但希望它能帮助你...
【讨论】:
以上是关于谁知道怎么实现窗口停靠的功能? MFC的主要内容,如果未能解决你的问题,请参考以下文章
MFC SDI程序,可停靠窗口嵌入对话框,对话框的初始化怎么做