Win32 API C ++菜单栏

时间:2015-05-09 03:04:43

标签: c++ winapi

我试图学习一些基本的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 ++ Desktop的默认项目中有一个File和Help菜单栏,里面有Exit和About。但他们所做的只是在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 ++教程,那将会很有用。

1 个答案:

答案 0 :(得分:4)

制作菜单有两种方法。它可以按照您所示的方式以编程方式完成,也可以使用资源编辑器完成。在解决方案资源管理器中,双击带有* .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 Procedure功能。

对于菜单项消息:

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