C++ 无法创建目标文件,因为需要资源

标签 c++ winapi resources

好吧,我有一个应该有自定义图标的 C++ Win32 程序。我已经创建了一个 resource.h 文件和一个 resource.rc 文件(我已经编译成一个 resource.o 文件)。现在我需要编译我的 .cpp 文件并将我的源对象文件和资源对象文件链接到最终的可执行文件中。但是我的 cpp 看不到资源文件中的资源。我的意思是在编译阶段 (g++ -c mine.cpp) 它不知道我的自定义图标是什么。

这是我的 resource.h 文件:

    #define IDR_MYMENU 101
    #define IDI_MYICON 201

    #define ID_FILE_EXIT 9001
    #define ID_STUFF_GO 9002

这是我的 resource.rc 文件:

    #include "a.h"

    IDR_MYMENU MENU
    BEGIN
        POPUP "&File"
        BEGIN
            MENUITEM "E&xit", ID_FILE_EXIT
        END

        POPUP "&Stuff"
        BEGIN
            MENUITEM "&Go", ID_STUFF_GO
            MENUITEM "G&o somewhere else", 0, GRAYED
        END
    END

    IDI_STAR ICON "star.ico"

最后是 .cpp 文件:

#include <windows.h>

const char g_szClassName[] = "myWindowClass";

LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    switch (msg) {
        case WM_LBUTTONDOWN:
            MessageBox(NULL, "You pressed the left mouse button! :O", "MousePress", MB_OK | MB_ICONINFORMATION);
            break;      
        case WM_RBUTTONDOWN:
            MessageBox(NULL, "You pressed the right mouse button! :O", "MousePress", MB_OK | MB_ICONINFORMATION);
            break;
        case WM_MBUTTONDOWN:
            {
                char fileName[MAX_PATH];
                HINSTANCE hInstance = GetModuleHandle(NULL);

                GetModuleFileName(hInstance, fileName, MAX_PATH);
                MessageBox(hwnd, fileName, "The name of the program is:", MB_OK | MB_ICONINFORMATION);
            }
            break;
        case WM_CLOSE:
            DestroyWindow(hwnd);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    WNDCLASSEX wc;
    HWND hwnd;
    MSG Msg;

    wc.cbSize           = sizeof(WNDCLASSEX);
    wc.style            = 0;
    wc.lpfnWndProc      = WndProc;
    wc.cbClsExtra       = 0;
    wc.cbWndExtra       = 0;
    wc.hInstance        = hInstance;
    wc.hIcon            = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_STAR));
    wc.hCursor          = LoadCursor(NULL, IDC_CROSS);
    wc.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
    wc.lpszMenuName     = MAKEINTRESOURCE(IDR_MYMENU);
    wc.lpszClassName    = g_szClassName;
    wc.hIconSm          = (HICON)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_STAR), IMAGE_ICON, 16, 16, 0);

    if (!RegisterClassEx(&wc)) {
        MessageBox(NULL, "Registration Failed!", NULL, MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    hwnd = CreateWindowEx(
        WS_EX_DLGMODALFRAME,
        g_szClassName,
        "This is a window!",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 800, 450,
        NULL, NULL, hInstance, NULL     
    );

    if (hwnd == NULL) {
        MessageBox(NULL, "HWND failed!", NULL, MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while (GetMessage(&Msg, NULL, 0, 0) > 0) {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
}

最佳答案

我认为您需要在 .cpp 文件中包含您的 resource.h,因为它定义了您的资源标识符。

关于C++ 无法创建目标文件,因为需要资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12409474/

相关文章:

c++ - 我可以使用 std::align 将内存对齐到任意值 2 吗?

c++ - 检查另一个进程中的线程是否正在休眠

c++ - VS2010 SP1是否只支持部分AVX指令集?

c++ - CreatePen 不会造成内存泄漏吗?

resources - 序列图 : Interactions with resources (DB, 网络、缓存等)

wpf - 如何重构 WPF 中的事件?

.net - 如何将完全定义的控件引用为 WPF 中的资源?

c++ - 为什么 std::next 不接受 InputIterator?

c++ - 使用 GetOverlappedResult 丢失数据?

从 Delphi 调用 SHGetSetSettings