MFC基础控件的使用

基础控件的使用

  1. 创建和初始化

  2. 响应的消息

  3. 控件的函数


按钮

  1. 使用按钮一般不需要初始化

  2. 单击消息BN_CHICKED

  3. SetWindowText设置控件的标题

1
2
3
4
5
6
wchar_t str1[10] = {};
m_Button.GetWindowText(str1, 10);
MessageBox(str1);

wchar_t str2[10] = {L"你好"};
m_Button.SetWindowText(str2);

单选框

  1. 使用CButton类绑定单选框对象,只绑定Group的第一个对象即可。分组属性只能给第一个控件设置

    image1

  2. 单选框时按钮的一种,响应方式和按钮一样

  3. 绑定CButton类后,使用GetCheck和SetCheck来获取或设置单选框的选中状态

1
2
3
4
5
6
m_Radio1.SetCheck(1);

int n = m_Radio1.GetCheck();
CString str = NULL;
str.Format(L"%d", n);
MessageBox(str);

绑定基础类型后,使用UpdateData同步数据,变量的值为几即为第几个数据

1
2
3
4
5
6
7
8
UpdateData(TRUE);
CString str = NULL;
str.Format(L"%d", m_Radio1);
MessageBox(str);

UpdateData(TRUE);
m_Radio1 = abs(m_Radio1 - 1);
UpdateData(FALSE);

多选框

  1. 每一个多选框都要绑定一个变量

  2. 同单选框

  3. 绑定CButton类型的变量可以GetCheck和SetCheck

    绑定基础类型的可以使用UpdateData同步变量并进行修改

编辑框

  1. 使用属性初始化
  2. 编辑框内容被修改时发送EN_CHANGE消息
  3. 绑定CEdit类型时
1
2
3
4
5
6
7
8
9
10
11
12
13
//设置编辑框的最大文本数
m_Edit.SetLimitText(100);
//设置只读(1为真)
m_Edit.SetReadOnly(0);
//设置密码框文本(默认是'*')
m_Edit.SetPasswordChar('@');
//获取编辑框文本
CString buf;
m_Edit.GetWindowText(buf);
//获取一共有几行
DWORD dwLineCount = m_Edit.GetLineCount();
//滚动到指定行数
m_Edit.LineScroll(dwLineCount);

列表框(List Box)

  1. 属性中初始化

  2. 修改当前选中LBN_SELCHANGE

  3. 类型为CListBox

1
2
3
4
5
6
7
8
9
10
11
12
//添加一行到列表框
m_ListBox.AddString(L"北京");
//清空所有项
m_ListBox.ResetContent();
//获取当前选中的下标
int n = m_ListBox.GetCurSel();
CString str = NULL;
str.Format(L"%d", n);
MessageBox(str);
//获取当前下标的文本
m_ListBox.GetText(m_ListBox.GetCurSel(), str);
MessageBox(str);

下拉框(Combo Box)

  1. 属性中有一个sort排序默认是True,改为Flase

  2. 当选项改变时发出CB_NSELCHANGE消息

  3. CComboBox类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//插入新条目
m_ComboBox.AddString(L"北京");
//获取当前选项的下标
int n = m_ComboBox.GetCurSel();
CString str = NULL;
str.Format(L"%d", n);
MessageBox(str);
//获取当前选项的值
m_ComboBox.GetLBText(m_ComboBox.GetCurSel(), str);
MessageBox(str);
//清空列表框的所有节点
m_ComboBox.ResetContent();
//设置列表中的当前选中项
m_ComboBox.SetCurSel(0);
//设置编辑框的文本
m_ComboBox.SetEditSel(0, 1);

静态文本

一般不绑定变量,只起提示作用

如果想要修改,可以先获取到控件的窗口句柄,再通过SetWindowText进行修改

1
2
3
CWnd* p = nullptr;
p = GetDlgItem(IDC_STATIC1);//注意修改静态资源ID
::SetWindowText(*p,L"你好");

图片

  1. 修改属性ID,type和center image

image

  1. 不需要处理图片的消息

  2. 绑定CStatic类后

    添加一张位图(Bitmap)到资源中(注意修改文件类型为*,否则显示不出来位图)

    在图片控件的image属性中填写位图的资源ID

image

​ 或者

​ 调用CStatic类的SetBitmap函数,将位图资源的句柄传进去

1
2
HBITMAP hBitmap = LoadBitmap(AfxGetInstanceHandle(), (TCHAR*)IDB_BITMAP1);
m_Pic.SetBitmap(hBitmap);

​ 或者

​ 使用磁盘中的图片文件

1
2
3
CImage img;
img.Load(L"res/bitmap2.bmp");
m_Pic.SetBitmap(img);

滑块(Slider Control)

  1. 属性中设置风格

    image

  2. 如果滑块是水平风格的话,则会向父窗口发送WM_HSCROLL消息

    如果滑块是垂直风格的话,则会向父窗口发送WM_VSCROLL消息

  3. 类类型绑定为CSliderCtrl

1
2
3
4
5
6
//初始化范围
m_Slider.SetRange(0, 100);
//获取当前滑块位置
int n = m_Slider.GetPos();
//设置当前滑块位置
m_Slider.SetPos(10);

进度条(Progress Control)

  1. 进度条实际上就是一个特殊的滑块,通过SetPos来修改进度条的进度

  2. 进度条和滑块一样,也是有水平和垂直的

  3. 添加类型为CProgressCtrl的变量

1
2
3
4
//与滑块相同
m_Process.SetRange(0, 100);
int n = m_Process.GetPos();
m_Process.SetPos(10);

栏控件

菜单栏

  1. 添加一个菜单栏资源
  2. 添加一个CMenu类型的对象
1
2
3
4
//加载菜单
m_Menu.LoadMenu(IDR_MENU1);
//设置菜单栏
SetMenu(&m_Menu);

菜单栏的消息响应

image

image

弹出菜单

新建一个处理WM_RBUTTONDOWN消息的函数(类向导)

1
2
3
4
5
6
7
//指向菜单栏第二列的指针
CMenu* pSubMenu = m_Menu.GetSubMenu(1);
//获取指针坐标
CPoint pos;
GetCursorPos(&pos);
//弹出菜单
pSubMenu->TrackPopupMenu(0, pos.x, pos.y, this);

状态栏

创建一个类型为CStatusBar的成员变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//设置指示器的ID
UINT ids[] = { 1000,1001 };
//创建指示器
m_StatusBar.Create(this);
m_StatusBar.SetIndicators(ids, 2);
//设置面板宽度
m_StatusBar.SetPaneInfo(0, 0, 0, 100);
m_StatusBar.SetPaneInfo(1, 1, 0, 100);
//设置面板文本
m_StatusBar.SetPaneText(0, L"就绪");
m_StatusBar.SetPaneText(1, L"完成");
//修复状态栏的位置
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,
AFX_IDW_CONTROLBAR_LAST, 0);

注意 应在WM_SIZE消息的处理函数中重新修复位置

1
2
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,
AFX_IDW_CONTROLBAR_LAST, 0);

工具栏

创建一个类型为CToolBar的成员变量

添加一个资源,类型为ToolBar

1
2
3
4
5
6
7
8
9
//加载资源
m_ToolBar.Create(this);
m_ToolBar.LoadToolBar(IDR_TOOLBAR1);
//设置按钮的ID
UINT toolBarIds[] = { 1000,1001 };
m_ToolBar.SetButtons(toolBarIds, 2);
//重新设置位置
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,
AFX_IDW_CONTROLBAR_LAST, 0);

响应消息

先得到工具栏控件的ID

image

响应WM_COMMAND消息

在wParam中保存的就是控件ID