SelectObject WinApi 函数无法在 Rad Studio Seatle 中编译

SelectObject WinApi function Cannot Compiling in Rad Studio Seatle

我正在尝试在 Rad Studio Seatle CBuilder 10 中编译 below code snippet

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    HPEN hpen, hpenOld;
    HBRUSH hbrush, hbrushOld;
    HDC hdc = this->Canvas->Handle;

    // Red pen for the border
    hpen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
    // Blue brush for the interior.
    hbrush = CreateSolidBrush(RGB(0, 0, 255));

    // Select the new pen and brush then draw a rectangle.
    hpenOld = SelectObject(hdc, hpen);
    hbrushOld = SelectObject(hdc, hbrush);
    Rectangle(hdc, 100,100, 400,250);

    // After using your objects, delete them and restore the originals
    SelectObject(hdc, hpenOld);
    DeleteObject(hpen);
    SelectObject(hdc, hbrushOld);
    DeleteObject(hbrush);
}

但无法编译该行并显示错误消息。

hpenOld = SelectObject(hdc, hpen);

[bcc32 Error] Unit1.cpp(132): E2034 Cannot convert 'void *' to 'HPEN__ *' Full parser context Unit1.cpp(121): parsing: void _fastcall TForm1::Button1Click(TObject *)

我可以在 "c++ builder 6".

中成功编译此源代码

我还检查了 CBuilder 6 和 Cbuilder 10 中的 SelectObject 函数声明

CBuilder 6 声明(wingdi.h)

WINGDIAPI HGDIOBJ WINAPI SelectObject(IN HDC, IN HGDIOBJ);

CBuilder 10 声明(wingdi.h)

WINGDIAPI HGDIOBJ WINAPI SelectObject(_In_ HDC hdc, _In_ HGDIOBJ h);

我没有看到任何不同。

我的问题是什么。

谢谢。

SelectObject returns HGDIOBJHPEN 不兼容。重点是 SelectObject 可以 return 多种不同的 GDI 对象类型。由您决定 returned 是什么类型,并进行相应的转换。例如:

hpenOld = (HPEN)SelectObject(hdc, hpen);

您需要对 SelectObject 的另一个调用执行同样的操作。