При тестировании некоторого примера кода Кенни Керра для 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 & rectangle, Windows :: UI :: Цветовой констант и цвет, Microsoft :: Graphics :: Canvas :: Text :: CanvasTextFormat const & format) const
{
check_hresult (WINRT_SHIM (Microsoft :: Graphics :: Canvas :: ICanvasDrawingSession) -> DrawTextAtRectWithColorAndFormat (get_abi (текст), get_abi (прямоугольник), get_abi (цвет), get_abi (формат)));
}
Мне кажется, что VS не говорит мне, что не так с моей реализацией - может быть, что-то не так, а не аргумент 2, не являющийся float? Я попытался точно продублировать использование образца DrawText.
[Update] Curiouser и curiouser: внезапно 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.