• windowsAPI程序设计菜单栏设计BUG


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 婆娑梵净山 2024-05-27 14:26 采纳率: 93% 浏览 6 首页/ 编程语言 / 已结题 windowsAPI程序设计菜单栏设计BUG c++开发语言windows 这是主程序 #include #include #include #include "resource.h" HINSTANCE hinst; int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int); LRESULT CALLBACK MainWinProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK MainWinPrc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wcex; HWND hwnd; MSG msg; BOOL fGotMessage; hinst = hInstance; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = MainWinProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION); wcex.hCursor = LoadCursor(NULL, IDC_CROSS); wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wcex.lpszMenuName = (CHAR*)IDR_MENU1; wcex.lpszClassName = "MainWClass"; wcex.hIconSm = (HICON)LoadImage(hInstance, MAKEINTRESOURCE(5), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CXSMICON), LR_DEFAULTCOLOR); WNDCLASSEX wce; wce.cbSize = sizeof(WNDCLASSEX); wce.style = CS_HREDRAW | CS_VREDRAW; wce.lpfnWndProc = DefWindowProc; wce.cbClsExtra = 0; wce.cbWndExtra = 0; wce.hInstance = hInstance; wce.hIcon = LoadIcon(NULL, IDI_APPLICATION); wce.hCursor = LoadCursor(NULL, IDC_CROSS); wce.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wce.lpszMenuName = NULL; wce.lpszClassName = "Child"; wce.hIconSm = (HICON)LoadImage(hInstance, MAKEINTRESOURCE(5), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CXSMICON), LR_DEFAULTCOLOR); if (!RegisterClassEx(&wcex)) { return 1; } if (!RegisterClassEx(&wce)) { return 1; } hwnd = CreateWindowEx( 0, "MainWClass", "window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 544, 375, HWND_DESKTOP, LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU1)), // MENU hInstance, /* Program Instance handler */ NULL ); HWND C1 = CreateWindow("Child", "c1", WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW, 100, 20, 30, 70, hwnd, NULL, hInstance, NULL); HWND C2 = CreateWindow("Child", "c1", WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW, 400, 20, 30, 70, hwnd, NULL, hInstance, NULL); HWND C13 = CreateWindow("Child", "c1", WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW, 600, 20, 30, 70, hwnd, NULL, hInstance, NULL); if (!hwnd) { return 1; } ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); while ((fGotMessage = GetMessage(&msg, NULL, 0, 0)) != 0 && fGotMessage != -1) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } MSG unse; LRESULT CALLBACK MainWinProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_DESTROY: PostQuitMessage(0); return 0; case WM_SYSCOMMAND: if (wParam == SC_CLOSE) { int nRet = MessageBox(hwnd, "是否关闭", "infe", MB_YESNO); if (nRet == IDYES) { DestroyWindow(hwnd); } else { return 0; } } break; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } return 0; } 这是菜单选项里的.rc文件,可是为什么我在生成窗口后点击菜单栏选项卡中的文件时没有任何反应。无法弹出菜单框 // Microsoft Visual C++ generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #ifndef APSTUDIO_INVOKED #include "targetver.h" #endif #define APSTUDIO_HIDDEN_SYMBOLS #include "windows.h" #undef APSTUDIO_HIDDEN_SYMBOLS ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // 中文(简体,中国) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED ///////////////////////////////////////////////////////////////////////////// // // Icon // // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. IDI_HMUINE ICON "hmuine.ico" IDI_SMALL ICON "small.ico" ///////////////////////////////////////////////////////////////////////////// // // Accelerator // IDC_HMUINE ACCELERATORS BEGIN "?", IDM_ABOUT, ASCII, ALT "/", IDM_ABOUT, ASCII, ALT END ///////////////////////////////////////////////////////////////////////////// // // Dialog // IDD_ABOUTBOX DIALOGEX 0, 0, 170, 62 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "关于 hmuine" FONT 9, "MS Shell Dlg", 0, 0, 0x1 BEGIN ICON IDI_HMUINE,IDC_STATIC,14,14,21,20 LTEXT "hmuine, 版本 1.0",IDC_STATIC,42,14,114,8,SS_NOPREFIX LTEXT "版权所有(c) 2024",IDC_STATIC,42,26,114,8 DEFPUSHBUTTON "确定",IDOK,113,41,50,14,WS_GROUP END ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO // #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO BEGIN IDD_ABOUTBOX, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 163 TOPMARGIN, 7 BOTTOMMARGIN, 55 END END #endif // APSTUDIO_INVOKED #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE BEGIN "resource.h\0" END 2 TEXTINCLUDE BEGIN "#ifndef APSTUDIO_INVOKED\r\n" "#include ""targetver.h""\r\n" "#endif\r\n" "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" "#include ""windows.h""\r\n" "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" "\0" END 3 TEXTINCLUDE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Menu // IDR_MENU1 MENU BEGIN POPUP "文件" BEGIN MENUITEM "类型", ID_32771 MENUITEM "开始", ID_32772 END END ///////////////////////////////////////////////////////////////////////////// // // String Table // STRINGTABLE BEGIN IDS_APP_TITLE "hmuine" IDC_HMUINE "HMUINE" END #endif // 中文(简体,中国) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED 展开全部 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    1条回答 默认 最新

    • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-27 14:29
      关注

      引自免费微信小程序:皆我百晓生

      在您的代码中,您已经定义了一个菜单资源(IDR_MENU1)并在主窗口类("MainWClass")中设置了窗口过程(MainWinProc)。但是,在这个窗口过程中,并没有处理菜单消息,因此当用户点击菜单项时不会有任何反应。

      为了解决这个问题,您需要在MainWinProc中添加对WM_COMMAND消息的处理。当用户选择菜单项时,系统会发送一个WM_COMMAND消息到窗口过程。下面是如何修改MainWinProc来处理菜单命令:

      首先,更新MainWinProc函数,加入对WM_COMMAND消息的处理:

      LRESULT CALLBACK MainWinProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
      {
          switch (uMsg)
          {
          case WM_CREATE:
              // 在这里创建子窗口
              break;
              
          case WM_COMMAND:
              {
                  int idCtrl = LOWORD(wParam); // 控件ID
                  int notificationCode = HIWORD(wParam); // 消息代码
                  HWND hWndCtrl = reinterpret_cast(lParam); // 控件句柄
                  
                  switch (idCtrl)
                  {
                  case IDM_TYPE: // 文件->类型
                      // 处理"类型"菜单项
                      break;
                      
                  case IDM_START: // 文件->开始
                      // 处理"开始"菜单项
                      break;
                      
                  default:
                      return DefWindowProc(hwnd, uMsg, wParam, lParam);
                  }
              }
              break;
      
          case WM_DESTROY:
              PostQuitMessage(0);
              return 0;
              
          case WM_SYSCOMMAND:
              if (wParam == SC_CLOSE)
              {
                  int nRet = MessageBox(hwnd, "是否关闭", "infe", MB_YESNO);
                  if (nRet == IDYES)
                  {
                      DestroyWindow(hwnd);
                  }
                  else
                  {
                      return 0;
                  }
              }
              break;
      
          default:
              return DefWindowProc(hwnd, uMsg, wParam, lParam);
          }
          return 0;
      }
      

      接下来,为了实现具体的菜单功能,你需要在相应的case分支中编写代码。例如,如果你想要在点击“类型”菜单项时显示一条消息框,可以这样写:

      case IDM_TYPE:
          MessageBox(hwnd, "选择了类型菜单项", "提示", MB_OK);
          break;
      

      对于“开始”菜单项,你可以根据实际需求进行类似的操作。

      注意:在这个例子中,我假设你已经在WinMain函数中正确地加载了菜单资源。确保你在创建主窗口时将菜单句柄传递给CreateWindowEx函数,就像这样:

      hwnd = CreateWindowEx(
          0,
          "MainWClass", "window",
          WS_OVERLAPPEDWINDOW,
          CW_USEDEFAULT,
          CW_USEDEFAULT,
          544,
          375,
          HWND_DESKTOP,
          LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU1)), // 菜单句柄
          hInstance,       /* Program Instance handler */
          NULL
      );
      

      经过这些修改,你应该能在点击菜单项时看到预期的行为。记得重新编译并运行你的程序。

      展开全部

      本回答被题主选为最佳回答 , 对您是否有帮助呢?
      评论 编辑记录
      婆娑梵净山 2024-05-27 14:34

      还是不行

      回复
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    流程记录:
    处理机调度与死锁
    Redis 集群搭建教程
    射频与微波综合测试仪-4958手持式微波综合测试仪
    数据库迁移之liquibase-CLI
    大厂SQL题5-同时在线人数、不同类别的第一
    Java编程技巧:swagger2、knif4j集成SpringBoot或者SpringCloud项目
    spring cloud 入门
    ubuntu安装samba文件共享
    单例模式的双重检查锁定是什么
  • 原文地址:https://ask.csdn.net/questions/8109945