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

来源:互联网 发布:家具图纸设计软件 编辑:程序博客网 时间:2024/06/06 15:48


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 1000BEGIN_MESSAGE_MAP(CMyBarBottom, CControlBar)//{{AFX_MSG_MAP(CMyBarBottom)// NOTE - the ClassWizard will add and remove mapping macros here.//}}AFX_MSG_MAPEND_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 hereif (!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 hereif (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 columnsint i;LV_COLUMN lvc;lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;CStringstrTemp;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){intnI = m_ListCtrl.GetItemCount();LV_ITEMlvi;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类都添加如下成员变量

// Operationspublic: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 herem_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 herem_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 herem_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 membersCStatusBar  m_wndStatusBar;CToolBarm_wndToolBar;//新增CImageListm_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_wndWorkspaceif (!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 controlm_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_wndOutputif (!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;


原创粉丝点击