回顾:
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;
}
}