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

上一篇:聊天chat封装


下一篇:排序——交换排序