2012-09-13 51 views
0

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

这里是我的RESOURCE.H文件:

#define IDR_MYMENU 101 
    #define IDI_MYICON 201 

    #define ID_FILE_EXIT 9001 
    #define ID_STUFF_GO 9002 

这里是我的RESOURCE.RC文件:

最后这里是.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; 
} 
+0

Wow,* Win32 * with * gcc *! –

回答

1

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

+0

另外:确保定义匹配,现在他们没有。将resource.o链接到可执行文件。 –

+0

我#包含resource.h文件,并使我的定义匹配,但我仍然收到错误,该图标未定义。我是否需要先单独声明然后使用它? – Nigh7Sh4de

相关问题