MFC 常用控件 [转]
目录
静态文本框CStatic
- 静态文本框是最简单的控件,它主要用来显示文本信息,不能接受用户输入,一般不需要连接变量,也不需要处理消息。
- 静态文本框的重要属性有:
- ID:所有静态文本框的缺省ID都是IDC_STATIC,静态ID,不响应任何消息(事件)
- Caption:修改显示的内容
接口
功能
CWnd::SetWindowText
设置控件内容
CWnd::GetWindowText
获取控件内容
CStatic::SetBitmap
设置位图(后缀为bmp的图片)
关联控件变量:
- 由于XXX_STATIC静态ID是不能关联变量,故需把ID修改后,再关联变量:
- 在主对话框类OnInitDialog()中,完成相应接口测试:
- 示例1:设置文本
m_text.SetWindowTextW(TEXT("呵呵")); CString str; m_text.GetWindowTextW(str); MessageBox(str);
- 示例2:显示图片:
//设置静态控件窗口风格为位图居中显示 m_pic.ModifyStyle(0xf, SS_BITMAP | SS_CENTERIMAGE); //通过路径获取bitmap句柄 #define HBMP(filepath,width,height) (HBITMAP)LoadImage(AfxGetInstanceHandle(),filepath,IMAGE_BITMAP,width,height,LR_LOADFROMFILE|LR_CREATEDIBSECTION) //宽高设置 应该按照 控件的大小取设置 CRect rect; m_pic.GetWindowRect(rect); //静态控件设置bitmap m_pic.SetBitmap(HBMP(TEXT("./1.bmp"), rect.Width(), rect.Height()));
普通按钮 CButton
- 按钮的主要属性是Caption,来设置在按钮上显示的文本。
- 命令按钮处理的最多的消息是:BN_CLICKED,双击按钮即可跳转到处理函数。
- 或者,通过按钮属性 -> 控制事件 -> 选择所需事件,添加处理函数:
接口
功能
CWnd::SetWindowText
设置控件内容
CWnd::GetWindowText
获取控件内容
CWnd::EnableWindow
设置控件是否变灰
关联控件变量:
- 在主对话框类OnInitDialog()中,完成相应接口测试
//获取按钮的内容 CString str; m_button.GetWindowText(str); MessageBox(str); //设置按钮内容 m_button.SetWindowText(TEXT("^_^")); //设置按钮状态为灰色 m_button.EnableWindow(FALSE); m_button.EnableWindow(TRUE);
编辑框CEdit
- 常用属性设置:
属性
含义
Number
True只能输入数字
Password
True密码模式
Want return
True接收回车键,自动换行,只有在多行模式下,才能换行
Multiline
True多行模式
Auto VScroll
True 当垂直方向字符太多,自动出现滚动条,同时设置Vertical Scroll才有效
Vertical Scroll
True当垂直方向字符太多,自动出现滚动条,和Auto VScroll配合使用
Horizontal Scroll
True当垂直方向字符太多,自动出现滚动条,和Auto HScroll配合使用
Read Only
True 只读
- 常用接口:
接口
功能
CWnd::SetWindowText
设置控件内容
CWnd::GetWindowText
获取控件内容
关联控件变量
- 在主对话框类OnInitDialog()中,完成相应接口测试:
/设置按钮内容 m_edit.SetWindowText(TEXT("this is a test")); //获取按钮的内容 CString str; m_edit.GetWindowText(str); MessageBox(str);
关联基本类型变量
- 若一个编辑框连接了一个Value类别的变量,则该变量就表示这个编辑框,编辑框中显示的内容就是变量的值。
- 但是,改变了编辑框的内容并不会自动更新对应的变量的值,同样,改变了变量的值也不会自动刷新编辑框的内容。若要保持一致,需要使用UpdateData()函数更新:
- 若编辑框的内容改变了,则应使用语句UpdateData(TRUE) 获取对话框数据
- 若变量的值改变了,则应使用语句UpdateData(FALSE) 初始化对话框控件
- 在主对话框类OnInitDialog()中,完成相应代码测试:
m_e1 = 10.11; UpdateData(FALSE); //FALSE说明把m_e1的值更新到对应的控件中 UpdateData(TRUE); //TRUE说明把控件的值更新到m_e1变量中
组合框(下拉框) CComboBox
- 常用属性设置:
属性
含义
data
设置内容,不同内容间用英文的分号“;”分隔
type
显示风格
Sort
True 内容自动排序
- 常用接口:
CComboBox::AddString
组合框添加一个字符串
CComboBox::SetCurSel
设置当前选择项(当前显示第几项),下标从0开始
CComboBox::GetCurSel
获取组合框中当前选中项的下标
CComboBox::GetLBText
获取指定位置的内容
CComboBox::DeleteString
删除指定位置的字符串
CComboBox::InsertString
在指定位置插入字符串
- 关联控件变量后,测试接口:
- 示例:
m_cbx.AddString(TEXT("唐僧")); m_cbx.AddString(TEXT("孙悟空")); m_cbx.AddString(TEXT("猪八戒")); m_cbx.AddString(TEXT("沙僧")); //设置默认选项 m_cbx.SetCurSel(0); //插入 m_cbx.InsertString(4, TEXT("白龙马")); //删除 m_cbx.DeleteString(3); //获取1号的索引的具体内容 CString str; m_cbx.GetLBText(1, str); MessageBox(str);
- 获取选中下标并显示内容:
//拿到索引位置 int index = m_cbx.GetCurSel(); CString str; m_cbx.GetLBText(index, str); MessageBox(str);
- 组合框常用的事件为:CBN_SELCHANGE,当选择组合框某一项时,自动触发此事件。
void CMFCApplication2Dlg::OnCbnSelchangeCombo1() { // TODO: 在此添加控件通知处理程序代码 }
列表控件 CListCtrl
- 常用属性设置:view -> Report(报表方式)
- 常用接口:
接口
功能
CListCtrl::SetExtendedStyle
设置列表风格
CListCtrl::GetExtendedStyle
获取列表风格
CListCtrl::InsertColumn
插入某列内容,主要用于设置标题
CListCtrl::InsertItem
在某行插入新项内容
CListCtrl::SetItemText
设置某行某列的子项内容
CListCtrl::GetItemText
获取某行某列的内容
- 关联控件变量后,测试接口:
- 示例:
//设置风格样式 //LVS_EX_GRIDLINES 网格 //LVS_EX_FULLROWSELECT 选中整行 m_list.SetExtendedStyle(m_list.GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT); //插入标题 CString head[] = { TEXT("姓名"), TEXT("年龄"), TEXT("性别") }; //插入列 m_list.InsertColumn(0, head[0], LVCFMT_LEFT, 100); m_list.InsertColumn(1, head[1], LVCFMT_LEFT, 100); m_list.InsertColumn(2, head[2], LVCFMT_LEFT, 100); //插入正文内容,先确定行,再确定列 for (int i = 0; i < 10; i++) { CString str; str.Format(TEXT("张三_%d"), i ); //确定行 m_list.InsertItem(i, str); //设置列 int j = 0; m_list.SetItemText(i, ++j, TEXT("男")); m_list.SetItemText(i, ++j, TEXT("23")); }
- 程序效果图:
树控件 CTreeCtrl
- 常用属性设置:
属性
含义
has buttons
True 有展开按钮
has lines
True 有展开线
lines at root
True 有根节点
- 常用接口:
接口
功能
AfxGetApp()
获取应用程序对象指针
CWinApp::LoadIcon
加载自定义图标
CImageList::Create
创建图像列表
CImageList::Add
图像列表追加图标
CTreeCtrl::SetImageList
设置图形状态列表
CTreeCtrl::InsertItem
插入节点
CTreeCtrl::SelectItem
设置默认选中项
CTreeCtrl::GetSelectedItem
获取选中项
CTreeCtrl::GetItemText
获取某项内容
- 关联控件变量:
添加图标资源(icon)
- 把ico资源文件放在项目res文件夹中
- 资源视图 -> Icon -> 添加资源:
- 导入ico文件
- 通过代码加载图标
//1 、设置图标 //准备HICON图标 HICON icons[4]; icons[0] = AfxGetApp()->LoadIconW(IDI_ICON1); icons[1] = AfxGetApp()->LoadIconW(IDI_ICON2); icons[2] = AfxGetApp()->LoadIconW(IDI_ICON3); icons[3] = AfxGetApp()->LoadIconW(IDI_ICON4); //CImageList list; //必须保存住这个集合 写到.h做成员属性 //创建图片集合 list.Create(30, 30, ILC_COLOR32, 4, 4); //添加具体的图片 for (int i = 0; i < 4;i++) { list.Add(icons[i]); } m_tree.SetImageList(&list, TVSIL_NORMAL); //2 、设置节点 HTREEITEM root = m_tree.InsertItem(TEXT("根节点"), 0, 0, NULL); HTREEITEM parent = m_tree.InsertItem(TEXT("父节点"), 1, 1, root); HTREEITEM sub1 = m_tree.InsertItem(TEXT("子节点1"), 2, 2, parent); HTREEITEM sub2 = m_tree.InsertItem(TEXT("子节点2"), 3, 3, parent); //设置默认选项 m_tree.SelectItem(sub1);
- 树控件常用事件为:TVN_SELCHANGED,当选择某个节点时,自动触发此事件。
void CMy06CTreeCtrlDlg::OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); // TODO: 在此添加控件通知处理程序代码 *pResult = 0; //获取当前项 HTREEITEM item = m_tree.GetSelectedItem(); CString name = m_tree.GetItemText(item); MessageBox(name); }
标签控件 CTabCtrl
- 在ui工具箱拖放 Tab Control
- 把 TabSheet.h和TabSheet.cpp 放在项目文件同级目录,并且添加到工程目录中
- 给ui上 Tab Control 关联Control类型(CTabSheet)
- 添加对话框
- a) 资源视图 -> Dialog -> 右击 -> 插入 Dialog
- b) 设置相应属性:
- Style -> Child (子窗口)
- Border -> None (无边框)
- c) 自定义类:点击对话框模板 -> 右击 -> 添加类(MyDlg1、MyDlg2)
- d) 主对话框类中, 定义自定义类对象,需要相应头文件
- 主对话框类中 OnInitDialog() 做初始化工作
//添加标签页 m_tab.AddPage(TEXT("系统设置"), &dlg1, IDD_DIALOG1); m_tab.AddPage(TEXT("系统管理"), &dlg2, IDD_DIALOG2); //显示 m_tab.Show();
- 附:
- TabSheet.h:
#if !defined(AFX_TABSHEET_H__42EE262D_D15F_46D5_8F26_28FD049E99F4__INCLUDED_) #define AFX_TABSHEET_H__42EE262D_D15F_46D5_8F26_28FD049E99F4__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // TabSheet.h : header file // / // CTabSheet window #define MAXPAGE 16 class CTabSheet : public CTabCtrl { // Construction public: CTabSheet(); // Attributes public: // Operations public: // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CTabSheet) //}}AFX_VIRTUAL // Implementation public: int GetCurSel(); int SetCurSel(int nItem); void Show(); void SetRect(); BOOL AddPage(LPCTSTR title, CDialog *pDialog, UINT ID); virtual ~CTabSheet(); // Generated message map functions protected: LPCTSTR m_Title[MAXPAGE]; UINT m_IDD[MAXPAGE]; CDialog* m_pPages[MAXPAGE]; int m_nNumOfPages; int m_nCurrentPage; //{{AFX_MSG(CTabSheet) afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; / //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_TABSHEET_H__42EE262D_D15F_46D5_8F26_28FD049E99F4__INCLUDED_)
- TabSheet.cpp:
// TabSheet.cpp : implementation file // #include "stdafx.h" //#include "Property5.h" #include "TabSheet.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif / // CTabSheet CTabSheet::CTabSheet() { m_nNumOfPages = 0; m_nCurrentPage = 0; } CTabSheet::~CTabSheet() { } BEGIN_MESSAGE_MAP(CTabSheet, CTabCtrl) //{{AFX_MSG_MAP(CTabSheet) ON_WM_LBUTTONDOWN() ON_WM_HSCROLL() //}}AFX_MSG_MAP END_MESSAGE_MAP() / // CTabSheet message handlers BOOL CTabSheet::AddPage(LPCTSTR title, CDialog *pDialog,UINT ID) { if( MAXPAGE == m_nNumOfPages ) return FALSE; m_nNumOfPages++; m_pPages[m_nNumOfPages-1] = pDialog; m_IDD[m_nNumOfPages-1] = ID; m_Title[m_nNumOfPages-1] = title; return TRUE; } void CTabSheet::SetRect() { CRect tabRect, itemRect; int nX, nY, nXc, nYc; GetClientRect(&tabRect); GetItemRect(0, &itemRect); nX=itemRect.left; nY=itemRect.bottom+1; nXc=tabRect.right-itemRect.left-2; nYc=tabRect.bottom-nY-2; m_pPages[0]->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_SHOWWINDOW); for( int nCount=1; nCount < m_nNumOfPages; nCount++ ) m_pPages[nCount]->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_HIDEWINDOW); } void CTabSheet::Show() { int i = 0; for( i=0; i < m_nNumOfPages; i++ ) { m_pPages[i]->Create( m_IDD[i], this ); if (AfxGetMainWnd()) InsertItem( i, m_Title[i] ); else return; } m_pPages[0]->ShowWindow(SW_SHOW); for( i=1; i < m_nNumOfPages; i++) m_pPages[i]->ShowWindow(SW_HIDE); SetRect(); } void CTabSheet::OnLButtonDown(UINT nFlags, CPoint point) { CTabCtrl::OnLButtonDown(nFlags, point); if(m_nCurrentPage != GetCurFocus()) { m_pPages[m_nCurrentPage]->ShowWindow(SW_HIDE); m_nCurrentPage=GetCurFocus(); m_pPages[m_nCurrentPage]->ShowWindow(SW_SHOW); // m_pPages[m_nCurrentPage]->SetFocus(); //AfxMessageBox("选中"); wbm test } } int CTabSheet::SetCurSel(int nItem) { if( nItem < 0 || nItem >= m_nNumOfPages) return -1; int ret = m_nCurrentPage; if(m_nCurrentPage != nItem ) { m_pPages[m_nCurrentPage]->ShowWindow(SW_HIDE); m_nCurrentPage = nItem; m_pPages[m_nCurrentPage]->ShowWindow(SW_SHOW); // m_pPages[m_nCurrentPage]->SetFocus(); CTabCtrl::SetCurSel(nItem); } return ret; } int CTabSheet::GetCurSel() { return CTabCtrl::GetCurSel(); } void CTabSheet::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Add your message handler code here and/or call default CTabCtrl::OnHScroll(nSBCode, nPos, pScrollBar); }