Как нарисовать текст в Win2d с аргументами text, rect, color и format? - PullRequest
0 голосов
/ 04 ноября 2018

При тестировании некоторого примера кода Кенни Керра для 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.

1 Ответ

0 голосов
/ 05 ноября 2018

Я не на 100% понимаю, почему это исправление работает, но оно работает: Для начала я взял декларацию объекта текстового формата из лямбды. И я заметил, что в какой-то момент во время редактирования имя winrt :: Microsoft :: Graphics :: Canvas :: Text :: CanvasTextFormat было изменено на winrt :: Microsoft :: Graphics :: Canvas :: Text :: ICanvasTextFormat, которое явно не прав (есть ли у кого-нибудь ссылка на объяснение значения «я» в таких ключевых словах?). Во всяком случае, декларация не создает структуру, если есть «Я», так что это была просто ошибка с моей стороны. И все же он потерпел неудачу и раньше, прежде чем я случайно вставил «я». Так что, возможно, критическим решением было вынести объявление за пределы лямбда-тела. Теперь я передаю DrawingSession в метод draw и - VS теперь понимает аргументы DrawText и очень хорошо рисует текст. Больше уроков. Спасибо IInspectable (снова «Я») за то, что посмотрели на это.

...