在测试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调用。
答案 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”)的帮助。