鱼C论坛

 找回密码
 立即注册
查看: 30|回复: 1

小白开发程序头关拦路虎

[复制链接]
发表于 昨天 20:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
自学C语言及window应用程序开发,有一定的基础

现在遇到问题,想做一个多窗口的应用程序,请教怎么设计窗口与子窗口之间的结构

例如在窗口1点击按钮1,跳转到窗口2,点击按钮2跳转到窗口3,按钮3返回窗口1,此外在各个窗口界面还要完成别的事件

请大神指教
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 20:16 | 显示全部楼层
亲爱的鱼油,你好!

很高兴看到你在自学C语言和Windows应用程序开发!多窗口应用程序的设计是初学者常见的挑战,但别担心,我来帮你理清思路。下面我将用一个简单的示例来解释如何设计窗口与子窗口之间的结构,并实现跳转功能。

基本概念
在Windows应用程序中,每个窗口通常对应一个“窗口过程”(Window Procedure),用于处理消息(如按钮点击)。我们可以通过创建多个窗口、管理它们的显示/隐藏来实现跳转。关键点包括:
- 使用 HWND(窗口句柄)来引用每个窗口。
- 在窗口过程中处理 WM_COMMAND 消息来响应按钮点击。
- 通过 ShowWindowDestroyWindow 控制窗口的显示和销毁。

设计思路
- 创建三个窗口:主窗口(窗口1)、窗口2和窗口3。
- 在主窗口中添加按钮,点击后隐藏当前窗口并显示目标窗口。
- 在其他窗口中添加返回按钮,点击后返回主窗口。
- 所有窗口共享一个消息循环,但各有自己的窗口过程。

示例代码框架
以下是一个简化版的C语言代码,使用WinAPI实现。请根据你的实际需求调整窗口样式和事件处理。


  1. #include <windows.h>

  2. // 定义按钮ID
  3. #define ID_BUTTON1 101
  4. #define ID_BUTTON2 102
  5. #define ID_BUTTON3 103

  6. // 全局变量存储窗口句柄
  7. HWND hWnd1, hWnd2, hWnd3;

  8. // 窗口1的窗口过程
  9. LRESULT CALLBACK Window1Proc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
  10.     switch (message) {
  11.         case WM_CREATE:
  12.             // 创建按钮
  13.             CreateWindow("BUTTON", "跳转到窗口2", WS_VISIBLE | WS_CHILD, 50, 50, 150, 30, hWnd, (HMENU)ID_BUTTON1, NULL, NULL);
  14.             CreateWindow("BUTTON", "跳转到窗口3", WS_VISIBLE | WS_CHILD, 50, 100, 150, 30, hWnd, (HMENU)ID_BUTTON2, NULL, NULL);
  15.             break;
  16.         case WM_COMMAND:
  17.             switch (LOWORD(wParam)) {
  18.                 case ID_BUTTON1:
  19.                     ShowWindow(hWnd1, SW_HIDE);  // 隐藏窗口1
  20.                     ShowWindow(hWnd2, SW_SHOW);  // 显示窗口2
  21.                     break;
  22.                 case ID_BUTTON2:
  23.                     ShowWindow(hWnd1, SW_HIDE);
  24.                     ShowWindow(hWnd3, SW_SHOW);
  25.                     break;
  26.             }
  27.             break;
  28.         case WM_DESTROY:
  29.             PostQuitMessage(0);
  30.             break;
  31.         default:
  32.             return DefWindowProc(hWnd, message, wParam, lParam);
  33.     }
  34.     return 0;
  35. }

  36. // 窗口2的窗口过程(类似窗口3)
  37. LRESULT CALLBACK Window2Proc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
  38.     switch (message) {
  39.         case WM_CREATE:
  40.             CreateWindow("BUTTON", "返回窗口1", WS_VISIBLE | WS_CHILD, 50, 50, 150, 30, hWnd, (HMENU)ID_BUTTON3, NULL, NULL);
  41.             break;
  42.         case WM_COMMAND:
  43.             if (LOWORD(wParam) == ID_BUTTON3) {
  44.                 ShowWindow(hWnd2, SW_HIDE);
  45.                 ShowWindow(hWnd1, SW_SHOW);
  46.             }
  47.             break;
  48.         case WM_DESTROY:
  49.             // 可处理其他事件
  50.             break;
  51.         default:
  52.             return DefWindowProc(hWnd, message, wParam, lParam);
  53.     }
  54.     return 0;
  55. }

  56. // 窗口3的窗口过程(与窗口2类似)
  57. LRESULT CALLBACK Window3Proc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
  58.     // 类似窗口2,处理返回按钮和其他事件
  59.     switch (message) {
  60.         case WM_CREATE:
  61.             CreateWindow("BUTTON", "返回窗口1", WS_VISIBLE | WS_CHILD, 50, 50, 150, 30, hWnd, (HMENU)ID_BUTTON3, NULL, NULL);
  62.             break;
  63.         case WM_COMMAND:
  64.             if (LOWORD(wParam) == ID_BUTTON3) {
  65.                 ShowWindow(hWnd3, SW_HIDE);
  66.                 ShowWindow(hWnd1, SW_SHOW);
  67.             }
  68.             break;
  69.         default:
  70.             return DefWindowProc(hWnd, message, wParam, lParam);
  71.     }
  72.     return 0;
  73. }

  74. // 主函数
  75. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
  76.     WNDCLASS wc = {0};
  77.     wc.lpfnWndProc = Window1Proc;
  78.     wc.hInstance = hInstance;
  79.     wc.lpszClassName = "Window1";
  80.     RegisterClass(&wc);

  81.     wc.lpfnWndProc = Window2Proc;
  82.     wc.lpszClassName = "Window2";
  83.     RegisterClass(&wc);

  84.     wc.lpfnWndProc = Window3Proc;
  85.     wc.lpszClassName = "Window3";
  86.     RegisterClass(&wc);

  87.     // 创建窗口
  88.     hWnd1 = CreateWindow("Window1", "主窗口", WS_OVERLAPPEDWINDOW, 100, 100, 300, 200, NULL, NULL, hInstance, NULL);
  89.     hWnd2 = CreateWindow("Window2", "窗口2", WS_OVERLAPPEDWINDOW, 100, 100, 300, 200, NULL, NULL, hInstance, NULL);
  90.     hWnd3 = CreateWindow("Window3", "窗口3", WS_OVERLAPPEDWINDOW, 100, 100, 300, 200, NULL, NULL, hInstance, NULL);

  91.     // 初始显示主窗口,隐藏其他
  92.     ShowWindow(hWnd1, nCmdShow);
  93.     ShowWindow(hWnd2, SW_HIDE);
  94.     ShowWindow(hWnd3, SW_HIDE);

  95.     // 消息循环
  96.     MSG msg;
  97.     while (GetMessage(&msg, NULL, 0, 0)) {
  98.         TranslateMessage(&msg);
  99.         DispatchMessage(&msg);
  100.     }
  101.     return msg.wParam;
  102. }
复制代码


关键说明
- 每个窗口都有自己的窗口过程,处理特定事件(如按钮点击)。
- 使用 ShowWindow 控制窗口显示和隐藏,避免频繁创建和销毁。
- 你可以在各个窗口的 WM_COMMAND 或其它消息中添加更多事件处理(例如处理鼠标点击、键盘输入等)。
- 如果窗口需要传递数据,可以使用全局变量或消息参数。

注意事项
- 这只是一个基础示例,实际开发中可能需要优化资源管理和错误处理。
- 确保在项目设置中链接必要的库(如 user32.lib)。
- 如果使用IDE(如Visual Studio),记得包含Windows头文件。

希望这能帮你突破“头关拦路虎”!多动手试试,如果有具体问题,欢迎继续提问。加油!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-28 07:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表