非模态对话框
CreateDiaLog:创建一个非模态对话框。
ShowWindow:显示此对话框
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd
)
{
//创建非模态对话框窗口
HWND hwnd = CreateDialogW(hInstance, MAKEINTRESOURCEW(IDD_DIALOG1), NULL, Dlgproc);
显示窗口
ShowWindow(hwnd,SW_SHOWNORMAL);
MSG msg{ 0 };
while (GetMessage(&msg, NULL, NULL, NULL))
{
TranslateMessage(&msg); //转换消息
DispatchMessageW(&msg); //分发消息
}
return 0;
}
非模态回调函数:
INT_PTR CALLBACK Dlgproc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch (uMsg)
{
case WM_INITDIALOG:
{
break;
}
case WM_CLOSE:
{
DestroyWindow(hwnd); //销毁窗口
PostQuitMessage(NULL); //传递退出消息
break;
}
default:
return FALSE;
break;
}
return TRUE;
}
模态对话框
模态对话框相比较非模态对话框非常简单,我们只需要使用DiaLogBoxW便可以创建一个非模态的对话框,不需要显示窗口,也不需要处理消息,同时在回调函数中只需使用EndDiaLog便可以结束窗口。
INT_PTR CALLBACK Dlgproc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch (uMsg)
{
case WM_INITDIALOG:
{
break;
}
case WM_CLOSE:
{
EndDialog(hwnd, NULL);
break;
}
default:
return FALSE;
break;
}
return TRUE;
}
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd
)
{
//创建模态对话框
DialogBoxW(hInstance, MAKEINTRESOURCEW(IDD_DIALOG1), NULL, Dlgproc);
return 0;
}
非模态对话框里控件的使用
按钮
首先创建一个资源。
我们能否实现点击 《获取多选框》 就获取到多选框的选中信息,点击《获取单选框》就获取到单选框的选中信息?
像是单选框,多选框等控件它们都属于标准控件,我们可以使用WM_COMMAND获取他们的消息
case WM_COMMAND:
{
// 获取控件的标识符
WORD Controlid = LOWORD(wParam);
switch (Controlid)
{
case IDOK: //获取多选框信息
{
WCHAR Dst_wchar[100]{ 0 };
for (UINT i = IDC_CHECK1; i <= IDC_CHECK3; ++i)
{
//获取选中状态
UINT Checked = SendDlgItemMessageW(hwnd, i, BM_GETCHECK, NULL, NULL);
if (Checked == BST_CHECKED)
{ //按钮为选中状态
GetDlgItemTextW(hwnd, i, Dst_wchar, 100);
MessageBoxW(hwnd, Dst_wchar, L"提示", MB_OK);
}
}
break;
}
case IDCANCEL: //获取单选框信息
{
WCHAR Dst_wchar[100]{ 0 };
for (UINT i = IDC_RADIO1; i <= IDC_RADIO3; ++i)
{
//获取选中状态
UINT Checked = SendDlgItemMessageW(hwnd, i, BM_GETCHECK, NULL, NULL);
if (Checked == BST_CHECKED)
{ //按钮为选中状态
GetDlgItemTextW(hwnd, i, Dst_wchar, 100);
MessageBoxW(hwnd, Dst_wchar, L"提示", MB_OK);
}
}
break;
}
复选框
实现功能: 给你多张图片,和一个复选框,我们可以由复选框来选择哪张图片做演示。
添加复选框的选择信息:
case WM_INITDIALOG:
{
/*
设置图片资源
*/
HBITMAP bitmap1 = LoadBitmapW(hInstance, MAKEINTRESOURCEW(IDB_BITMAP1));
SendDlgItemMessageW(hwnd, IDC_STATIC1, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)bitmap1);
/*
设置复选框的内容
*/
ComboBox_AddString(GetDlgItem(hwnd, IDC_COMBO1), L"第一张图片");
ComboBox_AddString(GetDlgItem(hwnd, IDC_COMBO1), L"第二张图片");
//默认选择第1个
ComboBox_SetCurSel(GetDlgItem(hwnd, IDC_COMBO1), 0);
break;
}
当然,你也可以使用在图形界面直接添加的方式。
处理选择图片的消息事件:
case WM_COMMAND:
{
WORD controlid = LOWORD(wParam); //控件标识符
WORD msgType = HIWORD(wParam); //控件通知码
switch (controlid)
{
case IDC_COMBO1:
{
if (msgType == CBN_SELCHANGE)
{
//1. 获取下拉框的选项index
int index = ComboBox_GetCurSel(GetDlgItem(hwnd, IDC_COMBO1));
//2. 改变图片,利用Load加载图片,然后再使用Send来往静态图片句柄发送图片信息
HBITMAP bitmap1 = LoadBitmapW(hInstance, MAKEINTRESOURCEW(IDB_BITMAP1 + index));
SendDlgItemMessageW(hwnd, IDC_STATIC1, STM_SETIMAGE, IMAGE_BITMAP, (LONG)bitmap1);
}
break;
}
}
}
运行效果:
第一张图片:
第二张图片:
滑块与进度条
实现功能: 拖动滑块,实现进度条与滑块同时移动
设置滑块与进度条的范围,移动步数等等 …
注意:滑块使用TBM_… 进度条使用PBM_ …
case WM_INITDIALOG:
{
SendDlgItemMessageW(hwnd, IDC_PROGRESS1, PBM_SETRANGE, 0, MAKELPARAM(0, 100));
SendDlgItemMessageW(hwnd, IDC_SLIDER1, TBM_SETRANGE, TRUE, MAKELPARAM(0, 100));
SendDlgItemMessageW(hwnd, IDC_PROGRESS1, PBM_SETPOS, 50, 0);
SendDlgItemMessageW(hwnd, IDC_SLIDER1, TBM_SETPOS, TRUE, 80);
break;
}
处理消息事件:
使用WM_HSCROLL处理滑块滑动的处理事件
得到滑块的滑动信息的同时设置进度条的位置。
case WM_HSCROLL:
{
if (GetDlgItem(hwnd, IDC_SLIDER1) == (HWND)lParam)
{
int pos = SendDlgItemMessageW(hwnd,IDC_SLIDER1, TBM_GETPOS, 0, 0);
SendDlgItemMessageW(hwnd, IDC_PROGRESS1, PBM_SETPOS, pos, 0);
}
break;
}
运行结果: (移动滑块,进度条也跟着变化)
列表框
实现一个像任务管理器一样的列表视图
插入列
BOOL InsertColumnw(HWND hwnd,UINT col,LPWSTR ColumName,UINT cx)
{
LVCOLUMNW lvcolumnw = { LVCF_FMT | LVCF_WIDTH | LVCF_TEXT };
lvcolumnw.fmt = LVCFMT_CENTER;
lvcolumnw.cx = cx;
lvcolumnw.pszText = ColumName;
SendDlgItemMessageW(hwnd, IDC_LIST2, LVM_INSERTCOLUMN, col, (LPARAM)&lvcolumnw);
return TRUE;
}
我们利用函数的形式进行插入
插入行
//空行专用
BOOL InsertRow(HWND hwnd, UINT row)
{
LVITEMW lvitmW = { LVIF_TEXT,row };
lvitmW.pszText = (LPWSTR)L"";
SendDlgItemMessageW(hwnd, IDC_LIST2, LVM_INSERTITEMW, 0, (LONG)&lvitmW);
return TRUE;
}
//行数据的插入
BOOL SetListItemText(HWND hwnd, int row, int col, LPWSTR ColumName)
{
LVITEMW lvitmW = { LVIF_TEXT,row,col};
lvitmW.pszText = ColumName;
SendDlgItemMessageW(hwnd, IDC_LIST2, LVM_SETITEMTEXT, row, (LONG)&lvitmW);
return TRUE;
}
注意,为了保持行列表的美观,我们插入了一个空行:
case WM_INITDIALOG:
{
//设置列表视图
ListView_SetExtendedListViewStyle(GetDlgItem(hwnd, IDC_LIST2), LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
//插入列
InsertColumnw(hwnd, 0, (LPWSTR)L"", 0);
InsertColumnw(hwnd, 1, (LPWSTR)L"设备", 80);
InsertColumnw(hwnd, 2, (LPWSTR)L"用户名", 100);
InsertColumnw(hwnd, 3, (LPWSTR)L"CPU", 40);
InsertColumnw(hwnd, 4, (LPWSTR)L"内存", 100);
InsertColumnw(hwnd, 5, (LPWSTR)L"显存", 160);
//插入行信息
InsertRow(hwnd, 0);
SetListItemText(hwnd, 0, 1, (LPWSTR)L"360安全卫士");
SetListItemText(hwnd, 0, 2, (LPWSTR)L"3604524554");
SetListItemText(hwnd, 0, 3, (LPWSTR)L"36024248");
SetListItemText(hwnd, 0, 4, (LPWSTR)L"360acfac");
SetListItemText(hwnd, 0, 5, (LPWSTR)L"asdawad");
break;
}
其他功能
鼠标左键,显示此块的内容,鼠标右键显示菜单:
使用WM_NOTIFY消息
case WM_NOTIFY:
{
NMHDR* pnmhdr = (NMHDR*)lParam;
//通用控件的消息捕获
//判断消息的来源
//如果消息来源是list控件,那么我们的lParam指向的是一个完整的结构体指针
NMLISTVIEW* lNmlistView = (NMLISTVIEW*)lParam;
if (wParam == IDC_LIST2 && pnmhdr->code == (UINT)NM_CLICK && lNmlistView->iItem != -1/*不能指向空行*/)
{
WCHAR Dst_wchar[100]{ 0 };
LVITEM plvitem = { 0 };
plvitem.iSubItem = lNmlistView->iSubItem;
plvitem.pszText = Dst_wchar; //接收缓冲区文本
plvitem.cchTextMax = 100; //最大接受字符数量
SendDlgItemMessageW(hwnd, wParam, LVM_GETITEMTEXT, lNmlistView->iItem, (LPARAM)&plvitem);
MessageBoxW(hwnd, plvitem.pszText, L"提示", MB_OK);
}
else if (wParam == IDC_LIST2 && pnmhdr->code == (UINT)NM_RCLICK)
{
/*
右键弹出子菜单
*/
POINT pos;
GetCursorPos(&pos);
HMENU menu1 = LoadMenuW(GetModuleHandleW(NULL), MAKEINTRESOURCE(IDR_MENU1));
HMENU SubMenu1 = GetSubMenu(menu1, 0);
TrackPopupMenu(SubMenu1, TPM_LEFTALIGN, pos.x, pos.y, NULL, hwnd, NULL);
}
break;
}
运行效果: