2015-11-13 87 views
-1

winMain是一个默认的主函数没有别的。包含在其中的window.cpp包含在其中。为什么我的win32多边形不工作?

没有多边形的代码可以被编译和一个简单的窗口显示。 但是当我想绘制多边形我收到以下错误信息:

D:\...\window.cpp|| undefined reference to `[email protected]'| 

试图找到多边形的实现,但我的IDE(代码块)无法找到它。

window.cpp

#include "window.h" 

LRESULT CALLBACK window::windproc(HWND hMain, UINT msg, WPARAM wParam, LPARAM lParam) 
// PROCEDURE OF THE MAIN WINDOW 
{ 
    HDC hdc; 
    PAINTSTRUCT ps; 
    POINT pt[3]; 
     pt[0].x = 300; 
     pt[0].y = 200; 
     pt[1].x = 350; 
     pt[1].y = 100; 
     pt[2].x = 400; 
     pt[2].y = 200; 

    switch(msg) 
    { 
    case WM_PAINT: 
      hdc = BeginPaint(hMain,&ps); 
      Polygon(hdc,pt,3); 
      EndPaint(hMain,&ps); 
     break; 
    case WM_MBUTTONDOWN: 
     PostQuitMessage(0); 
     break; 
    case WM_DESTROY: 
     PostQuitMessage(0); 
     break; 
    default: 
     return DefWindowProc (hMain, msg, wParam, lParam); 
    } 

    return 0; 
} 

void center_window(HWND main) 
{ 
    RECT rc; 
    GetClientRect(main, &rc); 
    int xPos = (GetSystemMetrics(SM_CXSCREEN) - rc.right)/2; 
    int yPos = (GetSystemMetrics(SM_CYSCREEN) - rc.bottom)/2; 
    SetWindowPos(main, 0, xPos, yPos, 0, 0, SWP_NOZORDER | SWP_NOSIZE); 
} 

void check_return(HWND main) 
{ 
    if(!main) 
     MessageBox(main, __FILE__, "ERROR", MB_OK | MB_ICONERROR); 
} 

在window.h

#include <windows.h> 

class window 
{ 
public: 
    class invalid{}; // to throw an exception 

    window(){} 
    ~window(){} 

    LPCSTR label{"main"}; 
    LPCSTR title{"Placeholder"}; 


    static LRESULT CALLBACK windproc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); 
}; 

// AUX FUNCTIONS 
void center_window(HWND hwnd); 
void check_return(HWND hwnd); 
+0

这是一个链接器错误,显示你的代码不能帮助我们帮助你。链接gdi32。 –

回答

0

一个办法,找出该库提供一个给定的功能,是检查documentation

该文件显示Polygongdi32.lib提供。

显然,您使用的编译器默认情况下并未与该库链接,因此将其添加。


关于

window.cpp包含在里面

#include实现文件。包含标题。分别编译实现文件并与它们链接(在IDE项目中,将所有实现文件都包含在项目中就足够了)。

关于

WinMain函数是一个默认的主要功能

只需使用标准main:有一个在使用微软的非标准无畸形优势。使用微软工具(这在g ++中不需要)将/entry:mainCRTStartup添加到链接器选项中。您可以在入口点链接器选项中指定它。

+0

我在尝试但没有成功。我看到了文档。如果我做了一个项目并链接那个文件,我得到'ld.exe ||找不到-lgdi32.lib |'错误。相同的入口选项 – Frank

+0

好吧,我创建了一个新的项目,包括int主文件我自己的window.h,我只将cpp添加到项目....现在它的作品....它令人讨厌,我不知道为什么 – Frank

+0

使用'main'也没有优势。事实上,使用'main'作为具有GUI的应用程序的入口点有很多缺点。首先,你必须在链接器中设置'/ SUBSYSTEM:CONSOLE',操作系统将为你分配一个控制台。如果你仍然使用'SUBSYSTEM:WINDOWS',并且强制你的'main'函数作为入口点,那么你会破坏CRT。使用'WinMain'有一个显着的优点:你将获得启动应用程序的模块的'HINSTANCE',并且在你需要时不必查询它。 – IInspectable