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;
}
本文来自博客园,作者:hugeYlh,转载请注明原文链接:https://www.cnblogs.com/helloylh/p/17209691.html