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;
}

运行效果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yuleo_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值