CDockablePane类地使用.docx
- 文档编号:29408749
- 上传时间:2023-07-23
- 格式:DOCX
- 页数:37
- 大小:481.70KB
CDockablePane类地使用.docx
《CDockablePane类地使用.docx》由会员分享,可在线阅读,更多相关《CDockablePane类地使用.docx(37页珍藏版)》请在冰豆网上搜索。
CDockablePane类地使用
CDockablePane类的使用
CDockablePane与对话框类联合使用方法2
CDockablePane与CTreeCtrl类联合使用的方法6
CDockablePane同CFormView类的联合使用方法9
两个带图标的CDockablePane派生类与CFormView类的联合使用方法12
CDockablePane类的布局设计15
CDockablePane窗口风格设置22
去除VS2010风格的框架菜单23
在View视图类中使用CSplitterWnd来拆分视图窗口(不在CMainFrame类的虚函数OnCreateClient中拆分视图框架窗口)24
禁止dockablepane停靠浮动拖动26
VS2010菜单修改不了问题27
VS2010DockablePane每次打开都自动隐藏29
EnableDocking函数解释30
CDockablePane与对话框类联合使用方法
1、新建对话框资源:
①新建一个对话框资源IDD_DIALOG_DOCKDLG,Style设为Child,Border设为None;
②把默认的OK和Cancel按键去掉,因为一般情况下点击这两个按钮后,对话框会销毁,而这里是不需要销毁的(如果没去掉点击了,悬浮框中的对话框容就不能用了);
③如下添加一个按钮IDC_BUTTON_TEST,后为对话框添加类CTestDlg;
④为按钮添加响应
voidCTestDlg:
:
OnBnClickedButtonTest()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
MessageBox(_T("HelloWorld!
"));
}
2、派生CDockablePane类
①添加继承自CDockablePane的类CMyPane
②添加此类的WM_CREATE和WM_SIZE消息响应,并添加上面对话框的成员变量
CTestDlgm_TestDlg;
③在CMyPane:
:
OnCreate和CMyPane:
:
OnSize函数中添加代码
intCMyPane:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
if(CDockablePane:
:
OnCreate(lpCreateStruct)==-1)
return-1;
//TODO:
Addyourspecializedcreationcodehere
CRectrectDummy;
rectDummy.SetRectEmpty();
//创建选项卡窗口:
if(!
m_TestDlg.Create(IDD_DIALOG_DOCKDLG,this))
{
TRACE0("未能创建输出选项卡窗口/n");
return-1;//未能创建
}
m_TestDlg.ShowWindow(SW_SHOW);
return0;
}
voidCMyPane:
:
OnSize(UINTnType,intcx,intcy)
{
CDockablePane:
:
OnSize(nType,cx,cy);
//TODO:
Addyourmessagehandlercodehere
//选项卡控件应覆盖整个工作区
m_TestDlg.SetWindowPos(this,-1,-1,cx,cy,SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER);
m_TestDlg.ShowWindow(SW_SHOW);
}
3、修改MainFrame类
①然后在MainFrame.h代码中添加成员变量
CMyPanem_MyPane;
②在CMainFrame:
:
OnCreate函数中添加代码
if(!
m_wndStatusBar.Create(this))
{
TRACE0("Failedtocreatestatusbar\n");
return-1;//failtocreate
}
m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT));
if(!
m_MyPane.Create(_T("MyPane"),this,CRect(0,0,100,100),TRUE,IDD_DIALOG_DOCKDLG,WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|CBRS_LEFT|CBRS_FLOAT_MULTI))
{
TRACE0("未能创建输出窗口/n");
returnFALSE;
}
m_MyPane.EnableDocking(CBRS_ALIGN_ANY);
//TODO:
Deletethesefivelinesifyoudon'twantthetoolbarandmenubartobedockable
m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockPane(&m_wndMenuBar);
DockPane(&m_wndToolBar);
DockPane(&m_MyPane);//调整m_MyPane的大小使之适合父窗口
4、运行结果
5、补充
①CDockablePane派生类销毁时,对话框也销毁掉(没有试验)
voidControlPanel:
:
OnDestroy()
{
CDockablePane:
:
OnDestroy();
//TODO:
Addyourmessagehandlercodehere
m_dlg.DestroyWindow();
}
②CDockablePane派生类对象的Create函数里面的666是这个停靠栏的ID,这里是随便指定的一个数值,只要不和其他已用资源重复即可,真正应用的时候,以在字符串表中添加一个ID,前面使用的是对话框的IDD
m_Panel.Create(_T("tset"),this,CRect(0,0,300,300),TRUE,666,WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|CBRS_LEFT|CBRS_FLOAT_MULTI);
CDockablePane与CTreeCtrl类联合使用的方法
1、从CDockablePane继承,创建一个自定义类CNavView
①CNavView.h的代码
#pragmaonce
//CNavView
classCNavView:
publicCDockablePane
{
DECLARE_DYNAMIC(CNavView)
public:
CNavView();
virtual~CNavView();
protected:
afx_msgintOnCreate(LPCREATESTRUCTlpCreateStruct);
afx_msgvoidOnSize(UINTnType,intcx,intcy);
public:
CTreeCtrlm_wndClassView;
voidAdjustLayout();
protected:
DECLARE_MESSAGE_MAP()
};
②CNavView.cpp的代码
//NavView.cpp:
implementationfile
//
#include"stdafx.h"
#include"MDISample.h"
#include"NavView.h"
//CNavView
IMPLEMENT_DYNAMIC(CNavView,CDockablePane)
CNavView:
:
CNavView()
{
}
CNavView:
:
~CNavView()
{
}
BEGIN_MESSAGE_MAP(CNavView,CDockablePane)
ON_WM_CREATE()
ON_WM_SIZE()
END_MESSAGE_MAP()
voidCNavView:
:
OnSize(UINTnType,intcx,intcy)
{
CDockablePane:
:
OnSize(nType,cx,cy);
AdjustLayout();
}
voidCNavView:
:
AdjustLayout()
{
if(GetSafeHwnd()==NULL)
{
return;
}
CRectrectClient;
GetClientRect(rectClient);
intcyTlb=3;
m_wndClassView.SetWindowPos(NULL,rectClient.left+1,rectClient.top+cyTlb+1,rectClient.Width()-2,rectClient.Height()-cyTlb-2,SWP_NOACTIVATE|SWP_NOZORDER);
}
//CNavViewmessagehandlers
intCNavView:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
CRectrectDummy;
rectDummy.SetRectEmpty();
//Createviews:
constDWORDdwViewStyle=WS_CHILD|WS_VISIBLE|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS|WS_CLIPSIBLINGS|WS_CLIPCHILDREN;
if(!
m_wndClassView.Create(dwViewStyle,rectDummy,this,2))
{
TRACE0("FailedtocreateClassView/n");
return-1;//failtocreate
}
HTREEITEMhRoot=m_wndClassView.InsertItem(_T("FakeAppclasses"),0,0);
m_wndClassView.SetItemState(hRoot,TVIS_BOLD,TVIS_BOLD);
HTREEITEMhClass=m_wndClassView.InsertItem(_T("CFakeAboutDlg"),1,1,hRoot);
m_wndClassView.InsertItem(_T("CFakeAboutDlg()"),3,3,hClass);
m_wndClassView.Expand(hRoot,TVE_EXPAND);
hClass=m_wndClassView.InsertItem(_T("CFakeApp"),1,1,hRoot);
m_wndClassView.InsertItem(_T("CFakeApp()"),3,3,hClass);
m_wndClassView.InsertItem(_T("InitInstance()"),3,3,hClass);
m_wndClassView.InsertItem(_T("OnAppAbout()"),3,3,hClass);
hClass=m_wndClassView.InsertItem(_T("CFakeAppDoc"),1,1,hRoot);
m_wndClassView.InsertItem(_T("CFakeAppDoc()"),4,4,hClass);
m_wndClassView.InsertItem(_T("~CFakeAppDoc()"),3,3,hClass);
m_wndClassView.InsertItem(_T("OnNewDocument()"),3,3,hClass);
hClass=m_wndClassView.InsertItem(_T("CFakeAppView"),1,1,hRoot);
m_wndClassView.InsertItem(_T("CFakeAppView()"),4,4,hClass);
m_wndClassView.InsertItem(_T("~CFakeAppView()"),3,3,hClass);
m_wndClassView.InsertItem(_T("GetDocument()"),3,3,hClass);
m_wndClassView.Expand(hClass,TVE_EXPAND);
hClass=m_wndClassView.InsertItem(_T("CFakeAppFrame"),1,1,hRoot);
m_wndClassView.InsertItem(_T("CFakeAppFrame()"),3,3,hClass);
m_wndClassView.InsertItem(_T("~CFakeAppFrame()"),3,3,hClass);
m_wndClassView.InsertItem(_T("m_wndMenuBar"),6,6,hClass);
m_wndClassView.InsertItem(_T("m_wndToolBar"),6,6,hClass);
m_wndClassView.InsertItem(_T("m_wndStatusBar"),6,6,hClass);
hClass=m_wndClassView.InsertItem(_T("Globals"),2,2,hRoot);
m_wndClassView.InsertItem(_T("theFakeApp"),5,5,hClass);
m_wndClassView.Expand(hClass,TVE_EXPAND);
return0;
}
2、修改MainFrm.cpp
①OnCreate方法最后加入如下代码
CStringstr;
str.LoadString(ID_VIEW_NAV);
if(!
m_Nav.Create(str,this,CRect(0,0,200,200),TRUE,ID_VIEW_NAV,WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|CBRS_LEFT|CBRS_FLOAT_MULTI))
{
TRACE0("Failedtocreatenavigatewindow/n");
returnFALSE;//failedtocreate
}
m_Nav.EnableDocking(CBRS_ALIGN_ANY);
DockPane(&m_Nav);
//ID_VIEW_NAV是自定义的字符串资源
CDockablePane同CFormView类的联合使用方法
1、CFormView简介
①MFC提供了一个名为CFormView的特殊视图类,我们称其为表单视图.表单视图是指用控件来输入和输出数据的视图,用户可以方便地在表单视图中使用控件.表单视图具有对话框和滚动视图的特性,它使程序看起来象是一个具有滚动条的对话框.在有些情况下,用表单视图比用普通视图更符合用户的需要,例如,在向数据库输入数据时,显然用表单的形式可以更习惯些。
用AppWizard可以方便地创建基于表单视图的应用程序,只要在MFCAppWizard对话框的第六步先选择CView,然后在Baseclass栏中选择CFormView,AppWizard就会创建一个基于CFormView的应用程序.
②读者可以按上述方法建立一个名为Test的应用程序.在Test工程的资源中,读者会发现一个ID为IDD_TEST_FORM的对话框模板,该对话框模板可供用户放置和安排控件.在程序运行时,框架根据该对话框模板创建CFormView对象,并根据模板的信息在表单视图中自动创建控件.与设计对话框类相类似,用户可以用ClassWizard为表单视图类加入与控件对应的成员变量,可以调用UpdateData在控件和成员变量之间交换数据,但对控件的初始化工作是在OnInitialUpdate函数而不是在OnInitDialog函数中进行的。
③基于表单视图的应用程序与基于对话框的应用程序都是在应用程序中直接使用控件,但二者有很多不同之处.基于对话框的应用程序是用一个对话框来作为程序的主窗口的,因而程序的主窗口的特性与对话框类似,如窗口的大小不能改变,程序没有菜单条、工具条和状态栏等。
基于表单视图的应用程序仍然是基于Doc/View框架结构的,只是视图被换成了表单视图,也就是说,应用程序的窗口可以改变大小,程序有菜单条、工具条和状态栏,且程序仍然可以Dov/View运行机制来处理文档。
2、添加CDockablePane的派生类CDock,形式同前述。
3、添加CFormView的派生类。
①利用类向导,添加一个基类为CFormView的类CFrmView。
②为CFrmView分别重载Create函数和OnMouseActivate函数,前者是为了把Create函数重载为public,一行代码都不用写,后者是为了防止CDockablePane处于悬浮状态时程序崩溃(不重载必然崩溃!
)
intCFrmView:
:
OnMouseActivate(CWnd*pDesktopWnd,UINTnHitTest,UINTmessage)
{
//TODO:
在此添加消息处理程序代码和/或调用默认值
intnResult=0;
CFrameWnd*pParentFrame=GetParentFrame();
if(pParentFrame==pDesktopWnd)
{
//Whenthisisdocked
nResult=CFormView:
:
OnMouseActivate(pDesktopWnd,nHitTest,message);
}
else
{
//Whenthisisnotdocked
BOOLisMiniFrameWnd=
pDesktopWnd->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd));
BOOLisPaneFrameWnd=
pDesktopWnd->IsKindOf(RUNTIME_CLASS(CPaneFrameWnd));
BOOLisMultiPaneFrameWnd=
pDesktopWnd->IsKindOf(RUNTIME_CLASS(CMultiPaneFrameWnd));
//pDesktopWndistheframewindowforCDockablePane
nResult=CWnd:
:
OnMouseActivate(pDesktopWnd,nHitTest,message);
}
returnnResult;
}
4、向CDockablePane装东西
①在Dock.h添加protected类型的指针:
CFrmView*m_frmview
②在构造函数中添加
m_frmview=(CFrmView*)(RUNTIME_CLASS(CFrmView)->CreateObject());
③重载OnCreate函数和OnSize函数,前者是为初始化,后者是为设置frmview在dock中的显示大小,一般填充满。
intCDock:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
if(CDockablePane:
:
OnCreate(lpCreateStruct)==-1)
return-1;
//TODO:
在此添加您专用的创建代码
RECTrect;
GetClientRect(&rect);
m_frmview->Create(NULL,NULL,WS_CHILD|WS_VISIBLE,rect,this,0,NULL);
return0;
}
voidCDock:
:
OnSize(UINTnType,intcx,intcy)
{
CDockablePane:
:
OnSize(nType,cx,cy);
//TODO:
在此处添加消息处理程序代码
if(GetSafeHwnd()==NULL)
{
return;
}
if(m_frmview->GetSafeHwnd()!
=NULL)
{
CRectrect;
GetClientRect(rect);
m_frmview->SetWindowPos(NULL,rect.left,rect.top,rect.Width(),rect.Height(),SWP_NOACTIVATE|SWP_NOZORDER);
}
}
两个带图标的CDockablePane派生类与CFormView类的联合使用方法
1、利用类向导,添加两个基类为CDockablePane的类CDock1,CDock2。
2、在MainFrm.h中添加Dock1.h和Dock2.h的头文件;并派生两个子类
protected:
CDock1m_dock1;
CDock2m_dock2;
CDockablePane*m_pTabbedBar;
3、在MainFrm的OnCreate()里面添加:
(最好接着EnableAutoHidePanes(CBRS_ALIGN_ANY);这句后面添加)
if(!
m_dock1.Create("Dock1",this,CRect(0,0,300,300),true,IDD_FRMVIEW,WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|CBRS_LEFT|CBRS_FLOAT_MULTI))
{
TRACE0("Failedtocreatedock1window\n");
returnFALSE;
}
if(!
m_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CDockablePane 使用