### Windows多窗体演示实例详解 #### 概述 在Windows编程中,多窗体设计是一种常见的技术,它允许开发者创建多个窗口,并在这些窗口之间进行消息传递与交互。本篇将详细介绍一个基于Windows的多窗体设计示例,重点在于如何处理多个消息循环以及如何在不同的窗体之间发送消息。此示例是使用C语言编写的。 #### 窗口类初始化 我们需要定义窗口类。这里有两个窗口类:`myclass` 和 `myclass1`。窗口类通过 `WNDCLASS` 结构体来定义,并通过 `RegisterClass` 函数注册到系统中。 ```c WNDCLASS dt = {0}; dt.lpfnWndProc = MessageDeal; // 消息处理函数 dt.style = CS_DBLCLKS; // 允许双击 dt.cbClsExtra = 0; // 额外类内存大小 dt.cbWndExtra = 0; // 额窗外存大小 dt.hInstance = hInstance; // 实例句柄 dt.lpszMenuName = NULL; // 菜单名称 dt.lpszClassName = ClassName; // 类名 dt.hIcon = LoadIcon(hInstance, IDI_APPLICATION); // 图标 dt.hCursor = LoadCursor(NULL, IDC_ARROW); // 光标 dt.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); // 背景色 ATOM atom = RegisterClass(&dt); ``` 同样的过程也适用于第二个窗口类 `myclass1` 的定义和注册。 #### 消息处理函数 对于每个窗口类,都需要实现一个消息处理函数。在这个示例中,`MessageDeal` 和 `MessageDeal1` 是两个消息处理函数,它们分别负责处理 `myclass` 和 `myclass1` 窗口的消息。 - `MessageDeal` 处理以下消息: - `WM_KEYDOWN`:按下任意键时显示消息框。 - `WM_LBUTTONDBLCLK`:鼠标左键双击时显示消息框。 - `WM_LBUTTONDOWN`:鼠标左键按下时显示消息框。 - `WM_RBUTTONDOWN`:鼠标右键按下时显示消息框。 - `WM_RBUTTONDBLCLK`:鼠标右键双击时显示消息框。 - `WM_DESTROY`:窗口关闭时退出程序。 - `MessageDeal1` 处理以下消息: - `WM_KEYDOWN`:按下任意键时显示消息框。 - `WM_LBUTTONDBLCLK`:向 `wnd` 发送 `WM_LBUTTONDBLCLK` 消息。 - `WM_LBUTTONDOWN`:向 `wnd` 发送 `WM_LBUTTONDOWN` 消息。 - `WM_RBUTTONDOWN`:向 `wnd` 发送 `WM_RBUTTONDOWN` 消息。 - `WM_RBUTTONDBLCLK`:向 `wnd` 发送 `WM_RBUTTONDBLCLK` 消息。 - `WM_DESTROY`:窗口关闭时结束线程。 #### 创建窗口 创建窗口时,使用 `CreateWindow` 函数指定窗口类名、窗口标题、样式等参数。例如: ```c hwnd = CreateWindow(ClassName, "Window Title", WS_OVERLAPPEDWINDOW, 100, 100, 300, 200, NULL, NULL, hInstance, NULL); ``` 这里创建了一个名为 `myclass` 的窗口,标题为 `"Window Title"`,位置为屏幕上的 `(100, 100)`,尺寸为 `(300, 200)`。 #### 窗口消息循环 每个窗口都有自己的消息循环。在本例中,我们通过 `GetMessage`, `TranslateMessage` 和 `DispatchMessage` 来处理消息。 ```c MSG uMsg; while (GetMessage(&uMsg, hwnd, 0, 0)) { TranslateMessage(&uMsg); DispatchMessage(&uMsg); } ``` #### 线程创建 此外,还创建了两个线程:`ThreadCreateWnd` 和 `ThreadCreateWnd2`。 - `ThreadCreateWnd` 负责创建第二个窗口 `wnd1` 并进入消息循环。 - `ThreadCreateWnd2` 用于始终将 `wnd` 窗口置于最顶层,并调整其位置和大小。 ### 总结 本示例展示了在Windows编程中如何实现多窗体设计,包括窗口类的定义、消息处理函数的设计、窗口的创建与消息循环的管理等关键步骤。通过这种方式,可以实现在不同窗口之间的消息传递与交互,这对于开发复杂的用户界面非常有用。希望这个示例能帮助你更好地理解Windows多窗体设计的核心概念和技术细节。
#include<stdlib.h>
HWND wnd,wnd1;LPCSTR ClassName="myclass", ClassName1="myclass1";
LRESULT CALLBACK MessageDeal(HWND dt,UINT uMsg,WPARAM wM,LPARAM lP){
switch(uMsg)
{
case WM_KEYDOWN:MessageBox(NULL,"您按了键盘","消息",MB_OK);break;
case WM_LBUTTONDBLCLK:MessageBox(NULL,"左键双击","消息",MB_OK);break;
case WM_LBUTTONDOWN:MessageBox(NULL,"左键单击","消息",MB_OK);break;
case WM_RBUTTONDOWN:MessageBox(NULL,"右键单击","消息",MB_OK);break;
case WM_RBUTTONDBLCLK:MessageBox(NULL,"右键双击","消息",MB_OK);break;
case WM_DESTROY:exit(0) ;break;
//按下叉叉键产生该消息的同时会销毁窗口
default: return DefWindowProc(dt,uMsg,wM,lP);
}
return 0;
}
//子窗口消息循环
LRESULT CALLBACK MessageDeal1(HWND dt,UINT uMsg,WPARAM wM,LPARAM lP){
switch(uMsg)
{
case WM_KEYDOWN:MessageBox(NULL,"您按了键盘1","消息",MB_OK);break;
case WM_LBUTTONDBLCLK:PostMessage(wnd,WM_LBUTTONDBLCLK,0,0);break;//不用sendmessage
case WM_LBUTTONDOWN:PostMessage(wnd,WM_LBUTTONDOWN,0,0);break;
case WM_RBUTTONDOWN:PostMessage(wnd, WM_RBUTTONDOWN,0,0);break;
case WM_RBUTTONDBLCLK:PostMessage(wnd, WM_RBUTTONDBLCLK,0,0);break;
case WM_DESTROY:PostQuitMessage (0) ;break;
//按下叉叉键产生该消息的同时会销毁窗口
default: return DefWindowProc(dt,uMsg,wM,lP);
- 粉丝: 1
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助