婆娑梵净山 2024-05-27 14:26 采纳率: 93%
浏览 6
已结题

windowsAPI程序设计菜单栏设计BUG

这是主程序

#include<windows.h>
#include <tchar.h>
#include<stdio.h>
#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



  • 写回答

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<HWND>(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
    );
    

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 6月13日
  • 已采纳回答 6月5日
  • 创建了问题 5月27日

悬赏问题

  • ¥15 有偿求苍穹外卖环境配置
  • ¥15 代码在keil5里变成了这样怎么办啊,文件图像也变了,
  • ¥20 Ue4.26打包win64bit报错,如何解决?(语言-c++)
  • ¥15 clousx6整点报时指令怎么写
  • ¥30 远程帮我安装软件及库文件
  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?
  • ¥15 Arduino的wifi连接,如何关闭低功耗模式?
  • ¥15 Android studio 无法定位adb是什么问题?
  • ¥15 C#连接不上服务器,