VS2010 MFC中制作Visual Studio风格的停靠侧栏窗口(CDockablePane里嵌套FormView表单视图)

1. 在资源窗口里新建一个FormView的Dialog,修改ID为IDD_FORMVIEW。在此Dialog上点击右键添加类,建立一个基类为CFormView的类,这里取名为CMfcFormView。则生成了MfcFormView.h和MfcFormView.cpp文件。

2. 建立一个CDockablePane的派生类,予以容纳FormView,建立派生出的CDockablePane类为CSolutionWnd

即利用类向导,添加类名为CSolutionWnd,基类为CDockablePane,生成文件为SolutionWnd.h和SolutionWnd.cpp。

3. 在SolutionWnd.h中添加:

头文件:#include "MfcFormView.h"

代码:

protected:

CMfcFormView*   m_pformView;

在SolutionWnd.cpp中的构造函数中创建CMfcFormView对象,即添加代码:

m_pformView = (CMfcFormView*) (RUNTIME_CLASS(CMfcFormView)->CreateObject());

4. 既然创建了CDockablePane,那必然需要改写OnCreate函数和OnSize函数。因为通过CDockablePane的创建必然会调用OnCreate函数,在OnCreate函数里创建

FormView,在OnSize里面调整FormView的大小,覆盖整个CDockablePane。

利用类向导在CSolution声明里添加消息映射函数:

DECLARE_MESSAGE_MAP()

afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

afx_msg void OnSize(UINT nType, int cx, int cy);

在OnCreate函数里创建FormView

int CSolutionWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

if (CDockablePane::OnCreate(lpCreateStruct) == -1)

return -1;

// TODO:  在此添加您专用的创建代码

RECT rect;

GetClientRect(&rect);

m_pformView->Create(NULL, NULL,  WS_CHILD|WS_VISIBLE, rect, this, 123, NULL);

return 0;

}

在CSolution的OnSize函数里调整FormView填充整个DockablePane区域

void CSolutionWnd::OnSize(UINT nType, int cx, int cy)

{

CDockablePane::OnSize(nType, cx, cy);

// TODO: 在此处添加消息处理程序代码

if (GetSafeHwnd() == NULL)
   {
             return;
   }
   if(m_pformView->GetSafeHwnd()!=NULL)
   {
            CRect rect;
            GetClientRect(rect);
             m_pformView->SetWindowPos(NULL, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOACTIVATE | SWP_NOZORDER);
   }

}

4. 在MainFrm.h里添加头文件:#include "SolutionWnd.h",添加m_wndSolution变量(类型为CSolutionWnd)

在MainFrm.cpp里的CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)函数里找到代码:

m_wndProperties.EnableDocking(CBRS_ALIGN_ANY);

DockPane(&m_wndProperties);

在其后添加:

m_wndSolution.EnableDocking(CBRS_ALIGN_ANY);

m_wndSolution.AttachToTabWnd(&m_wndProperties, DM_SHOW, TRUE, &pTabbedBar);

在MainFrm.cpp里的CMainFrame::CreateDockingWindows()中添加代码:

CString strSolutionWnd;

bNameValid = strSolutionWnd.LoadString(IDS_SOLUTION_WND);

ASSERT(bNameValid);

if(!m_wndSolution.Create(strSolutionWnd,this,CRect(0,0,200,200),TRUE,1234,WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS

| WS_CLIPCHILDREN | CBRS_RIGHT | CBRS_FLOAT_MULTI))

{

TRACE0("未能创建“解决方案窗口\n");

return FALSE;

}

5. 利用类向导在CMfcFormView里添加消息映射函数OnCreate以及改写虚函数Create:

afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);

// CMfcFormView 消息处理程序

int CMfcFormView::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

if (CFormView::OnCreate(lpCreateStruct) == -1)

return -1;

// TODO:  在此添加您专用的创建代码

return 0;

}

BOOL CMfcFormView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)

{

// TODO: 在此添加专用代码和/或调用基类

return CFormView::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);

}

Bingo~

注意几点:

1. FormView的Create函数是protected类型的,通过改写FormView::Create函数为Public类型,才能调用到FormView::Create函数。尽管我们在Create函数里什么也没有做,但是如果不重写Create函数的话,就会出现编译错误。

2. 报错:error C2065: “IDD_FORMVIEW”: 未声明的标识符

解决办法:在MfcFormView.h中添加头文件:#include "Resource.h"

3. 编译通过了,但运行出错。通过调试发现

每次运行到:
BOOL CFormView::Create(LPCTSTR /*lpszClassName*/, LPCTSTR /*lpszWindowName*/,
 DWORD dwRequestedStyle, const RECT& rect, CWnd* pParentWnd, UINT nID,
 CCreateContext* pContext)
{
 ASSERT(pParentWnd != NULL);
 ASSERT(m_lpszTemplateName != NULL);

m_pCreateContext = pContext;    // save state for later OnCreate

#ifdef _DEBUG
 // dialog template must exist and be invisible with WS_CHILD set  <——请注意此处
 if (!_AfxCheckDialogTemplate(m_lpszTemplateName, TRUE))
 {
  ASSERT(FALSE);          // invalid dialog template name    
  PostNcDestroy();        // cleanup if Create fails too soon     
  return FALSE;
 }
#endif //_DEBUG

中的ASSERT时就报错。

解决办法:检查Dialog的属性:Visible属性应设置为FALSE

Style属性应设置为Child

SystemMenu和TitleBar属性最好都设为False

因为 根据上面代码的要求是:对话框模板必须存在,属性要设置成不可见和子窗口风格。

VS2010 MFC中制作Visual Studio风格的停靠侧栏窗口(CDockablePane里嵌套FormView表单视图)的更多相关文章

  1. DotNetBar for Windows Forms 12.9.0.0_冰河之刃重打包版及制作Visual Studio C#项目模板文件详解

    关于 DotNetBar for Windows Forms 12.9.0.0_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版-------------- ...

  2. 制作Visual Studio 2019 (VS 2019) 离线安装包

    与制作Visual Studio 2017的离线安装包(https://www.cnblogs.com/danzhang/p/6534341.html)类似,可以使用--layout的参数在安装前先下 ...

  3. 在Unity3D 4中关联Visual Studio 2012来编写C#

    Unity3D自带的MonoDevelop编辑器无论是js还是c#代码提示都很差,很诡异的就是变量名和方法名有的时候提示有的时候不提示.不过用Visual Studio代替MonoDevelop这个问 ...

  4. 在低带宽或不可靠的网络环境中安装 Visual Studio 2017

    在低带宽或不可靠的网络环境中安装 Visual Studio 2017 2017-4-141 分钟阅读时长 作者  https://docs.microsoft.com/zh-cn/visualstu ...

  5. 1 分钟上手,在容器中运行 Visual Studio Code

    https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers 这个插件允许我们在容器中运 ...

  6. ubuntu中安装visual studio code-(转载)

    在Ubuntu中安装Visual Studio Code 编译自:http://itsfoss.com/install-visual-studio-code-ubuntu/ 作者: Abhishek ...

  7. [转]开发Visual Studio风格的用户界面--MagicLibrary使用指南

    本文的示例代码为可以从这里下载: 1           概述 微软Visual Studio.NET开发工具推出已经好几年了,这个开发工具一推出就以其易用性和强大功能深受开发者的喜爱.尤其是.NET ...

  8. 制作Visual Studio 2017 (VS 2017) 离线安装包

    史上功能最强大的Visual Studio 2017版本发布,但是由于版本更新速度加快和与第三方工具包集成的原因,微软研发团队没有为这个版本提供离线下载的安装文件.如果用户处在一个与外网隔离的网络环境 ...

  9. 制作Visual Studio 2017 (VS 2017) 离线安装包 (转)

    史上功能最强大的Visual Studio 2017版本发布,但是由于版本更新速度加快和与第三方工具包集成的原因,微软研发团队没有为这个版本提供离线下载的安装文件.如果用户处在一个与外网隔离的网络环境 ...

随机推荐

  1. 使用 NPC,NPCManager 在 XNA 中创建 NPC(十九)

    平方已经开发了一些 Windows Phone 上的一些游戏,算不上什么技术大牛.在这里分享一下经验,仅为了和各位朋友交流经验.平方会逐步将自己编写的类上传到托管项目中,没有什么好名字,就叫 WPXN ...

  2. hnust hold不住的老师

    问题 H: Hold不住的老师 时间限制: 1 Sec  内存限制: 128 MB提交: 415  解决: 63[提交][状态][讨论版] 题目描述 因为我们学校ACM集训队取得的一个个优异成绩,AC ...

  3. Selenium - WebDriver Advanced Usage

    Explicit Waits # Python from selenium import webdriver from selenium.webdriver.common.by import By f ...

  4. 基数排序(java实现)

    基数排序  就是先比较数组中元素的个位数,排序得到新的数组,然后比较新的数组中的十位数,排序得到新数组,然后再对最新得到的数组比较百位数.......依次循环 比如{82 ,31 ,29 ,71, 7 ...

  5. [ZJOI2015][bzoj3924] 幻想乡战略游戏 [动态点分治]

    唉:-(动态点分治的思想真是复杂...... 先码住,再做几道题再来填坑 PS:接下来的Code因为用了倍增lca所以TLE一部分,但是懒得改成RMQ了...... Code: #include< ...

  6. Shell 环境中的输入输出重定向

    Linux Shell 环境中的输入输出重定向,用符号<和>来表示.0.1和2分别表示标准输入.标准输出和标准错误. 1.重定向标准输出到文件: cat fo > foo.txt 2 ...

  7. why switch kernel mode and user mode expensive

    Because that means context switching(save context, restore context)

  8. 洛谷 P1270 “访问”美术馆

    P1270 “访问”美术馆 题目描述 经过数月的精心准备,Peer Brelstet,一个出了名的盗画者,准备开始他的下一个行动.艺术馆的结构,每条走廊要么分叉为两条走廊,要么通向一个展览室.Peer ...

  9. 【Linux】自主实现my_sleep【转】

    转自:http://blog.csdn.net/scenlyf/article/details/52068522 版权声明:本文为博主原创文章,未经博主允许不得转载. 首先说一下信号相关的内容. ** ...

  10. 搞定linux的中文输入和vim

    本篇是http://blog.csdn.net/guochaoxxl/article/details/53212090的姊妹篇,无论先操作哪一篇都可以: 1.一言不合先下载,链接: https://p ...