利用CJ60lib开发visual studio风格用户界面程序


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, CTreeViewResourceCTreeViewFile类,从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;


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值