C++ MFC学习 (五)
Edit Control 当不设置多行时,敲击回车会关闭对话框
1 void CMFC_Demo4Dlg::OnBnClickedButton2() 2 { 3 // TODO: 在此添加控件通知处理程序代码 4 5 //整个项目退出 6 //exit(0); 7 8 //退出当前的对话框 两种 9 //CDialog::OnOK(); 10 CDialog::OnCancel(); 11 } 12 13 14 void CMFC_Demo4Dlg::OnOK() 15 { 16 // TODO: 在此添加专用代码和/或调用基类 17 //解决输入框敲击回车,关闭对话框的问题,可重写对话框的OnOk函数,注释掉即可 18 //CDialogEx::OnOK(); 19 }
禁用按钮 EnableWindow(false) 为禁用
Edit Control 添加变量时,设置类别为Value,即变量的值为显示的值,但需要将变量的值同步到控件中
同理,在控件中输入内容好,如果想获取当前的值,需要将控件的值,同步到变量中
1 void CMFC_Demo4Dlg::OnBnClickedButton3() 2 { 3 // TODO: 在此添加控件通知处理程序代码 4 5 //利用关联Value的方式,设置和改变edit的内容 6 7 //设置内容 8 m_text = TEXT("哈哈"); 9 10 //将变量内容 同步到控件中 11 UpdateData(FALSE); 12 } 13 14 15 void CMFC_Demo4Dlg::OnBnClickedButton4() 16 { 17 // TODO: 在此添加控件通知处理程序代码 18 //获取内容 19 //将控件的内容 同步到变量中 20 UpdateData(TRUE); 21 MessageBox(m_text); 22 }
下拉框的常见操作 属性设置
sort false为不进行排序
type 设置为下拉列表 不可编辑
1 //下拉框添加 2 m_cbx.AddString(TEXT("唐僧")); 3 m_cbx.AddString(TEXT("孙悟空")); 4 m_cbx.AddString(TEXT("猪八戒")); 5 m_cbx.AddString(TEXT("沙僧")); 6 //设置下拉框默认选项 7 m_cbx.SetCurSel(0); 8 //插入数据 9 m_cbx.InsertString(4, TEXT("白龙马")); 10 //删除 11 m_cbx.DeleteString(3); 12 //获取索引的具体内容 13 CString str; 14 m_cbx.GetLBText(0,str); 15 void CMFC_ComboBoxCtrlDlg::OnCbnSelchangeCombo1() //下拉框被选中触发事件 16 { 17 // TODO: 在此添加控件通知处理程序代码 18 19 //拿到索引位置 20 int index = m_cbx.GetCurSel(); 21 CString str; 22 m_cbx.GetLBText(index, str); 23 }
List Ctrl 使用
1 CString str[] = { TEXT("姓名"),TEXT("性别"), TEXT("年龄") }; 2 for (int i = 0; i < 3; i++) 3 { 4 //设置表头 参数:1 索引 2 内容 3 对齐方式 4 列宽度 5 m_list.InsertColumn(i, str[i],LVCFMT_CENTER,50); 6 } 7 //设置正文 8 /* 9 //表头不算正文里的内容,索引从0开始 10 m_list.InsertItem(0, TEXT("张三")); 11 //给这个Item插入其他列的数据 12 m_list.SetItemText(0,1,TEXT("男")); 13 */ 14 //使用循环插入数据 15 for (int i = 0; i < 6; i++) { 16 CString str; 17 str.Format(TEXT("张三%d"), i); 18 m_list.InsertItem(i,str); 19 m_list.SetItemText(i, 1, TEXT("男")); 20 m_list.SetItemText(i, 2, TEXT("23")); 21 }
Tree Ctrl 的使用
如果需要使用表模式,需要将View属性改为Report
1 //树控件使用 2 //1.设置图标 3 //准备HICON图标 4 HICON icons[4]; 5 icons[0] = AfxGetApp()->LoadIconW(IDI_ICON1); 6 icons[1] = AfxGetApp()->LoadIconW(IDI_ICON2); 7 icons[2] = AfxGetApp()->LoadIconW(IDI_ICON3); 8 icons[3] = AfxGetApp()->LoadIconW(IDI_ICON4); 9 10 //CImageList list; //必须保存住这个集合 写到.h 做成员变量 11 //创建图片集合
//30,30 指定图标的宽度和高度
//ILC_COLOR32 图标格式
//4,4, 有多少个图标就写多少
12 list.Create(30,30, ILC_COLOR32, 4,4); 13 //添加具体图片 14 for (int i = 0; i < 4; i++) 15 { 16 list.Add(icons[i]); 17 } 18 19 m_tree.SetImageList(&list, TVSIL_NORMAL); 20 21 //2.设置节点 22 HTREEITEM root = m_tree.InsertItem(TEXT("根节点"), 0, 0, NULL); 23 HTREEITEM parent = m_tree.InsertItem(TEXT("父节点"), 1, 1, root); 24 HTREEITEM son1 = m_tree.InsertItem(TEXT("子节点1"), 2, 2,parent); 25 HTREEITEM son2 = m_tree.InsertItem(TEXT("子节点2"), 3, 3, parent); 26 27 //设置默认选项 28 m_tree.SelectItem(son1); 29 30 void CMFC_CTreeCtrlDlg::OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult) //触发事件 31 { 32 LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); 33 // TODO: 在此添加控件通知处理程序代码 34 35 //获取当前项 36 HTREEITEM item = m_tree.GetSelectedItem(); 37 CString name = m_tree.GetItemText(item); 38 MessageBox(name); 39 *pResult = 0; 40 }
Tab Ctrl 标签页使用:
1.引用 TabSheet.h 和 .cpp 添加到项目中
2. 给Tab Ctrl 控件添加 变量 类型为 TabSheet
3. 创建两个标签页,属性 border 改为 none style 改为 child 显示为无边框的子窗口
4. 给标签页添加 类
1 //添加标签页 2 m_tab.AddPage(TEXT("系统管理"), &dlg1, IDD_DIALOG1); 3 m_tab.AddPage(TEXT("系统设置"), &dlg2, IDD_DIALOG2); 4 m_tab.Show();
注: TabSheet 的代码
TabSheet.h:
1 #if !defined(AFX_TABSHEET_H__42EE262D_D15F_46D5_8F26_28FD049E99F4__INCLUDED_) 2 #define AFX_TABSHEET_H__42EE262D_D15F_46D5_8F26_28FD049E99F4__INCLUDED_ 3 4 #if _MSC_VER > 1000 5 #pragma once 6 #endif // _MSC_VER > 1000 7 // TabSheet.h : header file 8 // 9 10 // CTabSheet window 11 #define MAXPAGE 16 12 13 class CTabSheet : public CTabCtrl 14 { 15 // Construction 16 public: 17 CTabSheet(); 18 19 // Attributes 20 public: 21 22 // Operations 23 public: 24 25 // Overrides 26 // ClassWizard generated virtual function overrides 27 //{{AFX_VIRTUAL(CTabSheet) 28 //}}AFX_VIRTUAL 29 30 // Implementation 31 public: 32 int GetCurSel(); 33 int SetCurSel(int nItem); 34 void Show(); 35 void SetRect(); 36 BOOL AddPage(LPCTSTR title, CDialog *pDialog, UINT ID); 37 virtual ~CTabSheet(); 38 39 // Generated message map functions 40 protected: 41 LPCTSTR m_Title[MAXPAGE]; 42 UINT m_IDD[MAXPAGE]; 43 CDialog* m_pPages[MAXPAGE]; 44 int m_nNumOfPages; 45 int m_nCurrentPage; 46 //{{AFX_MSG(CTabSheet) 47 afx_msg void OnLButtonDown(UINT nFlags, CPoint point); 48 //}}AFX_MSG 49 50 DECLARE_MESSAGE_MAP() 51 }; 52 53 54 //{{AFX_INSERT_LOCATION}} 55 // Microsoft Visual C++ will insert additional declarations immediately before the previous line. 56 57 #endif // !defined(AFX_TABSHEET_H__42EE262D_D15F_46D5_8F26_28FD049E99F4__INCLUDED_)
TabSheet.cpp:
1 // TabSheet.cpp : implementation file 2 // 3 4 #include "stdafx.h" 5 //#include "MyPos.h" 6 #include "TabSheet.h" 7 8 #ifdef _DEBUG 9 #define new DEBUG_NEW 10 #undef THIS_FILE 11 static char THIS_FILE[] = __FILE__; 12 #endif 13 14 15 // CTabSheet 16 17 CTabSheet::CTabSheet() 18 { 19 m_nNumOfPages = 0; 20 m_nCurrentPage = 0; 21 } 22 23 CTabSheet::~CTabSheet() 24 { 25 } 26 27 28 BEGIN_MESSAGE_MAP(CTabSheet, CTabCtrl) 29 //{{AFX_MSG_MAP(CTabSheet) 30 ON_WM_LBUTTONDOWN() 31 //}}AFX_MSG_MAP 32 END_MESSAGE_MAP() 33 34 35 // CTabSheet message handlers 36 37 BOOL CTabSheet::AddPage(LPCTSTR title, CDialog *pDialog, UINT ID) 38 { 39 if (MAXPAGE == m_nNumOfPages) 40 return FALSE; 41 42 m_nNumOfPages++; 43 44 m_pPages[m_nNumOfPages - 1] = pDialog; 45 m_IDD[m_nNumOfPages - 1] = ID; 46 m_Title[m_nNumOfPages - 1] = title; 47 48 return TRUE; 49 } 50 51 void CTabSheet::SetRect() 52 { 53 CRect tabRect, itemRect; 54 int nX, nY, nXc, nYc; 55 56 GetClientRect(&tabRect); 57 GetItemRect(0, &itemRect); 58 59 nX = itemRect.left; 60 nY = itemRect.bottom + 1; 61 nXc = tabRect.right - itemRect.left - 2; 62 nYc = tabRect.bottom - nY - 2; 63 64 m_pPages[0]->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_SHOWWINDOW); 65 for (int nCount = 1; nCount < m_nNumOfPages; nCount++) 66 m_pPages[nCount]->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_HIDEWINDOW); 67 68 } 69 70 void CTabSheet::Show() 71 { 72 for (int i = 0; i < m_nNumOfPages; i++) 73 { 74 m_pPages[i]->Create(m_IDD[i], this); 75 InsertItem(i, m_Title[i]); 76 } 77 78 m_pPages[0]->ShowWindow(SW_SHOW); 79 for (int i = 1; i < m_nNumOfPages; i++) 80 m_pPages[i]->ShowWindow(SW_HIDE); 81 82 SetRect(); 83 84 } 85 86 void CTabSheet::OnLButtonDown(UINT nFlags, CPoint point) 87 { 88 CTabCtrl::OnLButtonDown(nFlags, point); 89 90 if (m_nCurrentPage != GetCurFocus()) 91 { 92 m_pPages[m_nCurrentPage]->ShowWindow(SW_HIDE); 93 m_nCurrentPage = GetCurFocus(); 94 m_pPages[m_nCurrentPage]->ShowWindow(SW_SHOW); 95 // m_pPages[m_nCurrentPage]->SetFocus(); 96 } 97 } 98 99 int CTabSheet::SetCurSel(int nItem) 100 { 101 if (nItem < 0 || nItem >= m_nNumOfPages) 102 return -1; 103 104 int ret = m_nCurrentPage; 105 106 if (m_nCurrentPage != nItem) 107 { 108 m_pPages[m_nCurrentPage]->ShowWindow(SW_HIDE); 109 m_nCurrentPage = nItem; 110 m_pPages[m_nCurrentPage]->ShowWindow(SW_SHOW); 111 // m_pPages[m_nCurrentPage]->SetFocus(); 112 CTabCtrl::SetCurSel(nItem); 113 } 114 115 return ret; 116 } 117 118 int CTabSheet::GetCurSel() 119 { 120 return CTabCtrl::GetCurSel(); 121 }