如何在Win2d中使用文本,矩形,颜色和格式参数绘制DrawText?

时间:2018-11-04 00:28:43

标签: win2d c++-winrt

在测试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方法中的一种 温特清楚地指出,论点2可以是正确的。这是唯一也使用Color和Format参数的变体:

    模板void消耗_Microsoft_Graphics_Canvas_ICanvasDrawingSession :: DrawText(param :: hstring const&text,Windows :: Foundation :: Rect const&矩形,Windows :: UI :: Color const&color,Microsoft :: Graphics :: Canvas :: Text :: CanvasTextFormat const&format)const { 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调用。

1 个答案:

答案 0 :(得分:0)

我不是100%理解此修复程序为何起作用,但确实起作用: 首先,我从lambda中取出了文本格式对象的声明。我注意到在编辑过程中的某个时候,名称winrt :: Microsoft :: Graphics :: Canvas :: Text :: CanvasTextFormat已更改为winrt :: Microsoft :: Graphics :: Canvas :: Text :: ICanvasTextFormat,该名称显然是错误的(是否有人链接到此类关键字中“ I”的含义的解释?)。无论如何,如果有“ I”,则声明不生成任何结构,因此这对我来说只是一个错误。但是,在我不小心输入“ I”之前,它也失败了。因此,也许关键的解决方法是将声明移出lambda主体。现在,我将DrawingSession传递给draw方法,并且-VS现在可以理解DrawText的参数,并且可以很好地绘制文本。更多的经验教训。感谢IInspectable(再次有“ I”)的帮助。