CDockablePane类的使用.docx

上传人:b****8 文档编号:9495895 上传时间:2023-02-04 格式:DOCX 页数:37 大小:481.69KB
下载 相关 举报
CDockablePane类的使用.docx_第1页
第1页 / 共37页
CDockablePane类的使用.docx_第2页
第2页 / 共37页
CDockablePane类的使用.docx_第3页
第3页 / 共37页
CDockablePane类的使用.docx_第4页
第4页 / 共37页
CDockablePane类的使用.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

CDockablePane类的使用.docx

《CDockablePane类的使用.docx》由会员分享,可在线阅读,更多相关《CDockablePane类的使用.docx(37页珍藏版)》请在冰豆网上搜索。

CDockablePane类的使用.docx

CDockablePane类的使用

CDockablePane类的使用

 

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_dock2.Create("Dock2",this,CRect(0,0,300,300),true,IDD_FRMVIEW1,WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|CBRS_LEFT|CBRS_FLOAT_MULTI))

{

TRACE0("Failedtocreatedock2window\n");

returnFALSE;

}

BOOLbHiColorIcons=TRUE;//下面这几句用于添加标签的图标,IDR_SHJKTYPE为图标ID

HICONhdock1=(HICON):

:

LoadImage(:

:

AfxGetResourceHandle(),MAKEINTRESOURCE(bHiColorIcons?

IDR_SHJKTYPE

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 冶金矿山地质

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1