关注微信公众号“二进制小站”~~获取更多分析~~(文末二维码~~)
文章转自:http://blog.csdn.net/weili82830/article/details/8471741
以VS2010为例,创建一个MFC多文档应用程序,在第二步Aplication Type中的Project style选Visual Studio风格。然后点Finish。
这个模板程序创建了FileView、ClassView、OutputWnd、PropertiesWnd这4个停靠窗口。下面以ClassView为例说明停靠窗口及其内部控件的建立过程。
一、建立停靠窗
1、以CDockablePane为基类,创建ClassView类,类名为CClassView
2、在主框架类CMainFrame(位于MainFrm.h)中定义CClassView 的对象m_wndClassView(稍后在CClassView 中会看到一个CViewTree的对象与此对象同名,注意他们的含义是不同的),ClassView这个停靠窗口就是主框架创建过程中,用m_wndClassView这个对象创建的。
3、在MainFrm.cpp的OnCreate函数内的// Enable enhanced windows management dialog 之前创建停靠窗ClassView。语句如下:
if (!m_wndClassView.Create(_T( "Title" ), this, CRect(0, 0, 200, 200), TRUE, ID_VIEW_CLASSVIEW, 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
}
m_wndClassView.EnableDocking(CBRS_ALIGN_ANY);
DockPane(&m_wndClassView);
注:第一个参数是停靠窗口的标题
this表示在当前位置(也就是主框架)创建此停靠窗
CRect(0, 0, 200, 200)表示ClassView在悬浮状态时的默认大小
ID_VIEW_CLASSVIEW是本停靠窗口的资源ID
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI 这些是停靠窗的一些风格设置
至此,停靠窗口ClassView 就建好了。
二、在停靠窗中嵌入树形控件
1、用Class Wizard添加类CViewTree,基类设为CTreeCtrl
2、在ClassView.h中包含CViewTree.h。
#include "CViewTree.h"
3、在类CClassView中,添加树形控件的成员变量
protected:
CViewTree m_wndClassView;
4、用Class Wizard向导在ClassView.cpp中添加消息WM_CREATE的响应函数
向导在程序中添加了3个内容:
(1)在CClassView的消息映射表中添加了
BEGIN_MESSAGE_MAP(CClassView, CDockablePane)
ON_WM_CREATE()
.........
END_MESSAGE_MAP()
(2)在CClassView的实现中添加函数体
int CClassView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{ .................. }
(3)在CClassView中添加成员函数的声明
protected:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
5、接下来就是在OnCreate函数体中添加树形控件的创建代码
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
}
至此,树形控件就建立完了,用变量m_wndClassView引用CTreeCtrl的成员函数就可以对树控件进行相应的操作了。
例如:
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(hClass, TVE_EXPAND);
m_wndClassView.Expand(hRoot, TVE_EXPAND);
hClass、hRoot为子项句柄。
6、用Class Wizard在添加WM_SIZE和 WM_PAINT的消息响应函数
Class Wizard在 ClassView.cpp中添加的3个部分同上面第4步。
(1)在OnSize函数体中加入如下代码:
if (GetSafeHwnd() == NULL)
{
return;
}
CRect rectClient;
GetClientRect(rectClient);
int cyTlb = m_wndToolBar.CalcFixedLayout(FALSE, TRUE).cy;
m_wndToolBar.SetWindowPos(NULL, rectClient.left, rectClient.top, rectClient.Width(), cyTlb, SWP_NOACTIVATE | SWP_NOZORDER);
m_wndClassView.SetWindowPos(NULL, rectClient.left + 1, rectClient.top + cyTlb + 1, rectClient.Width() - 2, rectClient.Height() - cyTlb - 2, SWP_NOACTIVATE | SWP_NOZORDER);
(2)在OnPaint函数体中加入如下代码:
CRect rectTree;
m_wndClassView.GetWindowRect(rectTree);
ScreenToClient(rectTree);
rectTree.InflateRect(1, 1);
dc.Draw3dRect(rectTree, ::GetSysColor(COLOR_3DSHADOW), ::GetSysColor(COLOR_3DSHADOW));
7、为树控件添加点击消息响应
用Class Wizard为类CViewTree添加TVN_SELCHANGED消息响应函数(在VS2010中是=TVN_SELCHANGED,其他版本是不是这样我也不清楚)
在函数体里加上
HTREEITEM selitem = GetSelectedItem();
CString seltext = GetItemText(selitem);
【或者直接将这2句写成 CString seltext = GetItemText( GetSelectedItem() );】
MessageBox( seltext );
如果工程设置为 Use Multi-Byte Character Set ,则用下边这种方法。
MessageBox( _T(seltext ) );
在停靠框中嵌入控件的过程基本就是这样了。以后有新的发现会更新本帖。