【问题标题】:Why is my win32 polygon is not working? [duplicate]为什么我的 win32 多边形不起作用? [复制]
【发布时间】:2015-11-13 16:40:37
【问题描述】:

winMain 是一个默认的 main 函数,仅此而已。 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);

【问题讨论】:

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

标签: c++ winapi polygon


【解决方案1】:

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

文档显示Polygon 由gdi32.lib 提供。

显然你使用的编译器默认没有链接到那个库,所以添加它。


关于

” window.cpp 包含在其中

不要#include 实现文件。包括标题。单独编译实现文件并与它们链接(在 IDE 项目中,将所有实现文件作为项目的一部分就足够了)。

关于

” winMain 是默认的主函数

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

【讨论】:

  • 我正在尝试但没有成功。我看到了文档。如果我创建一个项目并链接该文件,我会收到ld.exe||cannot find -lgdi32.lib| 错误。该条目选项相同
  • 好的,我创建了一个新项目,包含在我自己的 window.h 的主文件中,我只将 cpp 添加到项目中......现在它可以工作了......它很烦人,我没有知道为什么
  • 使用main 也没有任何优势。事实上,使用main 作为具有 GUI 的应用程序的入口点有很多缺点。一方面,您必须在链接器中设置/SUBSYSTEM:CONSOLE,操作系统将为您分配一个控制台。如果您仍然使用SUBSYSTEM:WINDOWS,并强制您的main 函数作为入口点,您将破坏CRT。使用WinMain 有一个显着优势:您将获得启动应用程序的模块的HINSTANCE,并且无需在需要时查询它。
  • @Frank:对于 g++,相关的链接器选项是 -lgdi32(没有 .lib),我相信带有 g++ 的库文件的名称是 libgdi32.a。但是,我记得 gdi32 默认与 g++ 链接。检查... 好的,Windows 命令g++ -dumpspecs 2&gt;&amp;1 | find "gdi32" 告诉我,g++ gdi32 默认链接用于 GUI 子系统构建,但不用于控制台子系统构建。所以这可能就是你现在遇到的不同。
猜你喜欢
  • 2017-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-12
相关资源
最近更新 更多