windows 对话框创建及其标准控件的使用

windows 对话框创建及其标准控件的使用

文章目录

非模态对话框模态对话框非模态对话框里控件的使用按钮复选框滑块与进度条列表框插入列插入行其他功能

非模态对话框

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;

}

运行效果:

相关推荐