婆娑梵净山 2024-05-27 15:21 采纳率: 89.5%
浏览 1
已结题

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 15:32
    关注

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


    根据您提供的代码和资源文件,问题可能出在消息处理函数上。在Windows API中,当用户点击菜单项时,会发送一个WM_COMMAND消息到窗口程序的消息队列中。您需要在窗口过程函数(MainWinProc)中添加对WM_COMMAND消息的处理,以便响应菜单项的点击事件。

    首先,确保您的资源文件中的菜单项ID是唯一的,并且没有与其他控件或菜单项ID冲突。在您的资源文件中,ID_32771ID_32772看起来是临时生成的ID,您需要确保它们没有被其他资源或控件使用。

    接下来,在MainWinProc函数中添加对WM_COMMAND消息的处理。以下是一个示例,展示了如何添加对WM_COMMAND消息的处理:

    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;
        case WM_COMMAND:
            switch (wParam)
            {
            case ID_32771: // 假设ID_32771是“类型”菜单项的ID
                // 处理“类型”菜单项点击事件
                MessageBox(hwnd, "您点击了“类型”菜单项", "菜单响应", MB_OK);
                break;
            case ID_32772: // 假设ID_32772是“开始”菜单项的ID
                // 处理“开始”菜单项点击事件
                MessageBox(hwnd, "您点击了“开始”菜单项", "菜单响应", MB_OK);
                break;
            default:
                return DefWindowProc(hwnd, uMsg, wParam, lParam);
            }
            return 0;
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
        }
        return 0;
    }
    

    请注意,您需要将ID_32771ID_32772替换为您资源文件中实际使用的ID。

    此外,确保您的资源文件正确地与项目关联,并且LoadMenu函数调用时使用的资源ID与资源文件中定义的菜单资源ID相匹配。

    如果您需要更多的参考资料,以下是一些可能有用的链接:

    1. Microsoft Documentation on Menus
    2. Windows API Programming/Menus

    希望这些信息能帮助您解决问题。如果您还有其他问题或需要进一步的帮助,请随时告诉我。

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

报告相同问题?

问题事件

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