- 公开视频 -> 链接点击跳转公开课程
- 博客首页 -> 链接点击跳转博客主页
目录
控件基本概念
基本概念
创建控件
消息处理
样式属性
消息处理机制
消息类型
消息处理
代码示例
控件基本概念
基本概念
- 控件类型: Windows提供了多种控件,如按钮、列表框、组合框、编辑框、滚动条等。
- 控件属性: 每个控件都有一系列属性,如大小、位置、可见性、启用状态等。
- 消息传递: 控件通过消息与父窗口通信,如点击按钮会发送
WM_COMMAND
消息。
创建控件
- CreateWindow/CreateWindowEx: 用于创建控件,需要指定控件类名、标题、样式等。
- 控件ID: 每个控件通常有一个唯一的标识符(ID),用于在消息处理中识别控件。
- 控件样式: 控件样式决定了控件的外观和行为,如
WS_VISIBLE
使控件可见,WS_DISABLED
禁用控件。
消息处理
- 消息映射: 在窗口过程中处理控件消息,如
WM_COMMAND
和WM_NOTIFY
。 - 消息参数: 消息参数提供了关于事件的详细信息,如哪个控件发送了消息,以及事件的类型。
- 自定义消息处理: 可以为特定的控件事件添加自定义处理逻辑。
样式属性
- BS_PUSHBUTTON: 创建一个标准推按钮。
- BS_CHECKBOX: 创建一个复选框。
- BS_RADIOBUTTON: 创建一个单选按钮。
- BSAUTOCHECKBOX/BSAUTO3STATE: 自动处理选中状态的复选框。
- BS_GROUPBOX: 创建一个组框,用于组织其他控件。
消息处理机制
- 在Windows编程中,消息处理是应用程序与操作系统交互的核心机制。Windows操作系统通过消息传递机制来通知应用程序各种事件,如用户输入、系统状态变化等。应用程序通过窗口过程来处理这些消息。
消息类型
- WM_DESTROY: 当窗口被销毁时,系统会发送此消息。应用程序通常在此消息中执行清理操作,如终止消息循环。
- WM_CREATE: 当窗口被创建时,系统会发送此消息。应用程序可以在此消息中初始化窗口状态。
- WM_SIZE: 当窗口大小改变时,系统会发送此消息。应用程序可以响应此消息来调整窗口内容布局。
- WMMOUSEMOVE, WMLBUTTONDOWN, WM_RBUTTONDOWN 等: 这些消息与鼠标输入相关,应用程序可以响应这些消息来处理鼠标事件。
- WMKEYDOWN, WMKEYUP 等: 这些消息与键盘输入相关,应用程序可以响应这些消息来处理键盘事件。
消息处理
- 消息分发: 窗口过程应该能够根据消息类型分发消息到不同的处理逻辑。通常使用
switch
语句来实现。 - 默认消息处理: 对于不关心的消息,应该调用
DefWindowProc
函数来提供默认处理。 - 消息过滤: 有时候需要过滤某些消息,比如在消息到达窗口过程之前拦截它们。
- 消息队列: Windows维护一个消息队列,应用程序可以通过
GetMessage
或PeekMessage
函数来获取消息。 - 消息循环: 应用程序通常有一个消息循环,它不断地从消息队列中获取消息,并将它们分发到相应的窗口过程。
代码示例
// 窗口过程
LRESULT CALLBACK MainWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:
{
MoveWindow(hwnd, 0, 0, 500, 500, FALSE);
CREATESTRUCT* Cs = (CREATESTRUCT*)lParam;
break;
}
case WM_DESTROY:
{
PostQuitMessage(0);
break;
}
case WM_SIZE:
{
TCHAR szBuffer[0xFF] = { 0 };
wsprintf(szBuffer, TEXT("WM_SIZE -> %d %d\r\n"), HIWORD(lParam), LOWORD(lParam));
OutputDebugString(szBuffer);
break;
}
case WM_MOVE:
{
TCHAR szBuffer[0xFF] = { 0 };
wsprintf(szBuffer, TEXT("WM_MOVE -> %d %d\r\n"), HIWORD(lParam), LOWORD(lParam));
OutputDebugString(szBuffer);
break;
}
case WM_LBUTTONDOWN:
{
TCHAR szBuffer[0xFF] = { 0 };
wsprintf(szBuffer, TEXT("WM_LBUTTONDOWN -> %d %d\r\n"), HIWORD(lParam), LOWORD(lParam));
OutputDebugString(szBuffer);
break;
}
case WM_KEYDOWN:
{
TCHAR szBuffer[0xFF] = { 0 };
wsprintf(szBuffer, TEXT("WM_KEYDOWN -> %d\r\n"), wParam);
OutputDebugString(szBuffer);
break;
}
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
}