windows编程-窗口控件
Windows控件定义
控件是常见的窗口上的交互元素,当控件的特定功能被触发后,会主动发送消息通知父窗口,父窗口可以通过发送消息给窗口控制控件的行为。控件的本质也是一个窗口。
控件就相当于一个专门用来发送消息给窗口的窗口
Windows窗口风格
Windows窗口特点主要是分为两大类
1 表明窗口和其他窗口关系的
比如:WS_OVERLAPED WS_POPPUP WS_CHILD
2 表明窗口自身外观特征的
比如:WS_BORDER WS_CAPITON等等
Windows控件
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
控件的创建
windows的控件相当于就是windows自己写的好窗口同样需要创建窗口的流程。只是windows已经自己创建和注册好窗口类的,需要的是自己来拿用。通常是把控件拿来在自己的窗口上当做子窗口来使用。所以在创建的时候调用CreateWindow函数需要指定父窗口的值,然后再把创建的窗口风格改为子窗口WS_CHILD风格添加,再给Windows的控件添加子窗口的编号来方便调用消息处理函数来处理控件消息,这里需要修改创建窗口的hMenu的值,这个值是一个菜单的句柄,对于子窗口,hMenu指定子窗口标识符,该值是对话框控件用来通知其父项事件的整数值。应用程序确定子窗口标识符;对于具有相同父窗口的所有子窗口,它必须是唯一的。也就是说在创建windows控件的时候对于hMenu这个值是作为子窗口的唯一的标识值,而且存在wParam的低空间中可以用LOWORD(wParam)来取这个值。
//完整代码
#include<Windows.h>
#include<CommCtrl.h>
#include<iostream>
using namespace std;
LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
static HINSTANCE hInstance = GetModuleHandle(NULL);
switch (uMsg)
{
case WM_LBUTTONDOWN:
{
int xPos = LOWORD(lParam);
int yPos = HIWORD(lParam);
WCHAR buf[1024];
wsprintf(buf, TEXT("x = %d,y = %d"), xPos, yPos);
MessageBox(hwnd, buf, TEXT("鼠标左键摁下"), MB_OK);//弹出窗口
break;
}
case WM_CREATE:
// MessageBox(hwnd, L"窗口创建成功", L"创建窗口", MB_OK);
CreateWindow(WC_BUTTON, L"button1",WS_CHILD | WS_VISIBLE,50,50,100,100,hwnd,(HMENU)0x100,hInstance,NULL);
CreateWindow(WC_BUTTON, L"button2", WS_CHILD | WS_VISIBLE, 200, 200, 100, 100, hwnd, (HMENU)0x101, hInstance, NULL);
break;
case WM_CLOSE:
MessageBox(hwnd, L"窗口关闭成功", L"窗口关闭", MB_OK);
DestroyWindow(hwnd);
PostQuitMessage(0);
exit(0);
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case 0x100:
{
MessageBox(hwnd, L"控件1被点击", L"控件信息", MB_OK);
break;
}
case 0x101:
{
MessageBox(hwnd, L"控件2被点击", L"控件信息", MB_OK);
break;
}
default:
break;
}
break;
default:
break;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd
)
{
//1 创建一个窗口类
WNDCLASS myclass = { 0 };
myclass.lpszClassName = L"sm7";
myclass.lpfnWndProc = WindowProc;
//2注册窗口类
RegisterClass(&myclass);
//3创建窗口
HWND hMyWindow = CreateWindow(
myclass.lpszClassName,
L"sm7的窗口",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
hInstance,
NULL
);
//4显示窗口
ShowWindow(hMyWindow, SW_SHOW);
//5获取消息
MSG message;
LPMSG MESSAGE = &message;
while (1)
{
GetMessage(MESSAGE,hMyWindow,0,0);
DispatchMessage(MESSAGE);
}
return 0;
}