【问题标题】:How to DrawText in Win2d with text,rect,color, and format arguments?如何在 Win2d 中使用文本、矩形、颜色和格式参数绘制文本?
【发布时间】:2018-11-05 07:16:57
【问题描述】:

在测试 Kenny Kerr 的一些 C++/Winrt 示例代码时,我发现了以下画布绘图操作演示:

CanvasTextFormat format;
    format.HorizontalAlignment(CanvasHorizontalAlignment::Center);
    format.VerticalAlignment(CanvasVerticalAlignment::Center);
    format.FontSize(72.0f);
    format.FontFamily(L"Segoe UI Semibold");

control.Draw([=](CanvasControl const& sender, CanvasDrawEventArgs const& args)
    {
        float2 size = sender.Size();
        float2 center{ size.x / 2.0f, size.y / 2.0f };
        Rect bounds{ 0.0f, 0.0f, size.x, size.y };

        CanvasDrawingSession session = args.DrawingSession();

        session.FillEllipse(center, center.x - 50.0f, center.y - 50.0f, Colors::DarkSlateGray());
        session.DrawText(L"Win2D with\nC++/WinRT!", bounds, Colors::Orange(), format);
    });

Draw 操作在我的项目中效果很好,除了文本绘图 - 那条线不会像写的那样构建。 VS 说参数 2 不能从 Rect 转换为 float:

C2664   'void winrt::impl::consume_Microsoft_Graphics_Canvas_ICanvasDrawingSession<winrt::Microsoft::Graphics::Canvas::ICanvasDrawingSession>::DrawText(const winrt::param::hstring &,float,float,float,float,const winrt::Windows::UI::Color &,const winrt::Microsoft::Graphics::Canvas::Text::CanvasTextFormat &) const': cannot convert argument 2 from 'winrt::Windows::Foundation::Rect' to 'float' 
  • 它似乎想将此调用解释为采用四个浮点参数的版本,即使我键入第二个参数也是如此。然而其中的一种 DrawText 方法 winrt 明确表示参数 2 可以是一个矩形。这是唯一也使用颜色和格式参数的变体:

    模板 void consume_Microsoft_Graphics_Canvas_ICanvasDrawingSession::DrawText(param::hstring const& text, Windows::Foundation::Rect const& rectangle, Windows::UI::Color const& color, Microsoft::Graphics::Canvas::Text::CanvasTextFormat常量&格式)常量 { check_hresult(WINRT_SHIM(Microsoft::Graphics::Canvas::ICanvasDrawingSession)->DrawTextAtRectWithColorAndFormat(get_abi(text), get_abi(rectangle), get_abi(color), get_abi(format))); }

在我看来,VS 并没有告诉我我的实现有什么问题——也许还有其他问题,而不是参数 2 不是浮点数?我试图密切复制示例对 DrawText 的使用。

[更新] 好奇和好奇:突然 VS 也返回文本格式的链接错误 - 以前它没有问题,但只有调用 DrawText。也许这是一个暗示。我试着改变椭圆的颜色;文本格式不会链接;将椭圆颜色改回原来的样子,但它仍然无法构建,尽管我根本没有触及格式声明。这是链接错误:

Error   LNK2019 unresolved external symbol "public: void __thiscall winrt::impl::consume_Microsoft_Graphics_Canvas_Text_ICanvasTextFormat<struct winrt::Microsoft::Graphics::Canvas::Text::ICanvasTextFormat>::FontFamily(struct winrt::param::hstring const &)const " (?FontFamily@?$consume_Microsoft_Graphics_Canvas_Text_ICanvasTextFormat@UICanvasTextFormat@Text@Canvas@Graphics@Microsoft@winrt@@@impl@winrt@@QBEXABUhstring@param@3@@Z) referenced in function "public: void __thiscall <lambda_05084435c3f7f2f96a04d3453f0476aa>::operator()(struct winrt::Microsoft::Graphics::Canvas::UI::Xaml::CanvasControl const &,struct winrt::Microsoft::Graphics::Canvas::UI::Xaml::CanvasDrawEventArgs const &)const " (??R<lambda_05084435c3f7f2f96a04d3453f0476aa>@@QBEXABUCanvasControl@Xaml@UI@Canvas@Graphics@Microsoft@winrt@@ABUCanvasDrawEventArgs@234567@@Z)    

所以,如果我注释掉文本格式的声明,现在它将构建并运行。以前它与该礼物一起运行良好 - 只是无法链接 DrawText 调用。

【问题讨论】:

  • 您使用的是什么 SDK 版本、编译器版本和编译器标志?
  • 目标 SDK 是 17763,VS 是最新的版本 15.8.9 和任何编译器自然而来。项目基于 VS 创建的 C++/winrt BlankApp(由 15.9.0 Preview 4 创建)。在预览版 4 遇到问题后,我回到了发布版 VS。我想知道这是否与该更改有关 - 即使发布版 VS 仍然不允许我使用局部变量窗口(如果我尝试则退出并重新启动)。唯一的附加编译器标志是 /bigobj,它是从那里开始的。我曾尝试添加 /await,但将其删除。
  • 提供的编译器 BTW 是为 C++17 设置的。
  • 我正在用同一个调用中的新错误更新问题。

标签: win2d c++-winrt


【解决方案1】:

我不是 100% 理解为什么此修复有效,但它确实有效: 首先,我从 lambda 中取出了文本格式对象的声明。我注意到在编辑过程中的某个时候,名称 winrt::Microsoft::Graphics::Canvas::Text::CanvasTextFormat 已更改为 winrt::Microsoft::Graphics::Canvas::Text::ICanvasTextFormat,它显然是错误的(有没有人链接到这些关键字中“我”的含义的解释?)。无论如何,如果“I”在那里,声明不会产生任何结构,所以这只是我的一个错误。然而,在我不小心输入“我”之前,它也失败了。所以也许关键的修复是在 lambda 主体之外进行声明。我现在将 DrawingSession 传递给 draw 方法,并且 - VS 现在理解 DrawText 的参数,它可以很好地绘制文本。吸取了更多的教训。感谢 IInspectable(又是“我”)查看此内容。

【讨论】:

    猜你喜欢
    • 2020-09-21
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多