CDockablePane的使用方法及消除关闭按钮
MFC浮动窗口使用方法和注意事项

MFC浮动窗⼝使⽤⽅法和注意事项使⽤VS2008+SP1创建悬浮窗⼝的步骤:1. 创建悬浮窗⼝类每⼀个悬浮窗⼝都是⼀个CDockablePane的派⽣类的对象, 因此要为每⼀个悬浮窗⼝创建⼀个新类1.1 添加类通过菜单Project->Add Class...或者在类视图中⼯程名字处右键选择Add->Class...添加类选择MFC Class, 点Add按钮进⼊下⼀步Class name处写⼊新类的名字, 这⾥⽤CDock, 选择Base class为CDockablePane按Finish按钮, 添加类完成.1.2 添加消息处理函数⼀般⾄少要处理两个消息, ⼀个是WM_CREATE, ⼀个是WM_SIZE, 具体步骤为:(1) 头⽂件中添加函数声明(函数名及参数不可写错)protected:afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);afx_msg void OnSize(UINT nType, int cx, int cy);(2) cpp⽂件中添加消息映射BEGIN_MESSAGE_MAP(CDock, CDockablePane)ON_WM_CREATE()ON_WM_SIZE()END_MESSAGE_MAP()这⾥BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏都是⾃动⽣成的, 只需要添加中间两⾏代码即可(3) 添加函数实现部分int CDock::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CDockablePane::OnCreate(lpCreateStruct) == -1)return -1;// 在这⼉创建控件return 0;}void CDock::OnSize(UINT nType, int cx, int cy){CDockablePane::OnSize(nType, cx, cy);// 这⼉添加代码}1.3 添加控件现在创建的CDock类中由于没有任何控件, 因此如果现在创建该类的对象并显⽰, 该区域中由于全是垃圾数据, 故可能该窗⼝显⽰时为花屏. 如果程序运⾏期间出现类似花屏的问题, ⼤概会有⼏种可能性: 1. 没有创建控件 2. 已创建控件, 但控件位置不对或未覆盖整个的dockablePane 3. 控件虽然占据整个区域, 但不能⾃动刷新这⾥以添加⼀个listBox为例:(1) 在类的头⽂件中添加控件对象, 代码为:protected:CListBox _listBox;(2) 在OnCreate()中添加创建控件窗⼝的代码:这⾥必须要注意, 需要先调⽤基类的函数OnCreate()int CDock1::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CDockablePane::OnCreate(lpCreateStruct) == -1)return -1;// 在这⼉创建控件// nID为该控件的ID, 可以⾃⾏设置, 如果对ID不感兴趣, 也可以选择传递0让系统做处理if (!_listBox.Create(WS_CHILD | WS_VISIBLE, CRect(0, 0, 0, 0), this, nID)){TRACE0("创建listbox失败");return -1;}return 0;}(3) 在OnSize中设置各个控件的位置这⾥要注意的是, 需要将控件布满整个窗⼝. 这⾥只有⼀个listBox, 故可以直接⽤listBox覆盖窗⼝.同理, 必须要先调⽤基类函数CDockablePane::OnSize(nType, cx, cy)void CDock::OnSize(UINT nType, int cx, int cy){CDockablePane::OnSize(nType, cx, cy);// 这⼉添加代码if (GetSafeHwnd() == NULL){return;}if (_listBox.GetSafeHwnd() != NULL){CRect rectClient;GetClientRect(rectClient);_listBox.SetWindowPos(NULL, rectClient.left, rectClient.top, rectClient.Width(), rectClient.Height(), SWP_NOACTIVATE | SWP_NOZORDER);}}2. 在程序中添加悬浮窗⼝对象上⾯⼀步只是给⼯程添加了⼀个悬浮窗⼝类, 但并没⽣成该类的实例. 这⾥创建该实例(在CMainFrame类中)2.1 在主框架类声明中添加对象, 代码为:protected:CDock m_wndDock;2.2 创建dockablePane的窗⼝, 在主框架的OnCreate()函数中(注: 这⾥我建议在OnCreate函数中⾃动⽣成代码EnableAutoHidePanes(CBRS_ALIGN_ANY)的后⾯添加)int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){...EnableAutoHidePanes(CBRS_ALIGN_ANY);// 利⽤这⾥的CBRS_RIGHT来设置最初的窗⼝停靠的位置, 可以的取值是// CBRS_NOALIGN, CBRS_LEFT, CBRS_TOP, CBRS_RIGHT, CBRS_BOTTOMDWORD style = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_RIGHT |CBRS_FLOAT_MULTI;if (!wndDock1.Create(// 该dock窗⼝的标题(如果可以有的话...)_T("Dock1"),// 该dock窗⼝的parent, 设置为thisthis,// 窗⼝的⼤⼩, 注意是"悬浮"的情况下的⼤⼩, 处于dock状态时⼤⼩与该值⽆关CRect(0, 0, 200, 200),// 该dock窗⼝是否有标题, 如果为FALSE, 则第⼀个字符串参数显⽰不出来TRUE,// 该dock窗⼝的ID值. 注意: 如果希望dock窗⼝的状态可以保存在注册表中(这样下次启动程序时仍保持该状态), 则该值必须的唯⼀的nID,//style)){return FALSE;}...}2.3去掉CDockablePane的Close按钮?⽅法⼀:在继承CDockablePane的类中重写CanBeClosed()⽅法:virtual BOOL CanBeClosed() const; ... BOOL COutputWnd::CanBeClosed() const { return FALSE;}⽅法⼆:if (!m_wndView.Create(strFileView, this, CRect(0, 0, 250, 200), TRUE, ID_VIEW_VIEW,WS_CHILD | WS_VISIBLE | CBRS_LEFT | CBRS_HIDE_INPLACE | WS_CAPTION, AFX_CBRS_REGULAR_TABS, AFX_CBRS_RESIZE))在Create的时候后⾯加上这样的参数设置AFX_CBRS_REGULAR_TABS, AFX_CBRS_RESIZE 就不会有那个关闭按钮了2.4显⽰隐藏CDockablePanem_wndFileView.ShowPane(TRUE,FALSE,TRUE);//显⽰m_wndFileView.ShowPane(FALSE,FALSE,TRUE);//隐藏2.5 给悬浮窗⼝添加icon, 暂时省略.3. 设置窗⼝悬浮⽅式, 令窗⼝悬浮3.1 设置窗⼝悬浮位置这部分代码也应该在MainFrame类的OnCreate函数中, ⽽且紧跟创建悬浮窗⼝的后⾯.设置悬浮位置只需要调⽤CDockablePane::EnableDocking即可m_wndDock.EnableDocking(CBRS_ALIGN_ANY);其中, 参数可以是CBRS_ALIGN_TOP, CBRS_ALIGN_RIGHT, CBRS_ALIGN_BOTTOM, CBRS_ALIGN_ANY3.2 令窗⼝悬浮欲使⼀个CDockablePane对象悬浮, 只需要调⽤框架类的DockPane函数即可:DockPane(&m_wndDock);但是若有另外⼀个悬浮窗⼝的对象需要和m_wndDock在⼀起显⽰, 构成⼀个组(就像VS的资源视⼒和类视图), 那么第⼆个悬浮窗⼝需要使⽤CDockablePane类的AttchToTabWnd函数, 代码如下:DockPane(&m_wndDock);CDockablePane *pTabbedBar = NULL;m_wndDock2.AttachToTabWnd(&m_wndDock, DM_SHOW, FALSE, &pTabbedBar);CDockablePane 使⽤这个是转载的int m_nshowCurrent;m_nshowCurrent=theApp.GetProfileInt(_T("Workspace//Pane-377"),_T("IsFloating"),0); //在构造函数中⾸先派⽣两个⼦类,源码就不⽤写出来了,占篇幅,在MainFrm⾥申明如:CCurrentDockablePane m_wndCurrentDockablePane;CHistoryDockablePane m_wndHistoryDockablePane;CDockablePane* m_pTabbedBar;然后在OnCreate()⾥⾯:CString strHistoryDockablePane;CString strCurrentView;strCurrentView.LoadString(IDS_Current_VIEW);strHistoryDockablePane.LoadString(IDS_History_VIEW);if (!m_wndHistoryDockablePane.Create(strHistoryDockablePane, this, CRect(0, 0, 200, 200),TRUE, ID_VIEW_HistoryDockablePane, 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}if (!m_wndCurrentDockablePane.Create(strCurrentView, this, CRect(0, 0, 200, 200),TRUE, ID_VIEW_CurrentView, 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}再给她们添加图标:HICON hHistoryDockablePaneIcon = (HICON) ::LoadImage(::AfxGetResourceHandle(),MAKEINTRESOURCE(bHiColorIcons ? IDI_history : IDI_history), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON),::GetSystemMetrics(SM_CYSMICON), 0);m_wndHistoryDockablePane.SetIcon(hHistoryDockablePaneIcon, FALSE);HICON hCurrentViewIcon = (HICON) ::LoadImage(::AfxGetResourceHandle(),MAKEINTRESOURCE(bHiColorIcons ? IDI_Currrently : IDI_Currrently), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON),::GetSystemMetrics(SM_CYSMICON), 0);m_wndCurrentDockablePane.SetIcon(hCurrentViewIcon, FALSE);m_wndHistoryDockablePane.EnableDocking(CBRS_ALIGN_ANY);m_wndCurrentDockablePane.EnableDocking(CBRS_ALIGN_ANY);DockPane(&m_wndHistoryDockablePane);DockPane(&m_wndCurrentDockablePane);m_pTabbedBar = NULL;m_wndCurrentDockablePane.AttachToTabWnd(&m_wndHistoryDockablePane, DM_SHOW, FALSE, &m_pTabbedBar);相关显⽰代码就这样的了.后来⽼⼤说关闭需要修改⼯具栏⾥的显⽰状态,即去掉对勾.在⼯具栏⾥控制他们的显⽰和隐藏简单啊,就是⽤m_wndCurrentDockablePane.ShowPane(TRUE,FALSE,TRUE);可是关闭再去修改⼯具栏想了半天,以为要重载CDockablePane的Close()消息,⼜尝试了他的很多消息,都不对.跟踪进去才知道是调⽤MainFrm来关闭的.⾥⾯有pMainfrm.onCloseDockingPane(this);好了,我就重载这个⽅法.BOOL CMainFrame::OnCloseDockingPane( CDockablePane* pWnd ){CWnd * pfWnd = pWnd->GetFocus();if (*pfWnd == m_wndCurrentDockablePane){m_nshowCurrent = 0;}else if(*pfWnd == m_wndHistoryDockablePane){m_nshowHistory = 0;}return TRUE;}这样⼯具栏⾥⾯的信息就更新了.呵呵,⾼兴的太早了,才做了⼀半,当两个⾯板拆开,即处于浮动状态时关闭根本就不调⽤这⾥.⼜郁闷了半天,还是⽼⼤⽜逼,说那种情况是OnCloseMiniFrame,于是有如下重载:BOOL CMainFrame::OnCloseMiniFrame( CPaneFrameWnd* pWnd ){CWnd *ptWnd = pWnd->GetWindow( GW_CHILD );if (*ptWnd ==m_wndCurrentDockablePane){m_nshowCurrent = 0;}else if (*ptWnd == m_wndHistoryDockablePane){m_nshowHistory = 0;}return TRUE;}//写注册表,在析构函数中theApp.WriteProfileInt(_T("Workspace//Pane-377"),_T("IsFloating"),m_nshowCurrent);。
关于OnOK()、OnCancel()、OnClose()、OnDestroy() 模式对话框

关于OnOK()、OnCancel()、OnClose()、OnDestroy() 模式对话框总结OnOK()、OnCancel()、OnClose()、OnDestroy()之间的区别(转)2009年09月22日下午08:33第一,OnOK()和OnCancel()是CDialog基类的成员函数,而OnClose()和OnDestroy()是CWnd基类的成员函数,即WM消息响应函数。
从应用程序结构的角度,拿对话框来说,红色的X对应的是CWnd,而处于对话框中的“确定”、“取消”按钮则对应了CDialog。
第二,OnClose()和OnDestroy()在单视图程序中,根据<<深入浅出MFC>>所讲,程序退出时执行的操作顺序为(从点X按钮开始)(1)用户点击X退出按钮,发送了WM_CLOSE消息----->响应OnClose()(2)在WM_CLOSE消息的处理函数中,调用DestroyWindow()----->销毁与指定CWnd窗口对象关联的窗口,但未销毁CWnd对象(3)在DestroyWindow()中发送了WM_DESTROY消息----->窗口销毁后响应OnDestroy()(4)在WM_DESTROY消息中调用PostQuitMessage(),发送WM_QUIT消息,结束消息循环可以看到,程序的退出过程,是先响应OnClose(),然后响应OnDestroy(),在响应OnDestroy()之前,窗口对象已经被销毁。
OnDestroy()到底干了什么呢?它就像一个teller,先通知CWnd 对象告诉它即将被销毁,尔后OnDestroy的真正运行是在CWnd对象已经从屏幕上清除以后被调用的。
第三,OnOK()、OnCancel()()、OnClose()、OnDestroy()CDialog::OnOK首先调用UpdateData(TRUE)将数据传给对话框成员变量,然后调用CDialog::EndDialog关闭对话框;CDialog::OnCancel只调用CDialog::EndDialog关闭对话框;OnClose()是响应WM_CLOSE 的.一定程度上可以说CDialog::EndDialog()和OnClose()完成类似的工作,但处理的机制不一样,前者是CDialog的对象机制,后者是WM 的消息映射机制。
el-tabs最中closable方法

el-tabs最中closable方法全文共四篇示例,供读者参考第一篇示例:el-tabs是一个常用的Vue组件,用于制作选项卡页签。
el-tabs提供了许多方便的方法和属性,其中一个非常有用的方法就是最中closable方法。
本文将介绍el-tabs最中closable方法的用法和作用。
让我们来了解一下el-tabs组件的基本用法和结构。
el-tabs组件是一个容器组件,包含多个el-tab-pane子组件,每个el-tab-pane代表一个选项卡页签。
用户可以通过点击不同的选项卡来切换内容。
el-tabs组件提供了许多属性用于定制化样式和功能,其中一个常用的属性就是closable。
closable属性用于设置选项卡是否可关闭,如果设置为true,则选项卡右侧会出现一个关闭按钮,用户可以点击该按钮来关闭选项卡。
但是有时候我们需要在特定的情况下控制选项卡是否可关闭,这时就可以使用最中closable方法。
最中closable方法是一个回调函数,接收一个参数tab,表示当前要关闭的选项卡。
我们可以在最中closable方法中对tab进行判断,决定是否关闭选项卡。
下面我们来看一个简单的例子,演示如何使用最中closable方法来控制选项卡是否可关闭:```html<template><el-tabs v-model="activeName"@tab-remove="handleTabRemove"><el-tab-pane v-for="tab intabs" :key="" :label="bel" :name="" closable>{{ tab.content }}</el-tab-pane></el-tabs></template><script>export default {data() {return {activeName: '1',tabs: [{ name: '1', label: 'Tab 1', content: 'Content 1' },{ name: '2', label: 'Tab 2', content: 'Content 2' },{ name: '3', label: 'Tab 3', content: 'Content 3' },]}},methods: {handleTabRemove(tab) {if ( !== '1') {alert('Tab cannot be closed!');} else {// 允许关闭选项卡return true;}}}}</script>```在上面的例子中,我们通过最中closable方法handleTabRemove来控制选项卡是否可关闭。
卓为VC——界面窗口——VC对话框小知识

卓为VC——界面窗口——VC对话框小知识一、对话框属性:1.Styles->Clip siblings:排除子窗口之间的相对区域,也就是,当一个特定的窗口接收到绘图消息时,将所有重叠窗口排除在外,只重绘指定的子窗口。
Styles->Clip children:当在父窗口内绘图时,排除子窗口区域。
2.More StylesSystem modal:系统模式对话框Absolute align:坐标相对于屏幕原点Set foreground:设置为前台窗口No fail create:应用于Windows 95No idle message:不发送空闲消息Control:不使用标题栏的对话框Center:在屏幕中心显示对话框Center mouse:以鼠标坐标为对话框中心显示对话框Local edit:指定编辑控件的正文将存储于应用程序的局部数据段中3.Extended StylesTool Window:工具栏窗体Client edge:对话框边框下凹Static edge:对话框边框为实边框Accept files:是否接受文件拖放Control parent:用<Tab>键在窗口的子窗口间搜索Context help:在窗口标题栏添加一个问号按钮No parent notify:以这个风格创建的窗口在创建和销毁时,不向父窗口发送 WM_PARENTNOTFY消息二、对话框的创建与显示1.模态对话框:CDlg dlg;dlg.DoModal();CDialog::OnOK();//或CDialog::OnCancel() 关闭模态对话框2.非模态对话框CDlg *dlg=new CDlg;dlg->Create(IDD_DIALOG,this);dlg->ShowWindow(SW_SHOW);dlg->DestroyWindow(); //销毁非模态对话框,若在一个非模态对话框中实现OnCancel方法,需在内部调用DestroyWindow方法,不要调用基类的OnCancel方法,因为它调用EndDialog方法将使对话框不可见,但不销毁对话框。
c井tabcontrol中某一个tabpages的隐藏与显示

c# tabcontrol中某一个tabpages的隐藏与显示这个控件只能把它从这tabControl1中去掉就可以达到隐藏的效果。
this.tabControl1.TabPages.Remove(this.tabPage2);这样一句就可以了。
不用担心,把tabPage2彻底的移除,只是暂时把它从tabControl1中移掉了,如果还想让它显示这样就可以:this.tabControl1.TabPages.Add(this.tabPage2);如果把tabPage2设置成置于最前:this.tabControl1.SelectedTab = this.tabPage2;经过尝试可以以如下方式实现TabControl的标签隐藏:在窗体Load事件中添加:this.tabControl1.Region = new Region(new RectangleF(this.tabPage1.Left, this.tabPage1.Top, this.tabPage1.Width, this.tabPage1.Height));以上代码完成标签的隐藏,但还存在一个问题,就是Tab + Ctrl 可以切换TabControl中的页,可以通过捕捉按键消息屏蔽组合键:protected override bool ProcessCmdKey(ref Message msg, Keys keyData){switch (keyData){case (Keys.Tab | Keys.Control):return true;default:break;}return base.ProcessCmdKey(ref msg, keyData);}以上两步即可实现T abControl 标签的隐藏,如果要效果理想,可以调整TabControl 的appearance属性设置TabControl 的绘制方式。
C# TEXTBOX控制两则(1)判断textbox里边输入的是全角还是半角public bool IsQuanJiao(string checkString){if (2 * checkString.Length == Encoding.Default.GetByteCount(checkString)) {return true;}else{return false;}}(2)控制textbox里边只输入数字void textboxnum(KeyPressEventArgs e){if ((e.KeyChar > (char)47 && e.KeyChar < (char)58) || e.KeyChar == (char)8) {e.Handled = false;}else{e.Handled = true;}}private void TEXTBOX1_KeyPress(object sender, KeyPressEventArgs e){textboxnum(e);}。
eclipse常用方法和快捷键说明

代码提示菜单Window -> Perferences…-> General -> keys,在中间的列表中选中Command名称为Content Asssist的项,在下面的Binding中按下需要设置的快捷键,如下图的:Shift + Space,然后点Apply或OK保存设置。
快捷键设置完成后点击列表列表的Binding按快捷键名称排序,看看有没有和其他快捷键设重复。
代码提示的常用模板可以在该Perferences窗口的Java -> Editor -> Templates中找到,如Templates列表中第一项,Name为main的项,其下面的Preview中的内容为一个main方法的模板。
编辑页面会弹出提示面板,选择需要的提示项后回车确定。
此时Eclipse会自动为我们生成这个main方法的模板:快速执行main、test等如果我们写了一个测试用的main方法,需要马上执行,可以点工具栏中的执行Main方法的按钮也可以利用快捷键快速执行:Alt + Shirt + X,放开后键入J,默认会执行当前编辑java类中的main方法。
如果当前编辑的是一个JUnit测试类,则可以使用Alt + Shirt + X,放开后键入T,快速执行该JUnit类中的测试方法。
文件定位,展开、收起项目树在树形结构的项目中快速定位当前编辑的文件:按下左侧面板中的按钮,项目树将展开并高亮显示当前文件。
要收起展开的树可以点击前面的按钮。
添加视图不小心关闭了控制台或需要使用eclipse提供的其它视图,点菜单Window –> Show View,选择需要添加的视图。
文件在本地的历史版本对于删除了且尚未上传到CVS或SVN的文件,右键点击文件所在的文件夹选中Restory fromLocal History…,选择需要恢复的文件。
如果想查看文件在本地的历史信息,可以右键点击该文件,选择Team -> Show Local History高亮显示类中的选中对象按下工具栏中的按钮或使用快捷键Alt + Shift + O,打开或关闭类中光标当前内容的高亮显示,如下图中的allShowChildren对象。
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)VS2010 DockablePane 每次打开都自动隐藏 (29)EnableDocking函数解释 (30)CDockablePane与对话框类联合使用方法1、新建对话框资源:①新建一个对话框资源IDD_DIALOG_DOCKDLG,Style设为Child,Border设为None;②把默认的OK和Cancel按键去掉,因为一般情况下点击这两个按钮后,对话框会销毁,而这里是不需要销毁的(如果没去掉点击了,悬浮框中的对话框内容就不能用了);③如下添加一个按钮IDC_BUTTON_TEST,后为对话框添加类CTestDlg;④为按钮添加响应void CTestDlg::OnBnClickedButtonTest(){// TODO: Add your control notification handler code hereMessageBox(_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(lpCreateStruct) == -1)return -1;// TODO: Add your specialized creation code hereCRect 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, 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::OnCreate函数中添加代码if (!m_wndStatusBar.Create(this)){TRACE0("Failed to create status bar\n");return -1; // fail to create}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");return FALSE;}m_MyPane.EnableDocking(CBRS_ALIGN_ANY);// TODO: Delete these five lines if you don't want the toolbar and menubar to be dockable 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派生类销毁时,对话框也销毁掉(没有试验)void ControlPanel::OnDestroy(){CDockablePane::OnDestroy();// TODO: Add your message handler code herem_dlg.DestroyWindow();}②CDockablePane派生类对象的Create函数里面的666是这个停靠栏的ID,这里是随便指定的一个数值,只要不和其他已用资源重复即可,真正应用的时候,以在字符串表中添加一个ID,前面使用的是对话框的IDDm_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的代码#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;void 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_CREATE()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, rectClient.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_CHILD | 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);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, 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);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 to create navigate window/n");return FALSE; // failed to create}m_Nav.EnableDocking(CBRS_ALIGN_ANY);DockPane(&m_Nav);// ID_VIEW_NAV是自定义的字符串资源CDockablePane同CFormView类的联合使用方法1、CFormView简介①MFC提供了一个名为CFormView的特殊视图类,我们称其为表单视图.表单视图是指用控件来输入和输出数据的视图,用户可以方便地在表单视图中使用控件.表单视图具有对话框和滚动视图的特性,它使程序看起来象是一个具有滚动条的对话框.在有些情况下,用表单视图比用普通视图更符合用户的需要,例如,在向数据库输入数据时,显然用表单的形式可以更习惯些。
cmfcbutton 用法 -回复

cmfcbutton 用法-回复如何使用cmfcbutton。
cmfcbutton是MFC(Microsoft Foundation Classes)框架中的一个控件,它用于创建按钮控件并添加各种自定义属性和功能。
在本文中,我将逐步介绍如何使用cmfcbutton,并提供一些具体示例,以帮助您更好地理解和应用cmfcbutton控件。
首先,我们需要创建一个MFC应用程序,并在您的项目中添加cmfcbutton控件。
要添加cmfcbutton控件,您需要打开资源视图,并将控件从工具箱拖放到您的对话框或窗体中。
一旦您将cmfcbutton控件添加到对话框中,您可以通过右键单击该控件并选择“属性”来访问控件的属性。
在属性页中,您可以设置按钮的外观、行为和其他属性。
下面是一些常用的属性,您可以根据自己的需求进行调整:1. ID: 按钮的唯一标识符,您可以使用它来识别按钮并在代码中处理按钮的点击事件。
2. Caption: 按钮上显示的文本。
3. Style: 按钮的样式,例如扁平样式、勾选样式等。
4. Image: 按钮上显示的图像,您可以为按钮添加一个图像,以替代文本。
5. Size: 按钮的大小,这包括宽度和高度。
一旦您设置了按钮的属性,您可以在代码中处理按钮的点击事件。
要处理点击事件,您需要编辑对话框的类文件(通常是CYourDialogClass.cpp),并添加一个函数来处理按钮的点击事件。
为了创建一个按钮点击事件处理函数,您可以在类文件中使用类向导,或手动添加一个相应的函数。
下面是一个示例:void CYourDialogClass::OnBnClickedButton(){处理按钮的点击事件}在这个函数中,您可以编写处理按钮点击事件的代码。
您可以执行任何操作,例如打开一个新的对话框、执行一些计算、显示一些消息等。
另外,您还可以为按钮添加其他事件处理函数,例如鼠标悬停事件、鼠标右键事件等。
这将增加按钮的交互性和功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CDockablePane类可以用来创建停靠栏。
可以将其他控件集成到CDockablePane的派生类中。
本文描述如何将对话框集成到CDockablePane中。
集成其他控件的方式类似。
1、首先创建多文档应用程序,创建一个对话框类CTestDlg。
2、在程序添加一个停靠栏类,名为ControlPanel,其父类为CDockablePane,在该类中添加对话框成员。
需要将对话框的style设置为child。
另外border设置为none的话,得到的界面看上去会更主流一点。
1:class ControlPanel : public CDockablePane
2: {
3: .....
4:public:
5: CTestDlg m_dlg;
6: };
3、在ControlPanel的OnCreate方法中创建并显示对话框。
1:int ControlPanel::OnCreate(LPCREATESTRUCT lpCreateStruct)
2: {
3:if (CDockablePane::OnCreate(lpCreateStruct) == -1)
4:return -1;
5:
6:// TODO: Add your specialized creation code here
7:
8: m_dlg.Create(IDD_DIALOG_TEST,this);
9: m_dlg.ShowWindow(SW_SHOW);
10:return 0;
11: }
4、ControlPanel销毁时,对话框也销毁掉:
1:void ControlPanel::OnDestroy()
2: {
3: CDockablePane::OnDestroy();
4:
5:// TODO: Add your message handler code here
6: m_dlg.DestroyWindow();
7: }
5、ControlPanel尺寸变化、隐藏的时候,对话框也要做相关处理:
1:void ControlPanel::OnSize(UINT nType, int cx, int cy)
2: {
3: CDockablePane::OnSize(nType, cx, cy);
4:
5:// TODO: Add your message handler code here
6:if(m_dlg.GetSafeHwnd())
7: {
8: CRect rct;
9: GetClientRect(rct);
10: m_dlg.MoveWindow(rct);
11: }
12: }
6、在框架类中添加ControlPanel成员:
1:class CMainFrame : public CMDIFrameWndEx
2: {
3: ...
4: ControlPanel m_Panel;
5: ...
6: };
7、在框架类创建时,创建这个ControlPanel对象:
Create函数里面的666是这个停靠栏的ID,这里是随便指定的一个数值,只要不和其他已用资源重复即可,真正应用的时候,以在字符串表中添加一个ID。
1:int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
2: {
3: ...
4: m_Panel.Create(_T("tset"),this,CRect(0,0,300,300),TRUE,666,
5: WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI);
6: m_Panel.EnableDocking(CBRS_ALIGN_ANY);
7:
8: EnableDocking(CBRS_ALIGN_ANY);
9: DockPane(&m_Panel);
10: ...
11: }
编译运行后,可以发现框架中添加了一个停靠栏,之前创建的那个对话框嵌入在里面。
如何去掉CDockablePane的Close按钮
方法一:
在继承CDockablePane的类中重写CanBeClosed()方法:
virtual BOOL CanBeClosed() const;
...
BOOL COutputWnd::CanBeClosed() const
{
return FALSE;
}
方法二:
if (!m_wndView.Create(strFileView, this, CRect(0, 0, 250, 200), TRUE,
ID_VIEW_VIEW,
WS_CHILD | WS_VISIBLE | CBRS_LEFT | CBRS_HIDE_INPLACE | WS_CAPTION, AFX_CBRS_REGULAR_TABS, AFX_CBRS_RESIZE))
在Create的时候后面加上这样的参数设置AFX_CBRS_REGULAR_TABS,
AFX_CBRS_RESIZE 就不会有那个关闭按钮了
////方法二比较实用。