回顾:
1 描述窗口之间关系的属性,有三大类:
重叠窗口(OVERLAPPEDWINDOW)<br /> 弹出窗口(POPUPWINDOW)<br /> 子窗口(CHILDWINDOW)
2 操作窗口的函数:
MoveWindow 将窗口移动到指定位置<br /> ShowWindow 显示或者隐藏窗口<br /> GetWindowText 获取窗口的标题(控件的话,就是获取控件的内容)<br /> SetWindowText 设置窗口的标题<br /> FindWindow 根据窗口名获取窗口句柄<br /> GetParent 获取一个窗口的父窗口句柄<br /> .....
3 创建一个控件,
使用的是CreateWindow这个函数,一般都会有以下2个属性:
    WS_CHILD      WS_VISIABLE
4 控件目前分为2类:
标准控件:被操作的时候,会给父窗口发送WM_COMMAD<br /> 按钮<br /> 单选框<br /> 复选框<br /> 编辑框<br /> 静态文本<br /> 下拉框<br /> 静态图片<br /> ....<br /> 通用控件<br /> 树<br /> 列表<br /> 选项卡
5 资源:图标 光标 菜单
基本使用方式:LoadIcon LoadCursor LoadMenu 得到句柄,填到窗口的窗口类的相应字段上。注意:菜单可以将句柄填写到CreateWindow时的相应参数上。<br /> 图标和光标一般是找到或者制作比较好看的资源。<br /> 菜单相关需要注意的知识点:<br /> 1 菜单项,在程序运行期间,可以动态添加选项或者删除选项。<br /> 2 菜单可以弹出来:TrackPopupMenu。弹出的菜单句柄需要是一个下来菜单的句柄。
TrackPopupMenu(hSubMenu1, //要弹出的菜单的句柄TPM_LEFTALIGN, //对齐方式等属性pt.x, pt.y, //弹出的坐标,这个坐标是相对于屏幕的0, //保留的参数 ,没有用hWnd, //菜单的响应窗口是谁(重要)NULL);
6 对话框的创建,
使用Dlg类型的资源去创建对话框,有两大类对话框:
    模态对话框          DialogBox         函数会阻塞住父窗口   自带消息循环   对话框被关闭函数返回 
    非模态对话框      CreateDialog     不会阻塞住父窗口,调用的时候直接返回,自己写消息循环。
今日内容:
在一个程序中,有可能会出现多个窗口。此时的模态对话框和非模态对话框就能够显现出差别,比如,我们点击一个按钮,然后弹出一个对话框:
case 0x1005:{//DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DlgProc);HWND hDlg = CreateDialog(g_hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DlgProc);UpdateWindow(hDlg);ShowWindow(hDlg, SW_SHOW);}
对话框上的控件:
复选框的使用
//复选框的使用case IDC_B_CLEAN:{//1 检测复选框,哪些被选中// 获取复选框的句柄HWND hCheck1 = GetDlgItem(hWnd, IDC_CHECK1);HWND hCheck2 = GetDlgItem(hWnd, IDC_CHECK2);HWND hCheck3 = GetDlgItem(hWnd, IDC_CHECK3);//2 获取状态,去清理磁盘BOOL bCheck = 0;bCheck = SendMessage(hCheck1, BM_GETCHECK, 0, 0);if (bCheck==TRUE){MessageBox(0, L"开始清理C盘", 0, 0);}bCheck = SendMessage(hCheck2, BM_GETCHECK, 0, 0);if (bCheck == TRUE){MessageBox(0, L"开始清理D盘", 0, 0);}bCheck = SendMessage(hCheck3, BM_GETCHECK, 0, 0);if (bCheck == TRUE){MessageBox(0, L"开始清理E盘", 0, 0);}}break;case IDC_B_ALLSEL:{//1 检测复选框,哪些被选中// 获取复选框的句柄HWND hCheck1 = GetDlgItem(hWnd, IDC_CHECK1);HWND hCheck2 = GetDlgItem(hWnd, IDC_CHECK2);HWND hCheck3 = GetDlgItem(hWnd, IDC_CHECK3);SendMessage(hCheck1, BM_SETCHECK, 1, 0);SendMessage(hCheck2, BM_SETCHECK, 1, 0);SendMessage(hCheck3, BM_SETCHECK, 1, 0);}
单选框的使用:
case IDC_B_LOGIN:{HWND hRadio1 = GetDlgItem(hWnd, IDC_RADIO1);HWND hRadio2 = GetDlgItem(hWnd, IDC_RADIO2);HWND hRadio3 = GetDlgItem(hWnd, IDC_RADIO3);HWND hRadio4 = GetDlgItem(hWnd, IDC_RADIO4);BOOL bCheck = 0;bCheck = SendMessage(hRadio1, BM_GETCHECK, 0, 0);if (bCheck ==TRUE ){MessageBox(0, L"登录联通服务器", 0, 0);}bCheck = SendMessage(hRadio2, BM_GETCHECK, 0, 0);if (bCheck == TRUE){MessageBox(0, L"登录电信服务器", 0, 0);}bCheck = SendMessage(hRadio3, BM_GETCHECK, 0, 0);if (bCheck == TRUE){MessageBox(0, L"登录移动服务器", 0, 0);}bCheck = SendMessage(hRadio4, BM_GETCHECK, 0, 0);if (bCheck == TRUE){MessageBox(0, L"登录教育网服务器", 0, 0);}}break;

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


静态文本:没有什么操作,就是起到提示作用。
静态图片:
拖拽一个图片控件

将其类型修改为Bitmap。
我们需要一个bitmap的图片资源。(bmp格式的图片)
下拉框控件(ComboBox):
基本操作:
需要注意的是,下拉框的高度,需要点击  小三角才能调整:
1 添加选项
case IDC_B_ADDCOMBO:{wchar_t Buf[8][10] ={ L"三里屯",L"南锣鼓巷",L"十三陵",L"五道口",L"十五派" };static int nIndex = 0;//1 获取ComboBox的句柄HWND hCombo = GetDlgItem(hWnd, IDC_COMBO1);//2 添加一个选项ComboBox_AddString(hCombo, Buf[nIndex]);nIndex++;}
2 获取选项
case IDC_B_GETCOMBO:{//1 获取ComboBox的句柄HWND hCombo = GetDlgItem(hWnd, IDC_COMBO1);//2 再获取选项int n = ComboBox_GetCurSel(hCombo);//3 获取选择的文本WCHAR szText[64] = { 0 };ComboBox_GetText(hCombo, szText, 64);//4 输出出来_MyMessageBox(L"选择的是第%d项,内容为%s", n, szText);}break;default:break;}
通用控件:进度条 滑块 列表框
进度条:

case IDC_B_PROGINC:{static int n = 0;//1 获取进度条控件的句柄HWND hPro = GetDlgItem(hWnd, IDC_PROGRESS1);//2 设置进度SendMessage(hPro, PBM_SETPOS, n, 0);n += 5;if (n>=100){n = 0;}}
滑块:
滑块再拖动的时候,会给父窗口发送WM_HSCROLL消息,以及WM_VSCROLL。
检测滑动:
case WM_HSCROLL:{//1 获取滑块的句柄HWND hSlider = GetDlgItem(hWnd, IDC_SLIDER1);//2 获取滑块的当前位置int nLoc = SendMessage(hSlider, TBM_GETPOS, 0, 0);_trace(L"%d\n", nLoc);}
设置滑块的位置:
case IDC_B_SETSLIDER:{//1 获取滑块的句柄HWND hSlider = GetDlgItem(hWnd, IDC_SLIDER1);//2 获取滑块的当前位置int nLoc = SendMessage(hSlider, TBM_GETPOS, 0, 0);//3 +5再设置上去SendMessage(hSlider, TBM_SETPOS,TRUE , nLoc + 5);}
列表框控件:

将属性调整为报表模式
ListVIew的基本操作:
添加列
添加行
删除行
case IDC_B_INSERT_COL://给列表框添加列{LVCOLUMN lc = { 0 };// 姓名 年龄 性别 身高//1 获取控件的句柄HWND hList = GetDlgItem(hWnd, IDC_LIST2);//2 添加lc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT;lc.fmt = LVCFMT_LEFT;lc.cx = 100;lc.pszText = (LPWSTR)L"姓名";ListView_InsertColumn(hList, 0, &lc);lc.pszText = (LPWSTR)L"年龄";ListView_InsertColumn(hList, 1, &lc);lc.pszText = (LPWSTR)L"性别";ListView_InsertColumn(hList, 2, &lc);lc.pszText = (LPWSTR)L"身高";ListView_InsertColumn(hList, 3, &lc);}break;case IDC_B_INSERT_ITEM://给列表框添加行{LVITEM li = {};//1 获取控件的句柄HWND hList = GetDlgItem(hWnd, IDC_LIST2);//2 添加一行li.mask = LVIF_TEXT;li.pszText = (LPWSTR)L"小芳";li.iItem = 0;ListView_InsertItem(hList, &li);//3 给行内单元格设置文本ListView_SetItemText(hList, 0, 1, (LPWSTR)L"20");ListView_SetItemText(hList, 0, 2, (LPWSTR)L"女");ListView_SetItemText(hList, 0, 3, (LPWSTR)L"170");//2 添加一行li.mask = LVIF_TEXT;li.pszText = (LPWSTR)L"小明";li.iItem = 1;ListView_InsertItem(hList, &li);//3 给行内单元格设置文本ListView_SetItemText(hList, 1, 1, (LPWSTR)L"20");ListView_SetItemText(hList, 1, 2, (LPWSTR)L"男");ListView_SetItemText(hList, 1, 3, (LPWSTR)L"170");}break;case IDC_B_DELETE_ITEM://给列表框删除一行{//1 获取控件的句柄HWND hList = GetDlgItem(hWnd, IDC_LIST2);//2 删除一行ListView_DeleteItem(hList, 1);}
List控件的高级用法:
通过设置扩展属性,能够让list控件具有更多特性:
case IDC_B_SETLISTEX:{HWND hList = GetDlgItem(hWnd, IDC_LIST2);ListView_SetExtendedListViewStyle(hList,LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);}
处理List_View的WM_NOTIFY消息:
case WM_NOTIFY://我们在这里仅响应了一个列表框的右键点击{switch (wParam){case IDC_LIST2:{NMHDR* pNm = (NMHDR*)lParam;if (pNm->code == NM_RCLICK)//右键点击{wchar_t buf[64] = {};LPNMITEMACTIVATE lpnmitem = (LPNMITEMACTIVATE)lParam;//HWND hList = GetDlgItem(hWnd, IDC_LIST2);HWND hList = lpnmitem->hdr.hwndFrom;//发送消息的控件句柄ListView_GetItemText(hList, lpnmitem->iItem,lpnmitem->iSubItem, buf, 64);MessageBox(0, buf, 0, 0);}}default:break;}}
