Day03 Window控件的使用

WINDOW控件

什么是控件?
控件是常见的窗口上的交互元素例如:一个按钮,一个复选框,一个列表框等。当控件的特定功能被触发后,会主动发送消息通知父窗口,父窗口可以通过发送消息给控件控制控件的行为。

控件的本质也是一个窗口。

Windows窗口风格
Windows窗口从其特点是主要分为两大类
1、一类是表明窗口和其他窗口关系的包括:WS_OVERLAPED,WS_POPPUP, WS_CHILD
2、一类是表明窗口自身外观特征的 WS_BORDER, WS_CAPITON等

Windows标准控件

窗口类名 控件名称
WC_BUTTON 按钮
WC_STATIC 静态文本
WC_COMBOBOX 复合框
WC_EDIT 编辑框
WC_LISTBOX 列表框
WC_SCROLLBAR 滚动条

Windows通用控件

WC_LISTVIEW 列表框控件
WC_TREEVIEW 树控件
WC_TABCONTROL Tab控件
。。。。。。。

控件的响应

子控件通知父窗口一些事件,例如子控件被点击,需要通过以下两类消息。

  • 标准控件的消息:WM_COMMAND
  • 通用控件的消息:WM_NOTIFY

标准控件

CreateWindowW函数:

HWND CreateWindowW(
  [in, optional]  lpClassName,		
  [in, optional]  lpWindowName,		
  [in]            dwStyle,
  [in]            x,
  [in]            y,
  [in]            nWidth,
  [in]            nHeight,
  [in, optional]  hWndParent,
  [in, optional]  hMenu,
  [in, optional]  hInstance,
  [in, optional]  lpParam
);

获取主窗口的实例句柄:

//获取主窗口的实例句柄
static HINSTANCE hInstance = GetModuleHandleW(NULL);

在主窗口添加控件:注意要在窗口的创建时就创建,即WM_CREATE处理此消息

case WM_CREATE:
		//添加控件
	CreateWindowW(WC_BUTTON, L"按钮1", WS_CHILD | WS_VISIBLE, 50, 50, 100, 30, hwnd, (HMENU)0x100, hInstance,0);
	CreateWindowW(WC_BUTTON, L"按钮2", WS_CHILD | WS_VISIBLE, 50, 100, 100, 30, hwnd, (HMENU)0x101, hInstance, 0);
	CreateWindowW(WC_BUTTON, L"按钮2", WS_CHILD | WS_VISIBLE,450, 100, 100, 30, hwnd, (HMENU)0x101, hInstance, 0);

	CreateWindowW(WC_EDIT, L"文本编辑框", WS_CHILD | WS_BORDER| WS_VISIBLE, 50, 200, 100, 50, hwnd, (HMENU)0x102, hInstance, 0);
	//MessageBoxW(hwnd, L"窗口创建了", L"提示", MB_OK);
	break;

按钮的点击

标准控件的消息形式处理WM_COMMAND:当用户从菜单中选择命令项、控件将通知消息发送到其父窗口或翻译快捷键击时发送。

在这里插入图片描述
我们的wParam存储窗口的控制标识符,只需要对指定的标识符的进行操作即可:
使用**LOWORD获取低位字节;HIWORD获取高位字节。**利用低位字节存储的控制标识符和对应的窗口表示比较即可。

case WM_COMMAND:
{
	WORD Controlid = LOWORD(wParam);	//WParam低两个存储按钮的标识符
	if (Controlid == 0x100)
	{
		MessageBoxW(hwnd, L"按钮1被点击了", L"提示", MB_OK);
	}
	else if (Controlid==0x101)
	{
		MessageBoxW(hwnd, L"按钮2被点击了", L"提示", MB_OK);

	}
	break;
}

完整代码

#include <Windows.h>
#include <CommCtrl.h>

LRESULT CALLBACK Wndproc(
	HWND hwnd,
	UINT uMsg,
	WPARAM wParam,
	LPARAM lParam
)
{
	//获取主窗口的实例句柄
	static HINSTANCE hInstance = GetModuleHandleW(NULL);
	switch (uMsg)
	{
	case WM_CREATE:
		//添加控件
		CreateWindowW(WC_BUTTON, L"按钮1", WS_CHILD | WS_VISIBLE, 50, 50, 100, 30, hwnd, (HMENU)0x100, hInstance,0);
		CreateWindowW(WC_BUTTON, L"按钮2", WS_CHILD | WS_VISIBLE, 50, 100, 100, 30, hwnd, (HMENU)0x101, hInstance, 0);
		CreateWindowW(WC_BUTTON, L"按钮2", WS_CHILD | WS_VISIBLE,450, 100, 100, 30, hwnd, (HMENU)0x101, hInstance, 0);

		CreateWindowW(WC_EDIT, L"文本编辑框", WS_CHILD | WS_BORDER| WS_VISIBLE, 50, 200, 100, 50, hwnd, (HMENU)0x102, hInstance, 0);
		//MessageBoxW(hwnd, L"窗口创建了", L"提示", MB_OK);
		break;
	case WM_CLOSE:
		DestroyWindow(hwnd);
		PostQuitMessage(NULL);
		break;
	case WM_COMMAND:
	{
		WORD Controlid = LOWORD(wParam);	//WParam低两个存储按钮的标识符
		if (Controlid == 0x100)
		{
			MessageBoxW(hwnd, L"按钮1被点击了", L"提示", MB_OK);
		}
		else if (Controlid==0x101)
		{
			MessageBoxW(hwnd, L"按钮2被点击了", L"提示", MB_OK);

		}
		break;
	}
	}
	return DefWindowProcW(hwnd, uMsg, wParam, lParam);
}

int WINAPI WinMain(
	HINSTANCE hinstance,
	HINSTANCE hPreinstance,
	LPSTR lpCmdline,
	int nCmdShow
)
{
	WNDCLASSW myWindow{ 0 };
	myWindow.lpszClassName = L"ylh";
	myWindow.lpfnWndProc = Wndproc;

	RegisterClass(&myWindow);

	HWND window=CreateWindowW(
		myWindow.lpszClassName,
		L"666",
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		0,
		CW_USEDEFAULT,
		0,
		NULL,
		NULL,
		hinstance,
		NULL
	);
	ShowWindow(window,SW_SHOWNORMAL);
	
	MSG msg{ 0 };
	while (GetMessageW(&msg, NULL, NULL, NULL))
	{
		TranslateMessage(&msg);
		DispatchMessageW(&msg);
	}
	return 0;
}

在这里插入图片描述

posted @ 2022-10-06 20:52  hugeYlh  阅读(17)  评论(0编辑  收藏  举报  来源