Windows图形界面(GUI)-SDK-C/C++ - 控件基本概念 - 消息处理机制

目录

控件基本概念

基本概念

创建控件

消息处理

样式属性

消息处理机制

消息类型

消息处理

代码示例


控件基本概念

基本概念

  • 控件类型: Windows提供了多种控件,如按钮、列表框、组合框、编辑框、滚动条等。
  • 控件属性: 每个控件都有一系列属性,如大小、位置、可见性、启用状态等。
  • 消息传递: 控件通过消息与父窗口通信,如点击按钮会发送WM_COMMAND消息。
创建控件
  • CreateWindow/CreateWindowEx: 用于创建控件,需要指定控件类名、标题、样式等。
  • 控件ID: 每个控件通常有一个唯一的标识符(ID),用于在消息处理中识别控件。
  • 控件样式: 控件样式决定了控件的外观和行为,如WS_VISIBLE使控件可见,WS_DISABLED禁用控件。
消息处理

  • 消息映射: 在窗口过程中处理控件消息,如WM_COMMANDWM_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维护一个消息队列,应用程序可以通过GetMessagePeekMessage函数来获取消息。
  • 消息循环: 应用程序通常有一个消息循环,它不断地从消息队列中获取消息,并将它们分发到相应的窗口过程。
代码示例
// 窗口过程
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);
	}
	
}

相关推荐

  1. Windows图形界面(GUI)-DLG-C/C++ - 静态(Static)

    2024-07-14 16:44:02       21 阅读
  2. Windows图形界面(GUI)-DLG-C/C++ - 月历(MonthCalendar)

    2024-07-14 16:44:02       17 阅读
  3. Windows图形界面(GUI)-SDK-C/C++ - 应用程序结构

    2024-07-14 16:44:02       29 阅读
  4. Windows图形界面(GUI)-SDK-C/C++ - 按钮(button)

    2024-07-14 16:44:02       22 阅读
  5. Windows图形界面(GUI)-SDK-C/C++ - 编辑框(edit)

    2024-07-14 16:44:02       21 阅读
  6. Windows图形界面(GUI)-SDK-C/C++ - 列表框(List)

    2024-07-14 16:44:02       25 阅读
  7. Windows图形界面(GUI)-SDK-C/C++ - 组合框(ComboBox)

    2024-07-14 16:44:02       21 阅读
  8. Windows图形界面(GUI)-SDK-C/C++ - 窗口类注册和管理

    2024-07-14 16:44:02       19 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-14 16:44:02       51 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-14 16:44:02       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-14 16:44:02       44 阅读
  4. Python语言-面向对象

    2024-07-14 16:44:02       55 阅读

热门阅读

  1. Python 面试热门问题五

    2024-07-14 16:44:02       19 阅读
  2. TCP流量控制是怎么实现的?

    2024-07-14 16:44:02       20 阅读
  3. C#开发翻译较好的API

    2024-07-14 16:44:02       16 阅读
  4. C语言西蒙说游戏

    2024-07-14 16:44:02       21 阅读
  5. 大厂急招C++,有一个HC

    2024-07-14 16:44:02       14 阅读
  6. Docker:容器内服务访问宿主机中的MySql服务

    2024-07-14 16:44:02       17 阅读
  7. VsCode 使用 Tips

    2024-07-14 16:44:02       14 阅读
  8. 如何安装aab文件

    2024-07-14 16:44:02       14 阅读
  9. wordpress制作主题步骤

    2024-07-14 16:44:02       15 阅读