1、新建多文档程序VisualStudio,视图类的基类选择CHtmlView,finish之后根据上节内容添加CJ60lib设置,导入位图资源。
2、NewClass 继承自CControlBar,类CControlBar是所有控件条类(CStatusBar、CToolBar、CDialogBar、CReBar和COleResizeBar)的基类。
控件条窗口通常是父框架窗口的子窗口,并属于框架窗口的客户视图区或MDI客户。CControlBar对象采用父窗口客户矩形区的参数来定位。它会通知父窗口客户区中还有多少未占用的空间。创建基于CWnd的派生类CMyControlBar:打开ClassWizard,为以上创建的资源添加一个以CWnd为基类的派生类(因为ClassWizard没有将CControlBar列在基类目录清单中,所以用户只能先以CWnd类派生)再修改派生类以CControlBar为基类,添加宏IDC_LIST_CTRL。
添加成员变量
public:
CListCtrl m_ListCtrl;
#define IDC_LIST_CTRL 1000
BEGIN_MESSAGE_MAP(CMyBarBottom, CControlBar)
//{{AFX_MSG_MAP(CMyBarBottom)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
添加windows消息WM_CREATE和WM_WINDOWPOSCHANGED
static int _gColText[] =
{
IDS_COL_1,
IDS_COL_2,
IDS_COL_3
};
static int _gColSize[] =
{
100,
250,
250
};
static CString _gListText[] =
{
_T("test one"),
_T("test two"),
_T("test three")
};
int CMyBarBottom::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CControlBar::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
if (!m_ListCtrl.Create (WS_CHILD|WS_VISIBLE|LVS_REPORT,
CRect(0,0,0,0), this, IDC_LIST_CTRL))
{
TRACE0("Failed to create view for CMyBarLeft\n");
return -1;
}
m_ListCtrl.ModifyStyleEx(0, WS_EX_CLIENTEDGE);
AddExStyle (LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_CHECKBOXES);
BuildColumns(3, _gColSize, _gColText);
for (int i = 0; i < 5; ++i)
FormatList (_gListText);
return 0;
}
void CMyBarBottom::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos)
{
CControlBar::OnWindowPosChanged(lpwndpos);
// TODO: Add your message handler code here
if (IsFloating()) {
m_ListCtrl.MoveWindow( 5, 5, lpwndpos->cx-10, lpwndpos->cy-10 );
}
else if (IsHorzDocked()) {
m_ListCtrl.MoveWindow( 17, 3, lpwndpos->cx-25, lpwndpos->cy-17 );
}
else {
m_ListCtrl.MoveWindow( 3, 17, lpwndpos->cx-17, lpwndpos->cy-30 );
}
}
void CMyBarBottom::AddExStyle(DWORD dwNewStyle)
{
// Returns the current extended style ( a DWORD ).
DWORD dwStyle = ::SendMessage (m_ListCtrl.m_hWnd, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);
// Add the full row select and grid line style to the existing extended styles.
dwStyle |= dwNewStyle;
// Sets the current extended style ( a DWORD ).
::SendMessage (m_ListCtrl.m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, dwStyle);
}
void CMyBarBottom::BuildColumns(int nCols, int *nWidth, int *iCol)
{
ASSERT(nCols);
ASSERT(nWidth);
ASSERT(iCol);
ASSERT(m_ListCtrl);
//insert columns
int i;
LV_COLUMN lvc;
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
CString strTemp;
for(i = 0; i < nCols; i++)
{
lvc.iSubItem = i;
strTemp.LoadString(iCol[i]);
lvc.pszText = (char*)(LPCTSTR)strTemp;
lvc.cx = nWidth[i];
lvc.fmt = LVCFMT_LEFT;
m_ListCtrl.InsertColumn(i,&lvc);
}
}
void CMyBarBottom::FormatList(CString *csText)
{
int nI = m_ListCtrl.GetItemCount();
LV_ITEM lvi;
if (csText)
{
lvi.mask = LVIF_TEXT | LVIF_STATE;
lvi.iItem = nI;
lvi.iSubItem = 0;
lvi.iImage = 0;
lvi.stateMask = LVIS_STATEIMAGEMASK;
lvi.state = INDEXTOSTATEIMAGEMASK(1);
lvi.pszText = (char*)(LPCTSTR)csText[0];
int result = m_ListCtrl.InsertItem(&lvi);
if (result != -1)
{
SetLVCheck (nI, TRUE);
m_ListCtrl.SetItemText(nI, 1, csText[1]);
m_ListCtrl.SetItemText(nI, 2, csText[2]);
}
}
}
void CMyBarBottom::SetLVCheck(WPARAM ItemIndex, BOOL bCheck)
{
LV_ITEM lvi;
lvi.stateMask = LVIS_STATEIMAGEMASK;
lvi.state = UINT((int(bCheck) + 1) << 12);
::SendMessage (m_ListCtrl.m_hWnd, LVM_SETITEMSTATE, (WPARAM)ItemIndex,
(LPARAM)(LV_ITEM FAR*)&lvi);
}
3、新建三个继承自CTreeView的类,CTreeViewClass, CTreeViewResource 和 CTreeViewFile类,从MFCClass选择,将来会放到标签页,代表类视图、资源视图、文件视图。
给三个View类都添加如下成员变量
// Operations
public:
CTreeCtrl* m_TreeCtrl;
CImageList m_ImageList;
三个View类都添加添加消息WM_CREATE、=TVN_ITEMEXPANDING、=TVN_SELCHANGED消息响应
=TVN_ITEMEXPANDING、=TVN_SELCHANGED消息响应不用改动。
4、
给CTreeViewClass添加静态变量和WM_CREATE消息响应
在树形控件中每一个结点都有一个句柄(HTREEITEM),同时添加结点时必须提供的参数是该结点的父结点句柄,(其中根Root结点只有一个,既不可以添加也不可以删除)利用
HTREEITEM InsertItem( LPCTSTR lpszItem,HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST );可以添加一个结点,pszItem为显示的字符,hParent代表父结点的句柄,当前添加的结点会排在hInsertAfter表示的结点的后面,返回值为当前创建的结点的句柄。
m_TreeCtrl = &GetTreeCtrl();
这里的&是取地址用的,将一个地址赋值给pCtrl,进行树形控件的初始化。
static CString csTree[] =
{
_T("Demo classes"),//父项
_T("CClassName"),//一级子项
_T("Globals")//子项
};
int CTreeViewClass::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CTreeView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
m_TreeCtrl = &GetTreeCtrl();
// 为树形控件创建图像列表
m_ImageList.Create (IDB_IL_CLASS, 16, 1, RGB(0,255,0));
m_TreeCtrl->SetImageList (&m_ImageList, TVSIL_NORMAL);
// 添加父项
HTREEITEM htItem = m_TreeCtrl->InsertItem(csTree[0]);
m_TreeCtrl->SetItemState( htItem, TVIS_BOLD, TVIS_BOLD );
//添加一级子项
for( int i = 1; i < 8; i++ ) {
m_TreeCtrl->InsertItem (csTree[1], 1, 1, htItem, TVI_LAST);
}
//添加子项
m_TreeCtrl->InsertItem (csTree[2], 2, 3, htItem, TVI_LAST);
m_TreeCtrl->Expand(htItem, TVE_EXPAND);//展开
return 0;
}
CTreeViewFile类
static CString csTree[] =
{
_T("Workspace 'demo': 1 project(s)"),
_T("Demo files"),
_T("File Folder")
};
int CTreeViewFile::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CTreeView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
m_TreeCtrl = &GetTreeCtrl();
// 为树形控件创建图像列表
m_ImageList.Create (IDB_IL_FILE, 16, 1, RGB(0,255,0));
m_TreeCtrl->SetImageList (&m_ImageList, TVSIL_NORMAL);
// 添加父项粗体
HTREEITEM htiParent = m_TreeCtrl->InsertItem (csTree[0]);
HTREEITEM htiChild; // 子项
htiChild = m_TreeCtrl->InsertItem (csTree[1], 1, 1, htiParent, TVI_LAST);
m_TreeCtrl->SetItemState (htiChild, TVIS_BOLD, TVIS_BOLD);
//添加子项
for (int i = 1; i < 4; i++) {
m_TreeCtrl->InsertItem (csTree[2], 2, 3, htiChild, TVI_LAST);
}
m_TreeCtrl->Expand (htiParent, TVE_EXPAND);
m_TreeCtrl->Expand (htiChild, TVE_EXPAND);
//以上为添加的代码
return 0;
}
CTreeViewResources
static CString csTree[] =
{
_T("Demo resources"),
_T("Accelerator"),
_T("Bitmap"),
_T("Dialog"),
_T("Icon"),
_T("Menu"),
_T("String Table"),
_T("Toolbar"),
_T("Version")
};
int CTreeViewsResource::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CTreeView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
m_TreeCtrl = &GetTreeCtrl();
m_ImageList.Create (IDB_IL_RSRC, 16, 1, RGB(0,255,0));
m_TreeCtrl->SetImageList (&m_ImageList, TVSIL_NORMAL);
HTREEITEM htItem = m_TreeCtrl->InsertItem (csTree[0], 1, 1);
m_TreeCtrl->SetItemState (htItem, TVIS_BOLD, TVIS_BOLD);
for (int i = 1; i < 9; i++) {
m_TreeCtrl->InsertItem (csTree[i], 0, 1, htItem, TVI_LAST);
}
m_TreeCtrl->Expand (htItem, TVE_EXPAND);
return 0;
}
6.在CMainFrame
.h添加头文件
#endif // _MSC_VER >= 1000
#include "MyBarBottom.h"
.cpp添加头文件
#include "TreeViewClass.h"
#include "TreeViewFile.h"
#include "TreeViewResources.h"
添加成员变量
protected: // control bar embedded members
CStatusBar m_wndStatusBar;
CToolBar m_wndToolBar;
//新增
CImageList m_ImageList;
CImageList m_TabImages;
CMyBarBottom m_wndOutput;
CTabCtrlBar m_wndWorkspace;
在OnCreate函数return 0;之前添加如下代码
// Install cool menus.
InstallCoolMenus(this, IDR_MAINFRAME);
// Create the image list to be used with the control bars.
m_ImageList.Create(IDB_IMAGELIST, 13, 1, RGB(0,255,0));
// CG: The following block was inserted by the 'Dialog Bar' component
{
m_wndWorkspace.SetBtnImageList (&m_ImageList);
m_wndWorkspace.SetMenuID(IDR_POPUP);
// Initialize dialog bar m_wndWorkspace
if (!m_wndWorkspace.Create(this, CG_ID_VIEW_WORKSPACE,
_T("Workspace"), CSize(220,200)))
{
TRACE0("Failed to create dialog bar m_wndWorkspace\n");
return -1; // fail to create
}
// Add the views to the tab control.
m_wndWorkspace.AddView(_T("Class"), RUNTIME_CLASS(CTreeViewClass));
m_wndWorkspace.AddView(_T("Resource"), RUNTIME_CLASS(CTreeViewResource));
m_wndWorkspace.AddView(_T("Files"), RUNTIME_CLASS(CTreeViewFile));
// Define the image list to use with the tab control
m_TabImages.Create (IDB_IL_TAB, 16, 1, RGB(0,255,0));
m_wndWorkspace.SetTabImageList(&m_TabImages);
// allow bar to be resized when floating
m_wndWorkspace.SetBarStyle(m_wndWorkspace.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
m_wndWorkspace.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndWorkspace, AFX_IDW_DOCKBAR_LEFT);
}
// CG: The following block was inserted by the 'Dialog Bar' component
{
m_wndOutput.SetBtnImageList (&m_ImageList);
m_wndOutput.SetMenuID(IDR_POPUP);
// Initialize dialog bar m_wndOutput
if (!m_wndOutput.Create(this, CG_ID_VIEW_OUTPUT,
_T("Output"), CSize(200,100)))
{
TRACE0("Failed to create dialog bar m_wndOutput\n");
return -1; // fail to create
}
// allow bar to be resized when floating
m_wndOutput.SetBarStyle(m_wndOutput.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
m_wndOutput.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndOutput, AFX_IDW_DOCKBAR_BOTTOM);
}
return 0;