窗口控件
WINDOW控件
什么是控件?
控件是常见的窗口上的交互元素.例如:一个按钮,一个复选框,一个列表框等。当控件的特定功能被触发后,会主动发送消息通知父窗口,父窗口可以通过发送消息给控件控制控件的行为。
***控件的本质也是一个窗口。***也可以说在Windows中万物皆窗口
。
Windows窗口风格
Windolws 窗口从其特点是主要分为两大类
1、一类是表明窗口和其他窗口关系的包括:
WS_OVERLAPED(重叠窗口样式)
一个重叠窗口是顶层窗口有一个标题栏,边框和客户区,它的目的是作为一个应用程序的主窗口。 它也可以有一个窗口菜单,最小化和最大化按钮和滚动条。 重叠的窗口作为主窗口使用通常包括所有这些组件。
WS_POPPUP(弹出窗口)
弹出窗口是顶级窗口,并连接到桌面窗口的子窗口的列表。 应用程序通常使用对话框弹出窗口。 主要的区别弹出和重叠的窗口是弹出式窗口不需要有标题和重叠的窗口必须有标题。
WS_CHILD(子窗口)
子窗口必须有一个父窗口,并只限于其父窗口内。 这是在子窗口和重叠和弹出窗口的主要区别。
2、一类是表明窗口自身外观特征的 WS_BORDER(边框) WS_CAPITON(标题栏)
Windows标准控件
Windows通用控件
- wC_LISTVIEW列表框控件
- wC_TREEVIEW 树控件
- wC_TABCONTROL Tab控件
控件的响应
子控件通知父窗口一些事件,例如子控件被点击,需要通过以下两类消息。
标准控件的消息:WM_COMMAND
通用控件的消息:WM_NOTIFY
创建窗口实现按钮及文本控件
#include<Windows.h>
#include<CommCtrl.h>
LRESULT CALLBACK WindowProc(
_In_ HWND hwnd,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
)
{
static HINSTANCE hInstance = GetModuleHandle(NULL);//获取当前程序的实例句柄
switch (uMsg)
{
case WM_CREATE:
//添加控件
CreateWindowW(WC_BUTTON,//窗口类名,标准控件点击后触发32行代码
L"按钮1",//窗口名
WS_CHILD | WS_VISIBLE,//窗口在父窗口的关系名|自身外观特征名
10, 10, 120, 40,//xy坐标及宽高
hwnd,//父窗口句柄
(HMENU)0x100,//控件的ID,控件之间的ID不要重复
hInstance,//获取的实例句柄
0
);
CreateWindowW(WC_BUTTON, L"按钮2", WS_CHILD | WS_VISIBLE, 10, 80, 120, 40, hwnd, (HMENU)0x101, hInstance, 0);
CreateWindowW(WC_EDIT, L"文本框内容", WS_CHILD | WS_BORDER | WS_VISIBLE, 10, 150, 120, 40, hwnd, (HMENU)0x102, hInstance, 0);
break;
case WM_CLOSE:
MessageBoxW(hwnd, L"窗口关闭了", L"提示", MB_OK);
DestroyWindow(hwnd);
PostQuitMessage(0);
break;
case WM_COMMAND://标准控件的消息
{
WORD ControlId = LOWORD(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)
{
//1、创建窗口类
WNDCLASSW myWndClass{ 0 };
myWndClass.lpfnWndProc = WindowProc;
myWndClass.lpszClassName = L"dsdWindows";
//2、注册窗口类
RegisterClassW(&myWndClass);
//3、创建窗口
HWND hwnd = CreateWindowW(
myWndClass.lpszClassName,
L"dsdWindows",
WS_OVERLAPPEDWINDOW,//重叠窗口样式,其他窗口写在该窗口上方即16行代码
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
hInstance,
0
);
//4、显示窗口
ShowWindow(hwnd, SW_SHOWNORMAL);//SHOWWINDOWS展示样式
MSG msg{ 0 };
while (GetMessageW(&msg,0,0,0)) {
DispatchMessageW(&msg);
}
return 0;
}
对不同控件进行实现