【问题标题】:Win32 API C++ Menu barWin32 API C++ 菜单栏
【发布时间】:2015-05-09 03:04:42
【问题描述】:

我正在尝试学习一些基本的 win32 api。我看到添加项目到菜单栏教程已经提到使用类似的东西:

hMenubar = CreateMenu();
hMenu = CreateMenu();

AppendMenuW(hMenu, MF_STRING, IDM_FILE_NEW, L"&New");
AppendMenuW(hMenu, MF_STRING, IDM_FILE_OPEN, L"&Open");
AppendMenuW(hMenu, MF_SEPARATOR, 0, NULL);
AppendMenuW(hMenu, MF_STRING, IDM_FILE_QUIT, L"&Quit");
AppendMenuW(hMenubar, MF_POPUP, (UINT_PTR)hMenu, L"&File");

但是在 VS2013 的 C++ 桌面的默认项目中,有一个文件和帮助菜单栏,里面有退出和关于。但他们所做的只是在 WndProc 中有一个这样的开关:

switch (message)
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Parse the menu selections:
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;

我有几个问题。他们如何在不使用 createmenu() 等的情况下添加文件和帮助菜单栏,以及菜单栏中的 about 和 exit 项? IDM_ABOUT 和 IDM_EXIT 是什么意思?它们在菜单中有这些,但只是将它们放在 switch 语句中会将它们添加到菜单栏吗?什么是 wmId 和 wmEvent,为什么要打开 wmId?究竟是什么将这些项目添加到菜单栏?

如果您需要查看我的程序的更多代码,它只是 VS2013 中的非空白 C++ Win32 项目

感谢您提供的任何答案,如果有人能指出我当前尽可能好的 win32 api C++ 教程的方向,我们将不胜感激。

【问题讨论】:

  • and it would be appreicated if someone could point me in the direction of a good current as possible win32 api C++ tutorial Charles Petzold 的任何书。
  • 非常感谢,我会检查一下

标签: c++ winapi


【解决方案1】:

有两种制作菜单的方法。可以如您所示以编程方式完成,也可以使用资源编辑器完成。在解决方案资源管理器中,双击扩展名为 *.rc 的文件。您应该会看到一个名为“资源视图”的窗口。打开资源节点,直到看到“菜单”。您可以添加/修改/删除菜单项。也可以制作对话框。

每个菜单项或对话框按钮都有一个标识号,该编号通过WPARAM wParam 传递。在上面的例子中wmEvent没有被使用,暂时不用担心。

IDM_ABOUT 是资源文件#define IDM_ABOUT 101 中定义的数字(或者它可能是不同的数字)。单击菜单项时,将发送带有该编号的消息。你可以捕捉到消息并回复它。

这是基本的 WinApi,在过去 10 或 20 年中没有太大变化,您在 Google 上找到的任何教程都是最新的。

此外,当您使用资源编辑器创建新菜单项时,Visual Studio 会自动创建一个 ID 并将其分配给该菜单项。您需要知道这些 ID 是什么。您可以按 F4 键找到“属性窗口”。

例如,如果您键入一个新菜单项“&File New”,则该菜单的 ID 将类似于 ID_FILE_NEWFILE,它应该在“属性窗口”中可见。

这个菜单项就像IDM_ABOUT。它被发送到与该窗口关联的 Windows 过程函数。

对于菜单项消息:

  • message 始终设置为 WM_COMMAND
  • wParam 是菜单 ID
  • lParam 未使用

【讨论】:

  • 对于菜单,它并不重要,因为 HIWORD(wParam) 设置为 0,但值得记住的是,控件/菜单 id 是在 LOWORD(wParam) 中编码的。
猜你喜欢
  • 2018-12-17
  • 2021-11-24
  • 2011-11-23
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多