婆娑梵净山 2024-05-26 16:04 采纳率: 89.5%
浏览 4
已结题

c++窗口设计菜单栏显示异常

#include<windows.h>
#include <tchar.h>
#include<stdio.h>
#include "resource1.h"
HINSTANCE hinst;
#define FITHER_X  1000;
#define FITHER_Y  1000;
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;
    }
    HMENU hemu = LoadMenu(hInstance,(char*)IDR_MENU1);
    hwnd = CreateWindow("MainWClass", "window", WS_OVERLAPPEDWINDOW, 0, 0, 1000, 1000, NULL, hemu, hInstance, 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;
}
 
![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/ede75ff160cc4219b04fa145a4ddd37d.jpeg "#left")


在这一段代码中为什么执行后当我的鼠标接触到并点击文件这个菜单时无法弹出文件下的新建和其他子菜单中的选项。

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-05-26 16:04
    关注

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

    看起来你在创建一个Windows应用程序,并且遇到了一个关于菜单的问题。在你的代码中,MainWinProc处理窗口消息,但没有正确处理菜单项的点击事件。你需要为菜单项添加响应函数,以便在用户点击菜单项时执行相应的操作。

    首先,我们需要在资源文件(通常是.rc文件)中定义菜单结构。例如,在资源文件中添加以下内容:

     IDR_MENU1 MENU
     BEGIN
         POPUP "&File"
         BEGIN
             MENUITEM "&New", IDM_NEW
             MENUITEM "&Open", IDM_OPEN
             MENUITEM "&Save", IDM_SAVE
             SEPARATOR
             MENUITEM "&Exit", IDM_EXIT
         END
         POPUP "&Edit"
         BEGIN
             MENUITEM "&Cut", IDM_CUT
             MENUITEM "&Copy", IDM_COPY
             MENUITEM "&Paste", IDM_PASTE
         END
     END
    

    然后,在头文件中声明这些标识符(例如,#define IDM_NEW 1等),并在源文件中包含对应的头文件。

    接下来,你需要修改MainWinProc来处理菜单消息。将default:部分改为:

    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
            case IDM_NEW:
                // Handle New menu item action
                break;
            case IDM_OPEN:
                // Handle Open menu item action
                break;
            case IDM_SAVE:
                // Handle Save menu item action
                break;
            case IDM_EXIT:
                PostQuitMessage(0);
                break;
            case IDM_CUT:
                // Handle Cut menu item action
                break;
            case IDM_COPY:
                // Handle Copy menu item action
                break;
            case IDM_PASTE:
                // Handle Paste menu item action
                break;
            default:
                return DefWindowProc(hwnd, uMsg, wParam, lParam);
        }
        break;
    

    在这之后,根据你的需求实现每个菜单项的功能。例如,对于"New"菜单项,你可能想要打开一个新的对话框或者执行其他操作。请确保为每个菜单项添加适当的处理程序。

    最后,记得在资源文件中为菜单项指定ID,然后在源文件中为这些ID分配相应的功能。这通常通过WM_COMMAND消息处理完成,其中LOWORD(wParam)是菜单项的ID。

    如果你需要具体的代码示例来实现某个特定的菜单项功能,请告诉我具体的需求,我会提供相应的代码。

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

报告相同问题?

问题事件

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