回顾:

1 描述窗口之间关系的属性,有三大类:

  1. 重叠窗口(OVERLAPPEDWINDOW)<br /> 弹出窗口(POPUPWINDOW)<br /> 子窗口(CHILDWINDOW

2 操作窗口的函数:

  1. MoveWindow 将窗口移动到指定位置<br /> ShowWindow 显示或者隐藏窗口<br /> GetWindowText 获取窗口的标题(控件的话,就是获取控件的内容)<br /> SetWindowText 设置窗口的标题<br /> FindWindow 根据窗口名获取窗口句柄<br /> GetParent 获取一个窗口的父窗口句柄<br /> .....

3 创建一个控件,

使用的是CreateWindow这个函数,一般都会有以下2个属性:
WS_CHILD WS_VISIABLE

4 控件目前分为2类:

  1. 标准控件:被操作的时候,会给父窗口发送WM_COMMAD<br /> 按钮<br /> 单选框<br /> 复选框<br /> 编辑框<br /> 静态文本<br /> 下拉框<br /> 静态图片<br /> ....<br /> 通用控件<br /> 树<br /> 列表<br /> 选项卡

5 资源:图标 光标 菜单

  1. 基本使用方式:LoadIcon LoadCursor LoadMenu 得到句柄,填到窗口的窗口类的相应字段上。注意:菜单可以将句柄填写到CreateWindow时的相应参数上。<br /> 图标和光标一般是找到或者制作比较好看的资源。<br /> 菜单相关需要注意的知识点:<br /> 1 菜单项,在程序运行期间,可以动态添加选项或者删除选项。<br /> 2 菜单可以弹出来:TrackPopupMenu。弹出的菜单句柄需要是一个下来菜单的句柄。
  1. TrackPopupMenu(
  2. hSubMenu1, //要弹出的菜单的句柄
  3. TPM_LEFTALIGN, //对齐方式等属性
  4. pt.x, pt.y, //弹出的坐标,这个坐标是相对于屏幕的
  5. 0, //保留的参数 ,没有用
  6. hWnd, //菜单的响应窗口是谁(重要)
  7. NULL
  8. );

6 对话框的创建,

使用Dlg类型的资源去创建对话框,有两大类对话框:
模态对话框 DialogBox 函数会阻塞住父窗口 自带消息循环 对话框被关闭函数返回
非模态对话框 CreateDialog 不会阻塞住父窗口,调用的时候直接返回,自己写消息循环。
今日内容:
在一个程序中,有可能会出现多个窗口。此时的模态对话框和非模态对话框就能够显现出差别,比如,我们点击一个按钮,然后弹出一个对话框:

  1. case 0x1005:
  2. {
  3. //DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DlgProc);
  4. HWND hDlg = CreateDialog(g_hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DlgProc);
  5. UpdateWindow(hDlg);
  6. ShowWindow(hDlg, SW_SHOW);
  7. }

对话框上的控件:

复选框的使用

  1. //复选框的使用
  2. case IDC_B_CLEAN:
  3. {
  4. //1 检测复选框,哪些被选中
  5. // 获取复选框的句柄
  6. HWND hCheck1 = GetDlgItem(hWnd, IDC_CHECK1);
  7. HWND hCheck2 = GetDlgItem(hWnd, IDC_CHECK2);
  8. HWND hCheck3 = GetDlgItem(hWnd, IDC_CHECK3);
  9. //2 获取状态,去清理磁盘
  10. BOOL bCheck = 0;
  11. bCheck = SendMessage(hCheck1, BM_GETCHECK, 0, 0);
  12. if (bCheck==TRUE)
  13. {
  14. MessageBox(0, L"开始清理C盘", 0, 0);
  15. }
  16. bCheck = SendMessage(hCheck2, BM_GETCHECK, 0, 0);
  17. if (bCheck == TRUE)
  18. {
  19. MessageBox(0, L"开始清理D盘", 0, 0);
  20. }
  21. bCheck = SendMessage(hCheck3, BM_GETCHECK, 0, 0);
  22. if (bCheck == TRUE)
  23. {
  24. MessageBox(0, L"开始清理E盘", 0, 0);
  25. }
  26. }
  27. break;
  28. case IDC_B_ALLSEL:
  29. {
  30. //1 检测复选框,哪些被选中
  31. // 获取复选框的句柄
  32. HWND hCheck1 = GetDlgItem(hWnd, IDC_CHECK1);
  33. HWND hCheck2 = GetDlgItem(hWnd, IDC_CHECK2);
  34. HWND hCheck3 = GetDlgItem(hWnd, IDC_CHECK3);
  35. SendMessage(hCheck1, BM_SETCHECK, 1, 0);
  36. SendMessage(hCheck2, BM_SETCHECK, 1, 0);
  37. SendMessage(hCheck3, BM_SETCHECK, 1, 0);
  38. }

image.png

单选框的使用:


  1. case IDC_B_LOGIN:
  2. {
  3. HWND hRadio1 = GetDlgItem(hWnd, IDC_RADIO1);
  4. HWND hRadio2 = GetDlgItem(hWnd, IDC_RADIO2);
  5. HWND hRadio3 = GetDlgItem(hWnd, IDC_RADIO3);
  6. HWND hRadio4 = GetDlgItem(hWnd, IDC_RADIO4);
  7. BOOL bCheck = 0;
  8. bCheck = SendMessage(hRadio1, BM_GETCHECK, 0, 0);
  9. if (bCheck ==TRUE )
  10. {
  11. MessageBox(0, L"登录联通服务器", 0, 0);
  12. }
  13. bCheck = SendMessage(hRadio2, BM_GETCHECK, 0, 0);
  14. if (bCheck == TRUE)
  15. {
  16. MessageBox(0, L"登录电信服务器", 0, 0);
  17. }
  18. bCheck = SendMessage(hRadio3, BM_GETCHECK, 0, 0);
  19. if (bCheck == TRUE)
  20. {
  21. MessageBox(0, L"登录移动服务器", 0, 0);
  22. }
  23. bCheck = SendMessage(hRadio4, BM_GETCHECK, 0, 0);
  24. if (bCheck == TRUE)
  25. {
  26. MessageBox(0, L"登录教育网服务器", 0, 0);
  27. }
  28. }
  29. break;

image.png

但是,有一个问题,就是所有的Radio选项,只能选一个。如果有两组的话,这样就会出问题。
我们需要能够将radio去分组:
ctrl+D 将同一组内的radio序号是连续的。
每一组的第一个radio,将其Group属性设置为True。然后就分组了。

image.png

image.png

静态文本:没有什么操作,就是起到提示作用。

静态图片:

拖拽一个图片控件

image.png

将其类型修改为Bitmap。
image.png

我们需要一个bitmap的图片资源。(bmp格式的图片)

image.png

下拉框控件(ComboBox):

基本操作:
需要注意的是,下拉框的高度,需要点击 小三角才能调整:
image.png
1 添加选项

  1. case IDC_B_ADDCOMBO:
  2. {
  3. wchar_t Buf[8][10] =
  4. { L"三里屯",
  5. L"南锣鼓巷",L"十三陵",L"五道口",
  6. L"十五派" };
  7. static int nIndex = 0;
  8. //1 获取ComboBox的句柄
  9. HWND hCombo = GetDlgItem(hWnd, IDC_COMBO1);
  10. //2 添加一个选项
  11. ComboBox_AddString(hCombo, Buf[nIndex]);
  12. nIndex++;
  13. }

2 获取选项

  1. case IDC_B_GETCOMBO:
  2. {
  3. //1 获取ComboBox的句柄
  4. HWND hCombo = GetDlgItem(hWnd, IDC_COMBO1);
  5. //2 再获取选项
  6. int n = ComboBox_GetCurSel(hCombo);
  7. //3 获取选择的文本
  8. WCHAR szText[64] = { 0 };
  9. ComboBox_GetText(hCombo, szText, 64);
  10. //4 输出出来
  11. _MyMessageBox(L"选择的是第%d项,内容为%s", n, szText);
  12. }
  13. break;
  14. default:
  15. break;
  16. }

通用控件:进度条 滑块 列表框

进度条:

image.png

  1. case IDC_B_PROGINC:
  2. {
  3. static int n = 0;
  4. //1 获取进度条控件的句柄
  5. HWND hPro = GetDlgItem(hWnd, IDC_PROGRESS1);
  6. //2 设置进度
  7. SendMessage(hPro, PBM_SETPOS, n, 0);
  8. n += 5;
  9. if (n>=100)
  10. {
  11. n = 0;
  12. }
  13. }

滑块:

滑块再拖动的时候,会给父窗口发送WM_HSCROLL消息,以及WM_VSCROLL。
检测滑动:

  1. case WM_HSCROLL:
  2. {
  3. //1 获取滑块的句柄
  4. HWND hSlider = GetDlgItem(hWnd, IDC_SLIDER1);
  5. //2 获取滑块的当前位置
  6. int nLoc = SendMessage(hSlider, TBM_GETPOS, 0, 0);
  7. _trace(L"%d\n", nLoc);
  8. }

设置滑块的位置:

  1. case IDC_B_SETSLIDER:
  2. {
  3. //1 获取滑块的句柄
  4. HWND hSlider = GetDlgItem(hWnd, IDC_SLIDER1);
  5. //2 获取滑块的当前位置
  6. int nLoc = SendMessage(hSlider, TBM_GETPOS, 0, 0);
  7. //3 +5再设置上去
  8. SendMessage(hSlider, TBM_SETPOS,TRUE , nLoc + 5);
  9. }

列表框控件:

image.png

将属性调整为报表模式
image.png

ListVIew的基本操作:

添加列
添加行
删除行

  1. case IDC_B_INSERT_COL://给列表框添加列
  2. {
  3. LVCOLUMN lc = { 0 };
  4. // 姓名 年龄 性别 身高
  5. //1 获取控件的句柄
  6. HWND hList = GetDlgItem(hWnd, IDC_LIST2);
  7. //2 添加
  8. lc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT;
  9. lc.fmt = LVCFMT_LEFT;
  10. lc.cx = 100;
  11. lc.pszText = (LPWSTR)L"姓名";
  12. ListView_InsertColumn(hList, 0, &lc);
  13. lc.pszText = (LPWSTR)L"年龄";
  14. ListView_InsertColumn(hList, 1, &lc);
  15. lc.pszText = (LPWSTR)L"性别";
  16. ListView_InsertColumn(hList, 2, &lc);
  17. lc.pszText = (LPWSTR)L"身高";
  18. ListView_InsertColumn(hList, 3, &lc);
  19. }
  20. break;
  21. case IDC_B_INSERT_ITEM://给列表框添加行
  22. {
  23. LVITEM li = {};
  24. //1 获取控件的句柄
  25. HWND hList = GetDlgItem(hWnd, IDC_LIST2);
  26. //2 添加一行
  27. li.mask = LVIF_TEXT;
  28. li.pszText = (LPWSTR)L"小芳";
  29. li.iItem = 0;
  30. ListView_InsertItem(hList, &li);
  31. //3 给行内单元格设置文本
  32. ListView_SetItemText(hList, 0, 1, (LPWSTR)L"20");
  33. ListView_SetItemText(hList, 0, 2, (LPWSTR)L"女");
  34. ListView_SetItemText(hList, 0, 3, (LPWSTR)L"170");
  35. //2 添加一行
  36. li.mask = LVIF_TEXT;
  37. li.pszText = (LPWSTR)L"小明";
  38. li.iItem = 1;
  39. ListView_InsertItem(hList, &li);
  40. //3 给行内单元格设置文本
  41. ListView_SetItemText(hList, 1, 1, (LPWSTR)L"20");
  42. ListView_SetItemText(hList, 1, 2, (LPWSTR)L"男");
  43. ListView_SetItemText(hList, 1, 3, (LPWSTR)L"170");
  44. }
  45. break;
  46. case IDC_B_DELETE_ITEM://给列表框删除一行
  47. {
  48. //1 获取控件的句柄
  49. HWND hList = GetDlgItem(hWnd, IDC_LIST2);
  50. //2 删除一行
  51. ListView_DeleteItem(hList, 1);
  52. }

List控件的高级用法:

通过设置扩展属性,能够让list控件具有更多特性:

  1. case IDC_B_SETLISTEX:
  2. {
  3. HWND hList = GetDlgItem(hWnd, IDC_LIST2);
  4. ListView_SetExtendedListViewStyle(hList,
  5. LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
  6. }

处理List_View的WM_NOTIFY消息:

  1. case WM_NOTIFY://我们在这里仅响应了一个列表框的右键点击
  2. {
  3. switch (wParam)
  4. {
  5. case IDC_LIST2:
  6. {
  7. NMHDR* pNm = (NMHDR*)lParam;
  8. if (pNm->code == NM_RCLICK)//右键点击
  9. {
  10. wchar_t buf[64] = {};
  11. LPNMITEMACTIVATE lpnmitem = (LPNMITEMACTIVATE)lParam;
  12. //HWND hList = GetDlgItem(hWnd, IDC_LIST2);
  13. HWND hList = lpnmitem->hdr.hwndFrom;//发送消息的控件句柄
  14. ListView_GetItemText(hList, lpnmitem->iItem,
  15. lpnmitem->iSubItem, buf, 64);
  16. MessageBox(0, buf, 0, 0);
  17. }
  18. }
  19. default:
  20. break;
  21. }
  22. }