谁知道怎么实现窗口停靠的功能? MFC

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了谁知道怎么实现窗口停靠的功能? MFC相关的知识,希望对你有一定的参考价值。

像VC6.0这个程序 ,你可以把工具栏拖出来成为一个窗口,也可以把它拖到边上成为框架的一部分,我想知道这个效果如何实现,希望大家帮忙。
不只是工具栏 我是想说任何一个窗口 怎么实现?

这个是工具栏的停靠功能。单文档里面就有,在框架类的初始化那里,EnableDocking,没记错的话应该是这个,一共有两个,具体功能你查一下吧,给定指定的参数就能控制工具栏能否停靠和停靠在什么地方追问

不只是工具栏 我是想说任何一个窗口 怎么实现?

追答

你这个窗口要停靠在什么地方?是父窗口还是整个电脑的桌面?要是父窗口的话就响应一下窗口拖动消息,在一定的坐标范围内就自动靠到父窗口,这样能实现类似的功能

参考技术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程序,可停靠窗口嵌入对话框,对话框的初始化怎么做

MFC 停靠窗口及其停靠位置

如何使 CMDIChildWnd 在 MFC 中可停靠?

C#如何实现VS2010软件界面的子窗口(可浮动、停靠、自动隐藏)的功能? 使用第三方控件DevExpress

MFC 功能包 - 如何更新属性网格控件

VC中CDialogBox,停靠时,如何用鼠标拖动边框来改变大小