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