婆娑梵净山 2024-05-29 13:08 采纳率: 89.5%
浏览 7
已结题

为什么我给子窗口添加菜单时无法在子菜单中显示菜单栏

为什么我给子窗口添加菜单时无法在子菜单中显示菜单栏


#include<windows.h>
#include <tchar.h>
#include<stdio.h>
#include "resource.h"
#include <math.h>
HINSTANCE hinst;

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
LRESULT CALLBACK MainWinProc(HWND, UINT, WPARAM, LPARAM);
void GETSUBMENUS(HWND, 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(hInstance, (char*)IDI_ICON1);
    wcex.hCursor = LoadCursor(hInstance,(char*)IDC_CURSOR1);
    wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wcex.lpszMenuName = (char*) IDR_MENU1;//菜单初始化定义//使用(char*)目的是
    //将菜单句柄ID号由数字转成字符形式
    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(hInstance, (char*)IDI_ICON1);
    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;
    }
    char windowsname[256] = { 0 };
    LoadString(hInstance,IDS_ONE,windowsname,sizeof(windowsname));
    hwnd = CreateWindow("MainWClass", windowsname, WS_OVERLAPPEDWINDOW, 0, 0, 1000, 1000, NULL, NULL, hInstance, NULL);
    HMENU  hmenu = LoadMenu(hInstance, (char*)IDR_MENU1);
    SetMenu(hwnd, hmenu);
    HWND C1 = CreateWindow("Child", "c1", WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW, 100, 20, 30, 70,hwnd, hmenu,hInstance, NULL);
    //凡是C开头的都是子窗口创建
    HWND C2 = CreateWindow("Child", "c1", WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW, 0,0, 100, 100, C1, 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_COMMAND://菜单信息处理函数,定义点击目的
    {
       
        switch (LOWORD(wParam))
        {
        case ID_40001:
            MessageBox(hwnd, "信息", "我被点击了", MB_OK);
            break;
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);

        }
        break;
        return 0;
    }

    case WM_CONTEXTMENU:
         GETSUBMENUS(hwnd,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;
    }

}
void GETSUBMENUS(HWND  hwnd, LPARAM lParam)
{
    HMENU hmenue = LoadMenu(hinst, (char*)IDR_MENU1);
   HMENU hmenuone= GetSubMenu(hmenue,0);
   TrackPopupMenu(hmenuone,TPM_CENTERALIGN|TPM_VCENTERALIGN, LOWORD(lParam),HIWORD(lParam),0,hwnd,NULL);
}

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-05-29 13:08
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    在Windows编程中,子窗口(子窗口)通常不包含自己的菜单栏。这是因为菜单栏通常与窗口的类(类)关联,而不是与单个窗口实例关联。在您的代码中,您已经为父窗口类注册了一个菜单,但是当您尝试为子窗口创建菜单时,遇到了问题。

    问题可能出在以下几个方面:

    1. 子窗口不应该有菜单:在Windows GUI设计中,子窗口通常没有菜单栏。如果您想要在子窗口中显示菜单,您可能需要使用不同的方法,比如弹出菜单(popup menu)。

    2. 子窗口的CreateWindow调用:在您的代码中,您为子窗口C1传递了hmenu作为最后一个参数。然而,对于子窗口来说,最后一个参数应该是一个指向创建数据的指针,而不是菜单句柄。这可能是导致问题的原因之一。

    3. TrackPopupMenu的使用:您在WM_CONTEXTMENU消息的处理中使用了TrackPopupMenu函数来显示弹出菜单。这是一个正确的方法来显示与子窗口关联的菜单。

    为了解决您的问题,我建议采取以下步骤:

    • 移除子窗口的菜单句柄:不要在创建子窗口时传递菜单句柄。子窗口通常不包含自己的菜单。

    • 使用弹出菜单:在需要显示菜单的地方,使用TrackPopupMenu或类似的函数来显示弹出菜单。

    • 调整GETSUBMENUS函数:确保GETSUBMENUS函数能够正确加载并显示菜单。

    下面是修改后的代码示例:

    // ... 省略其他代码 ...
    
    HWND C1 = CreateWindow("Child", "c1", WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW, 100, 20, 30, 70, hwnd, (HMENU)1, hInstance, NULL); // 注意这里的更改
    HWND C2 = CreateWindow("Child", "c1", WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, C1, NULL, hInstance, NULL);
    HWND C13 = CreateWindow("Child", "c1", WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW, 600, 20, 30, 70, hwnd, NULL, hInstance, NULL);
    
    // ... 省略其他代码 ...
    
    void GETSUBMENUS(HWND hwnd, LPARAM lParam)
    {
        HMENU hmenue = LoadMenu(hinst, (char*)IDR_MENU1);
        HMENU hmenuone = GetSubMenu(hmenue, 0);
        // 确保TrackPopupMenu的调用是正确的
        TrackPopupMenu(hmenuone, TPM_CENTERALIGN | TPM_VCENTERALIGN, LOWORD(lParam), HIWORD(lParam), 0, hwnd, NULL);
    }
    
    // ... 省略其他代码 ...
    

    请注意,我移除了子窗口C1创建时传递的菜单句柄,并将其替换为(HMENU)1,这是一个常用的技巧,用于确保CreateWindow调用成功,同时不传递实际的菜单句柄。

    至于参考资料,您可以查看以下资源来获取更多关于Windows编程和菜单使用的信息:

    1. Microsoft Documentation on Menus
    2. TrackPopupMenu Function

    希望这些信息能帮助您解决问题。如果您需要进一步的帮助,请随时提问。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月10日
  • 已采纳回答 6月2日
  • 创建了问题 5月29日

悬赏问题

  • ¥15 asp写PC网站开通了微信支付,扫码付款不能跳转
  • ¥50 AI大模型精调(百度千帆、飞浆)
  • ¥15 关于#c语言#的问题:我在vscode和codeblocks中编写c语言时出现打不开源文件该怎么办
  • ¥15 非科班怎么跑代码?如何导数据和调参
  • ¥15 福州市的全人群死因监测点死亡原因报表
  • ¥15 Altair EDEM中生成一个颗粒,并且各个方向没有初始速度
  • ¥15 系统2008r2 装机配置推荐一下
  • ¥500 服务器搭建cisco AnyConnect vpn
  • ¥15 悬赏Python-playwright部署在centos7上
  • ¥15 psoc creator软件有没有人能远程安装啊