为什么我的win32多边形不起作用?

时间:2015-11-13 16:40:37

标签: c++ winapi polygon

winMain是默认的主要功能。 window.cpp包含在其中。

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

D:\...\window.cpp|| undefined reference to `Polygon@12'|

试图找到多边形的实现,但我的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);

1 个答案:

答案 0 :(得分:0)

查找哪个库提供给定功能的一种方法是检查 documentation

文档显示Polygon提供了gdi32.lib

显然,您正在使用的编译器默认情况下不会链接到该库,因此请添加它。

关于

  

window.cpp包含在其中

不要#include实施文件。包括标题。单独编译器实现文件并与它们链接(在IDE项目中,所有实现文件都是项目的一部分)。

关于

  

winMain是默认的主要功能

只使用标准main:使用Microsoft的非标准怪物没有任何优势。使用Microsoft工具(g ++不需要)将/entry:mainCRTStartup添加到链接器选项。您可以在入口点链接器选项中指定它。