【问题标题】:SelectObject WinApi function Cannot Compiling in Rad Studio SeatleSelectObject WinApi 函数无法在 Rad Studio Seatle 中编译
【发布时间】:2016-01-20 09:18:18
【问题描述】:

我正在尝试在 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 错误] Unit1.cpp(132): E2034 无法将 'void *' 转换为 'HPEN__ *' 完整的解析器上下文 Unit1.cpp(121): 解析: 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);

我没有看到任何不同。

我有什么问题。

谢谢。

【问题讨论】:

    标签: winapi c++builder c++builder-10-seattle


    【解决方案1】:

    SelectObject 返回与HPEN 不兼容的HGDIOBJ。关键是SelectObject 可以返回各种不同的GDI 对象类型。由您决定返回什么类型,并相应地进行转换。例如:

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

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

    【讨论】:

    • 仅供参考,此错误仅在定义 STRICT 时发生,其中 HPEN 定义为指向不同 HPEN__ 结构类型的指针。当STRICT 未定义时,HGDIOBJHPEN 都定义为void*,因此无需强制转换即可进行赋值兼容。 STRICT 在 C++Builder 2009+ 中默认启用:C++ Applications Use STRICT Type Checking
    猜你喜欢
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多