ImageVerifierCode 换一换
格式:DOCX , 页数:37 ,大小:481.69KB ,
资源ID:9495895      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9495895.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(CDockablePane类的使用.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

CDockablePane类的使用.docx

1、CDockablePane类的使用CDockablePane类的使用CDockablePane与对话框类联合使用方法1、新建对话框资源: 新建一个对话框资源IDD_DIALOG_DOCKDLG,Style设为Child,Border设为None; 把默认的OK和Cancel按键去掉,因为一般情况下点击这两个按钮后,对话框会销毁,而这里是不需要销毁的(如果没去掉点击了,悬浮框中的对话框内容就不能用了); 如下添加一个按钮IDC_BUTTON_TEST,后为对话框添加类CTestDlg; 为按钮添加响应void CTestDlg:OnBnClickedButtonTest() / TODO: Ad

2、d your control notification handler code here MessageBox(_T(Hello World!);2、派生CDockablePane类 添加继承自CDockablePane的类CMyPane 添加此类的WM_CREATE和WM_SIZE消息响应,并添加上面对话框的成员变量CTestDlg m_TestDlg; 在CMyPane:OnCreate和CMyPane:OnSize函数中添加代码int CMyPane:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CDockablePane:OnCreate(l

3、pCreateStruct) = -1) return -1; / TODO: Add your specialized creation code here CRect rectDummy; rectDummy.SetRectEmpty(); / 创建选项卡窗口: if (!m_TestDlg.Create(IDD_DIALOG_DOCKDLG,this) TRACE0(未能创建输出选项卡窗口/n); return -1; / 未能创建 m_TestDlg.ShowWindow(SW_SHOW); return 0;void CMyPane:OnSize(UINT nType, int cx

4、, int cy) CDockablePane:OnSize(nType, cx, cy); / TODO: Add your message handler code here / 选项卡控件应覆盖整个工作区 m_TestDlg.SetWindowPos (this, -1, -1, cx, cy, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER); m_TestDlg.ShowWindow(SW_SHOW);3、修改MainFrame类 然后在MainFrame.h代码中添加成员变量CMyPane m_MyPane; 在CMainFrame:OnCre

5、ate函数中添加代码if (!m_wndStatusBar.Create(this) TRACE0(Failed to create status barn); return -1; / fail to createm_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_CLIP

6、SIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI) TRACE0(未能创建输出窗口/n); return FALSE;m_MyPane.EnableDocking(CBRS_ALIGN_ANY);/ TODO: Delete these five lines if you dont want the toolbar and menubar to be dockablem_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);m_wndToolBar.EnableDocking(CBRS_ALIGN_A

7、NY);EnableDocking(CBRS_ALIGN_ANY);DockPane(&m_wndMenuBar);DockPane(&m_wndToolBar);DockPane(&m_MyPane); / 调整m_MyPane的大小使之适合父窗口4、运行结果5、补充 CDockablePane派生类销毁时,对话框也销毁掉(没有试验) void ControlPanel:OnDestroy() CDockablePane:OnDestroy(); / TODO: Add your message handler code here m_dlg.DestroyWindow(); CDockab

8、lePane派生类对象的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继承,创建一

9、个自定义类CNavView CNavView.h的代码#pragma once/ CNavViewclass CNavView : public CDockablePane DECLARE_DYNAMIC(CNavView)public: CNavView(); virtual CNavView();protected: afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnSize(UINT nType, int cx, int cy);public: CTreeCtrl m_wndClassView; voi

10、d AdjustLayout();protected: DECLARE_MESSAGE_MAP(); CNavView.cpp的代码/ NavView.cpp : implementation file/#include stdafx.h#include MDISample.h#include NavView.h/ CNavViewIMPLEMENT_DYNAMIC(CNavView, CDockablePane)CNavView:CNavView()CNavView:CNavView()BEGIN_MESSAGE_MAP(CNavView, CDockablePane) ON_WM_CREA

11、TE() ON_WM_SIZE()END_MESSAGE_MAP()void CNavView:OnSize(UINT nType, int cx, int cy) CDockablePane:OnSize(nType, cx, cy); AdjustLayout();void CNavView:AdjustLayout() if (GetSafeHwnd() = NULL) return; CRect rectClient; GetClientRect(rectClient); int cyTlb = 3; m_wndClassView.SetWindowPos(NULL, rectClie

12、nt.left + 1, rectClient.top + cyTlb + 1, rectClient.Width() - 2, rectClient.Height() - cyTlb - 2, SWP_NOACTIVATE | SWP_NOZORDER);/ CNavView message handlersint CNavView:OnCreate(LPCREATESTRUCT lpCreateStruct) CRect rectDummy; rectDummy.SetRectEmpty(); / Create views: const DWORD dwViewStyle = WS_CHI

13、LD | WS_VISIBLE | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; if (!m_wndClassView.Create(dwViewStyle, rectDummy, this, 2) TRACE0(Failed to create Class View/n); return -1; / fail to create HTREEITEM hRoot = m_wndClassView.InsertItem(_T(FakeApp classes), 0, 0)

14、; m_wndClassView.SetItemState(hRoot, TVIS_BOLD, TVIS_BOLD); HTREEITEM hClass = 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, hRoo

15、t); 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

16、); 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,

17、 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)

18、; 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);

19、m_wndClassView.Expand(hClass, TVE_EXPAND); return 0;2、修改MainFrm.cpp OnCreate方法最后加入如下代码CString str;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(Failed

20、 to create navigate window/n); return FALSE; / failed to createm_Nav.EnableDocking(CBRS_ALIGN_ANY);DockPane(&m_Nav);/ ID_VIEW_NAV是自定义的字符串资源CDockablePane同CFormView类的联合使用方法1、CFormView简介 MFC提供了一个名为CFormView的特殊视图类,我们称其为表单视图表单视图是指用控件来输入和输出数据的视图,用户可以方便地在表单视图中使用控件表单视图具有对话框和滚动视图的特性,它使程序看起来象是一个具有滚动条的对话框在有些情况

21、下,用表单视图比用普通视图更符合用户的需要,例如,在向数据库输入数据时,显然用表单的形式可以更习惯些。用AppWizard可以方便地创建基于表单视图的应用程序,只要在MFC AppWizard对话框的第六步先选择CView,然后在Base class栏中选择CFormView,AppWizard就会创建一个基于CFormView的应用程序 读者可以按上述方法建立一个名为Test的应用程序在Test工程的资源中,读者会发现一个ID为IDD_TEST_FORM的对话框模板,该对话框模板可供用户放置和安排控件在程序运行时,框架根据该对话框模板创建CFormView对象,并根据模板的信息在表单视图中自

22、动创建控件与设计对话框类相类似,用户可以用ClassWizard为表单视图类加入与控件对应的成员变量,可以调用UpdateData在控件和成员变量之间交换数据,但对控件的初始化工作是在OnInitialUpdate函数而不是在OnInitDialog函数中进行的。 基于表单视图的应用程序与基于对话框的应用程序都是在应用程序中直接使用控件,但二者有很多不同之处基于对话框的应用程序是用一个对话框来作为程序的主窗口的,因而程序的主窗口的特性与对话框类似,如窗口的大小不能改变,程序没有菜单条、工具条和状态栏等。基于表单视图的应用程序仍然是基于Doc/View框架结构的,只是视图被换成了表单视图,也就是

23、说,应用程序的窗口可以改变大小,程序有菜单条、工具条和状态栏,且程序仍然可以Dov/View运行机制来处理文档。2、添加CDockablePane的派生类CDock,形式同前述。3、添加CFormView的派生类。利用类向导,添加一个基类为CFormView的类CFrmView。 为CFrmView分别重载Create函数和OnMouseActivate函数,前者是为了把Create函数重载为public,一行代码都不用写,后者是为了防止CDockablePane处于悬浮状态时程序崩溃(不重载必然崩溃!)int CFrmView:OnMouseActivate(CWnd* pDesktopWn

24、d, UINT nHitTest, UINT message) / TODO: 在此添加消息处理程序代码和/或调用默认值 int nResult = 0; CFrameWnd* pParentFrame = GetParentFrame(); if( pParentFrame = pDesktopWnd ) / When this is docked nResult= CFormView:OnMouseActivate(pDesktopWnd, nHitTest, message); else / When this is not docked BOOL isMiniFrameWnd = pD

25、esktopWnd-IsKindOf(RUNTIME_CLASS(CMiniFrameWnd); BOOL isPaneFrameWnd = pDesktopWnd-IsKindOf(RUNTIME_CLASS(CPaneFrameWnd); BOOL isMultiPaneFrameWnd = pDesktopWnd-IsKindOf(RUNTIME_CLASS(CMultiPaneFrameWnd); / pDesktopWnd is the frame window for CDockablePane nResult = CWnd:OnMouseActivate( pDesktopWnd

26、, nHitTest, message ); return nResult;4、向CDockablePane装东西 在Dock.h添加protected类型的指针:CFrmView *m_frmview 在构造函数中添加m_frmview = (CFrmView*)(RUNTIME_CLASS(CFrmView)-CreateObject(); 重载OnCreate函数和OnSize函数,前者是为初始化,后者是为设置frmview在dock中的显示大小,一般填充满。int CDock:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CDockablePa

27、ne:OnCreate(lpCreateStruct) = -1) return -1; / TODO: 在此添加您专用的创建代码 RECT rect; GetClientRect(&rect); m_frmview-Create(NULL, NULL, WS_CHILD|WS_VISIBLE, rect, this, 0, NULL); return 0;void CDock:OnSize(UINT nType, int cx, int cy) CDockablePane:OnSize(nType, cx, cy); / TODO: 在此处添加消息处理程序代码 if (GetSafeHwnd

28、() = NULL) return; if(m_frmview-GetSafeHwnd()!=NULL) CRect rect; 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中添加Dock

29、1.h和Dock2.h的头文件;并派生两个子类protected: CDock1 m_dock1; CDock2 m_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_L

30、EFT | CBRS_FLOAT_MULTI) TRACE0(Failed to create dock1 windown); return FALSE;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(Failed to create dock2 windown); return FALSE;BOOL bHiColorIcons=TRUE; /下面这几句用于添加标签的图标,IDR_SHJKTYPE 为图标IDHICON hdock1=(HICON) :LoadImage(:AfxGetResourceHandle(), MAKEINTRESOURCE(bHiColorIcons ? IDR_SHJKTYPE

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

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