Windows第九章 控件的介绍
文章目录
- 常用控件
- 1. Button 按钮控件
- 2. Edit Ctrl 编辑控件
- 3. Static Text 静态文本控件
- 4. Picture Control 图片控件
- 5. Group Box 分组控件
- 6. Radio Button 单选控件
- 7. Check Box 多选控件
- 8. Combo Box 组合控件
- 9. List Box列表控件
- 10. List Control 列表控件
- 11. Horizontal Scroll Bar 水平滚动条
- 12. Vertial Scroll Bar
- 13. Slider Control 滑动控件
- 14. Spin Control 数值微调控件
- 15. Progress Control 进度条
- 16. Data Time Picker 时间控件
- 17. IP Address Control IP地址控件
- 高级控件
- Tree Control 树控件
- 基本操作
- 遍历节点
- Tab Control 分页控件
- 实现窗口大小调整, 分页和子窗口也调整大小
- Rich Edit2.0 Control 富文本控件
常用控件
点开右边工具箱,就能看到各种控件的使用
1. Button 按钮控件
- 按钮贴图
CButton* pButton = (CButton*)GetDlgItem(IDC_BUTTON1);//获取按钮控件
pButton->SetIcon(LoadIcon(NULL, IDI_ERROR));//设置按钮图标
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP_FLOWER);//加载位图
pButton->SetBitmap(bitmap);//设置按钮位图
- 手动创建按钮
Dlg.h添加成员
CButton m_btn1;//定义按钮
Dlg.cpp 通过类向导,找到WM_Create,确定创建
int C控件Dlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialogEx::OnCreate(lpCreateStruct) == -1)
return -1;
//定义按钮ID,不要和资源里的ID重复
#define ID_MY_BUTTON 1024
m_btn1.Create(_T("按钮1"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(10, 200, 100, 230), this, ID_MY_BUTTON);//创建按钮
CFont* font = new CFont;
font->CreatePointFont(120, _T("宋体"));//创建字体
m_btn1.SetFont(font);//设置字体
return 0;
}
2. Edit Ctrl 编辑控件
- 设置文字满了自动换行,把下图Auto Scroll 设成false
- 设置文本
CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT2);//获取文本框控件
pEdit->SetWindowText(L"你好");
- 点击按钮追加文本
void C控件Dlg::OnBnClickedButtonAdd()
{
CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT2);//获取文本框控件
//获取文本的长度
int nLength = pEdit->GetWindowTextLength();
//光标移动到当前末尾
pEdit->SetSel(nLength, nLength);//在后面追加
//添加文本
pEdit->ReplaceSel(_T("末尾追加"));
//光标移动到开头
pEdit->SetSel(0, 0);//在前面追加
//添加文本
pEdit->ReplaceSel(_T("前面追加"));
}
- 撤销操作,剪切操作
CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT2);//获取文本框控件
pEdit->Undo();//撤销
pEdit->Cut();//剪切
- 手动创建Edit
int C控件Dlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialogEx::OnCreate(lpCreateStruct) == -1)
return -1;
//手动创建Edit控件
CEdit* pEdit = new CEdit;
#define IDC_EDIT3 1025
pEdit->Create(ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER, CRect(10, 10, 200, 200), this, IDC_EDIT3);//创建文本框
return 0;
}
- 判断编辑控件有没有被修改
根据类向导,创建WM_CLOSE
void C控件Dlg::OnClose()
{
CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT2);//获取文本框控件
if (pEdit->GetModify())//判断文本框内容是否被修改
{
if (IDYES == AfxMessageBox(_T("是否保存修改?"), MB_YESNO))
{
AfxMessageBox(_T("保存成功!"));
}
}
CDialogEx::OnClose();
}
3. Static Text 静态文本控件
要注意它的ID,所有的此类控件ID一般都是IDC_STATIC
没有进行每个的区分,如果要对它进行代码上的改动,就要重设一下ID
4. Picture Control 图片控件
可以放bitmap,但是放进去之后好像不能调整大小
frame可以做成辅助线,如上图
5. Group Box 分组控件
6. Radio Button 单选控件
单选控件如果要分组,就要点一下第一个单选按钮,设置一下组
这样其他组的单选按钮不受影响,如果不分组,那其他地方的单选和这里的所有只能选一个
7. Check Box 多选控件
手动创建多选单选
int C控件Dlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialogEx::OnCreate(lpCreateStruct) == -1)
return -1;
CButton* m_radio = new CButton;
m_radio->Create(_T("单选按钮"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, CRect(10, 200, 100, 230), this, 0);
CButton* m_check = new CButton;
m_check->Create(_T("复选按钮"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, CRect(10, 240, 100, 260), this, 0);
return 0;
}
8. Combo Box 组合控件
在数据里添加项的显示,每个项用分号分开
- 获取内容
CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO1);//获取下拉框控件
pComboBox->AddString(L"选项1");//添加选项
pComboBox->AddString(L"选项2");//添加选项
pComboBox->AddString(L"选项3");//添加选项
pComboBox->InsertString(0, L"早上");//插入选项
pComboBox->SetCurSel(0);//设置当前选项
wchar_t m_str[20];
pComboBox->GetLBText(0, m_str);//获取当前选项
AfxMessageBox(m_str);
pComboBox->DeleteString(1);//删除选项
9. List Box列表控件
相当于combobox点下拉按钮后下面的那部分,显示一条一条的项
添加修改和combobox差不多
10. List Control 列表控件
视图调成report,可以显示所有分支的内容
CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_LIST3);//获取列表控件
pList->InsertColumn(0, L"姓名", LVCFMT_LEFT, 100);//插入列
pList->InsertColumn(1, L"年龄", LVCFMT_LEFT, 100);//插入列
pList->InsertColumn(2, L"性别", LVCFMT_LEFT, 100);//插入列
pList->InsertItem(0, L"张三");//插入行
pList->SetItemText(0, 1, L"18");//设置单元格内容
pList->SetItemText(0, 2, L"男");//设置单元格内容
pList->InsertItem(1, L"李四");//插入行
pList->SetItemText(1, 1, L"20");//设置单元格内容
pList->SetItemText(1, 2, L"女");//设置单元格内容
11. Horizontal Scroll Bar 水平滚动条
12. Vertial Scroll Bar
13. Slider Control 滑动控件
14. Spin Control 数值微调控件
微调框一般和文本编辑框组合使用
- 上述对齐,效果就是微调框靠在文本右侧
- 如果不设置合作者整数,点击微调框按钮,就没法改变文本框里的值
15. Progress Control 进度条
16. Data Time Picker 时间控件
可以设置显示格式
17. IP Address Control IP地址控件
高级控件
这里我直接使用关联变量,关联变量的知识在第十章有介绍
Tree Control 树控件
跟踪选择,就是鼠标移动到节点上会有个手的形状
基本操作
HTREEITEM hRoot = m_tree.InsertItem(_T("我的电脑"));//插入根节点
m_tree.InsertItem(_T("本地磁盘(C:)"), hRoot);//插入子节点
m_tree.InsertItem(_T("本地磁盘(D:)"), hRoot);
m_tree.InsertItem(_T("本地磁盘(E:)"), hRoot);
m_tree.InsertItem(_T("本地磁盘(F:)"), hRoot);
HTREEITEM hRoot1 = m_tree.InsertItem(_T("本地磁盘(G:)"), hRoot);
m_tree.InsertItem(_T("Administrator"), hRoot1);
m_tree.InsertItem(_T("Program Files"), hRoot1);
m_tree.InsertItem(_T("Program Files (x86)"), hRoot1);
m_tree.InsertItem(_T("Users"), hRoot1);
m_tree.InsertItem(_T("Windows"), hRoot1);
HTREEITEM hRoot2 = m_tree.InsertItem(_T("本地磁盘(H:)"), hRoot);
m_tree.InsertItem(_T("Program Files"), hRoot2);
m_tree.InsertItem(_T("Program Files (x86)"), hRoot2);
HTREEITEM hRoot3 = m_tree.InsertItem(_T("Users"), hRoot2);
//m_tree.Expand(hRoot, TVE_EXPAND);//展开根节点,只能展开当前一级的节点
m_tree.EnsureVisible(hRoot3);//展开指定节点,可以展开多级节点,到指定节点的路径都展开,包括父节点
遍历节点
void C高级控件Dlg::TraverseTree(HTREEITEM hItem)
{
CString strText = m_tree.GetItemText(hItem);//获取节点文本
MessageBox(strText);
HTREEITEM hChild = m_tree.GetChildItem(hItem);//获取子节点
while (hChild != NULL)
{
TraverseTree(hChild);
hChild = m_tree.GetNextItem(hChild, TVGN_NEXT);//获取下一个节点
}
}
void C高级控件Dlg::OnBnClickedButton1()
{
//获取根节点
HTREEITEM hRoot = m_tree.GetRootItem();
//遍历
if (hRoot)
TraverseTree(hRoot);
}
Tab Control 分页控件
-
首先在主窗口放上tab Control
-
想要在tab的分页上显示对话框,需要先创建对话框资源
-
这里创建了2个,然后给每个对话框右键添加类
-
主窗口cpp头文件包含并定义2个成员函数
-
然后在Dlg.cpp里写代码
OnInitDialog()函数添加
m_tab1.InsertItem(0, _T("窗口"));//插入选项卡
m_tab1.InsertItem(1, _T("进程"));
m_page1.Create(IDD_DIALOG1, &m_tab1);//创建模态对话框,父窗口为m_tab1
m_page2.Create(IDD_DIALOG2, &m_tab1);
m_page1.ShowWindow(SW_SHOW);//显示第一个选项卡
m_page2.ShowWindow(SW_HIDE);//隐藏第二个选项卡
CRect rect;
m_tab1.GetClientRect(&rect);//获取选项卡大小
//调整子窗口大小
m_page1.MoveWindow(rect.left + 1, rect.top + 20, rect.Width() - 2, rect.Height() - 21);//假设标签按钮宽度20
m_page2.MoveWindow(rect.left + 1, rect.top + 20, rect.Width() - 2, rect.Height() - 21);
- 右键类向导,选择对象IDC_TAB1,选择命令如下图
void C高级控件Dlg::OnTcnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult)
{
int curSel = m_tab1.GetCurSel();//获取当前选项卡
if (curSel == 0)
{
m_page1.ShowWindow(SW_SHOW);
m_page2.ShowWindow(SW_HIDE);
}
else if (curSel == 1)
{
m_page1.ShowWindow(SW_HIDE);
m_page2.ShowWindow(SW_SHOW);
}
*pResult = 0;
}
这样就实现了选项卡的切换
如果需要在分页上添加其他控件,只要在分页对话框上添加即可
实现窗口大小调整, 分页和子窗口也调整大小
类向导添加onsize消息,然后代码如下
void C高级控件Dlg::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
if (m_tab1.GetSafeHwnd())//如果选项卡存在
{
//调整选项卡大小
m_tab1.MoveWindow(0, 0, cx, cy);
//调整子窗口大小
m_page1.MoveWindow(0, 20, cx, cy - 20);
m_page2.MoveWindow(0, 20, cx, cy - 20);
}
}