1. 创建一个对话框程序1 - 创建步骤
在项目的资源区创建一个对话框
删除掉VS2012自动生成的创建窗口代码
添加我们的创建窗口代码:
// 创建非模态对话框
HWND hWnd = (HWND)CreateDialog(hInstance, LPTSTR(IDD_DIALOG1), 0, (DLGPROC)WndProc);
1. 创建一个对话框程序2 - 注意事项
不再需要注册窗口类,消息回调函数的未处理消息不用再传递给DefWindowProc,而是直接返回FALSE,如果所有消息都已经处理,直接返回TRUE
备注: 可以使用类似于以下代码为窗口设置菜单
g_hMenu = LoadMenu(hInstance, MAKEINTRESOURCE(IDC_WIN32));
switch (message)
case WM_INITDIALOG:
{
SetMenu(hWnd, g_hMenu);
}
break;
1.多选框 (Check Box)控件
HWND hChekcBox = GetDlgItem(主窗口句柄, 资源ID)
设置为选中状态
SendMessage(hCheckBox, BM_SETCHECK, BS_3STATE, 0);
取消其选中状态
SendMessage(hCheckBox, BM_SETCHECK, 0, 0);
获取其选中状态
BOOL bIsCheck = SendMessage(hCheckBox, BM_GETCHECK, 0, 0);
3. 进度条 (ProgressControl) 控件
HWND hPosControl = GetDlgItem(主窗口句柄, 资源ID)
设置进度(注: 数值必须为0~100之间)
SendMessage(hPosControl, PBM_SETPOS, 数值, 0);
获取进度
int nPos = SendMessage(hPosControl, PBM_GETPOS, 0, 0);
4. 滑块(SliderControl) 控件
HWND hSliderControl = GetDlgItem(主窗口句柄,资源ID)
设置滑块范围值
SendMessage(hSliderControl, TBM_SETRANGE, true, MAKELONG(最小值, 最大值));
设置滑块值
SendMessage(hSiderControl, TBM_SETPOS, true, 值);
获取滑块值
int nPos = SendMessage(hSliderControl, TBM_GETPOS, 0, 0);
5. 下拉框(ComboBox)控件
点小黑箭头,可以拉高整个窗口
可以用宏代替SendMessage
#include <Windowsx.h>
HWND hComBox = GetDlgItem(/*主窗口句柄*/, /*资源ID*/);
添加选项
ComboBox_AddString(hComBox, L"选项名");
设置选项
ComboBox_SelectString(hComBox, -1, L"选项名");
获取选项序号
int nCurSel = ComboBox_GetCurSel(hComBox);
获取选项内容
WCHAR szText[64] = {0};
ComboBox_GetText(hWnd, szText, 64);
6. 图片(PictureControl) 控件
首先需要编辑控件类型为"Bitmap"
HWND hPicCtr = GetDlgItem(hWnd, PIC);
HBITMAP hBitMap = LoadBitmap(GetModuleHandle(0), MAKEINTRESOURCE(IDB_BITMAP1));
加载并显示位图
SendMessage(hPicCtr, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitMap);
加载并显示图标
HDC hdc = GetDC(hWnd);
HICON hIcon = LoadIcon(GetModuleHandle(0), MAKEINTRESOURCE(IDI_ICON1));
DrawIcon(hdc, 75, 306, hIcon);
ReleaseDC(hWnd, hdc);
7. 可以正常接收按键消息的窗口
需要使用CreateDialog函数创建窗口
HWND hWnd = (HWND)CreateDialog(hInstance,LPTSTR(IDD_DIALOG1),0,(DLGPROC)WndProc);
修改消息循环机制
// 主消息循环
while (GetMessage(&msg, NULL, NULL, NULL))
{
if (WM_KEYDOWN == msg.message)
{
SendMessage(hWnd, WM_KEYDOWN, msg.wParam, msg.lParam);
}
else
{
// 不是非模式对话框的消息才分发
if (!IsDialogMessage(hWnd, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
在WM_KEYDOWN下添加以下代码
#include <Strsafe.h>
#include <mmsystem.h>
#prama comment(lib, "WINMM.LIB")
WCHAR szFullPath[MAX_PATH];
StringCbPrintf(szFullPath, MAX_PATH, L"Sound\\Sound_%C.wav", wParam);
sndPlaySound(szFullPath, SND_ASYNC);
8. 列表(List View)控件A -- 创建流程
在窗口中添加一个列表控件往往分为以下几步:
1. 在相应对话框上添加List Control控件
2. 初始化List Control控件的状态及内容(View属性改为Report才有效)
3. 调整List Control控件样式,以使符号要求
4. 添加剩余功能
关键函数:
ListView_InsertColumu();
8. 列表(List View)控件B-- 初始化
LVCOLUMN lvc = {0}; // 定义结构体
lvc.mask = LVCF_WIDTH|LVCF_TEXT; // 列表框样式
lvc.cx = 90 ; // 列的宽度
lvc.iImage = 1; // 与列表框关联的指定图像的索引值
lvc.fmt = LVCFMT_LEFT; // 列的对齐方式
lvc.pszText = L"name"; // 列名
lvc.iSubItem = 0; // 列序号
ListView_InsertColumn(GetDlgItem(hWnd,IDC_LIST1), lvc.iSubItem, &lvc);
lvc.pszText = L"type";
lvc.cx = 50 ;
lvc.iSubItem = 1;
ListView_InsertColumn(GetDlgItem(hWnd,IDC_LIST1), lvc.iSubItem, &lvc);
lvc.pszText = L"size";
lvc.cx = 50 ;
lvc.iSubItem = 2;
ListView_InsertColumn(GetDlgItem(hWnd,IDC_LIST1), lvc.iSubItem, &lvc);
8. 列表(List View)控件C-- 添加项
用以下代码插入一项(行), 并设置某一子项(列)的值
LVITEM lvItem = {0};
lvItem.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM|LVIF_STATE;
lvItem.state = 0; // 子项的状态
lvItem.stateMask = 0; // 状态有效的屏蔽位
lvItem.iImage = 0; // 与列表框关联的指定图像的索引值
lvItem.iSubItem = 0; // 子项的索引值(可以视为列号)
lvItem.iItem = 0; // 项的索引值(可以视为行号)
lvItem.pszText = L"name1"; // 该项的某子项的值
lvItem.cchTextMax = wcslen(lvItem.pszText)+sizeof(TCHAR);
ListView_InsertItem(GetDlgItem(hWnd, IDC_LIST1), &lvItem);
ListView_SetItemText(GetDlgItem(hWnd, IDC_LIST1), lvItem.iItem, 2, L"a");
8. 列表(List View)控件D-- 右键菜单
编辑完菜单资源后,在WM_NOTIFY消息下添加如下代码:
// 1. 判断是否为右键单击消息,不是的话直接返回
if ( NM_RCLICK != ((LPNMHDR)lParam)->code )
{
break;
}
// 2. 初始化必要的信息
POINT stcPoint = {0}; // 发生次消息时的鼠标坐标
HWND hList = GetDlgItem(hWnd, IDC_LIST1); // 列表框的HWND
GetCursorPos(&stcPoint);
// 3. 将鼠标位置转化为相对坐标,然后测试是否选中的列表框中的某一项
int nItemIndex;
TVHITTESTINFO thti;
ScreenToClient(hList, &stcPoint);
thti.pt = stcPoint;
thti.flags = LVHT_EX_GROUP_HEADER;
nItemIndex = ListView_HitTestEx(hList, &thti);
// 4. 如果选取了,则弹出菜单
if (-1 != nItemIndex)
{
// 4.1 加载菜单资源
HMENU hMenu = LoadMenu(NULL, MAKEINTRESOURCE(IDR_MENU1));
HMENU hPopup = GetSubMenu(hMenu, 0);
if (!hMenu||!hPopup)
{
break;
}
// 4.2 将相对坐标转换为原鼠标位置
ClientToScreen(hList, &stcPoint);
// 4.3 弹出菜单
TrackPopupMenuEx(hPopup, TPM_LEFTALIGN|TPM_RIGHTBUTTON, stcPoint.x,
stcPoint.y, hWnd, NULL);
// 4.4 释放相关资源
DestroyMenu(hMenu);
9. 树(Tree View)控件A -- 插入函数
/***************************************************************************************
* 参数一: 树形控件句柄
* 参数二: 插入项名
* 参数三: 欲插入项的父项句柄
* 参数四: 欲插入项是否为文件夹
* 功 能: 插入一项到鼠标选中树形控件某处
****************************************************************************************/
HTREEITEM AddItemToTree( HWND hTree,LPWSTR lpItemName,HTREEITEM hParent, BOOL bFolder)
{
TVITEM tvi = {0}; // 树节点项属性信息
TVINSERTSTRUCT tvins = {0}; // 树形控件的节点信息
tvi.mask = TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_PARAM;
tvi.pszText = lpItemName;
tvi.cchTextMax = wcslen(lpItemName)+sizeof(TCHAR);
if ( bFolder )
{
tvi.iImage = 1; tvi.iSelectedImage = 2;
tvi.cChildren = I_CHILDRENCALLBACK;
}
else
{
tvi.iImage = 3; tvi.iSelectedImage = 3;
tvi.cChildren = 0;
}
tvins.item = tvi; // 插入点的属性信息
tvins.hInsertAfter = TVI_SORT; // 插入位置
if ( NULL == hParent ) // 父节点的句柄
tvins.hParent = TVI_ROOT;
else
tvins.hParent = hParent;
return TreeView_InsertItem(hTree,&tvins);
}
9. 树(Tree View)控件B -- 初始化
HWND hTreeCtrl = GetDlgItem(hWnd, IDC_TREE1);
// 返回数形控件中选中项的句柄,父节点为空
HTREEITEM hItem = TreeView_GetSelection(hTreeCtrl);
if ( hItem )
AddItemToTree(hTreeCtrl, L"15PB", hItem, FALSE);
else
AddItemToTree(hTreeCtrl, L"15PB", NULL, FALSE);
9. 树(Tree View)控件C -- 获取项内容
a. 获取选择项
HWND hTreeCtrl = GetDlgItem(hWnd,IDC_TREE1);
HTREEITEM hItem = TreeView_GetSelection(hTreeCtrl);
b. 获取项内容
WCHAR szMame[32] = {0};
TVITEM stcItem = {0};
stcItem.hItem = hItem;
stcItem.cchTextMax = 32;
stcItem.pszText = szMame;
stcItem.mask = TVIF_TEXT|TVIF_HANDLE;
TreeView_GetItem( hTreeCtrl, &stcItem );