• 0
Maximus

Утолщение линии при отрисовке на Canvas

Вопрос

Доброго всем времени суток. Хочу снова поднять вопрос про отрисовку линий на канве, обсуждавшейся здесь

С горизонтальными и вертикальными линиями проблем нет, при смещении на половину от толщины линии всё прекрасно выглядит. Однако при отрисовке линий под различными углами такой финт не проходит: слева VCL, справа FMX

VCL.jpgFMX.jpg

Линия всё так же размазывается, в итоге визуально утолщается и становится не такой чёткой.

Как всё же добиться такого же результата как на VCL? Интересует только Windows.

const
  OFFSET_LINE = 0.5;
...
  Image.Bitmap.Canvas.BeginScene;
  Image.Bitmap.Canvas.Stroke.Kind := TBrushKind.Solid;
  Image.Bitmap.Canvas.Stroke.Thickness := 1.0;
  Image.Bitmap.Canvas.DrawLine(
        PointF(10.0 - OFFSET_LINE, 10.0 - OFFSET_LINE),
        PointF(500.0 - OFFSET_LINE, 10.0 - OFFSET_LINE), 1.0);
  Image.Bitmap.Canvas.DrawLine(
        PointF(10.0 - OFFSET_LINE, 10.0 - OFFSET_LINE),
        PointF(10.0 - OFFSET_LINE, 500.0 - OFFSET_LINE), 1.0);
  Image.Bitmap.Canvas.DrawLine(
        PointF(10.0 - OFFSET_LINE, 10.0 - OFFSET_LINE),
        PointF(500.0 - OFFSET_LINE, 500.0 - OFFSET_LINE), 1.0);
  Image.Bitmap.Canvas.EndScene;

 

Изменено пользователем Maximus

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

4 ответа на этот вопрос

  • 0

Никак не повлияло на отрисовку.

Пока я единственным выходом вижу отрисовку линии вручную попиксельно с округлением и со сдвигом. Но всё же это костыль какой-то, хоть и работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

1) окрыть project.dpr (меню.Project.View Source)
добавить

uses
  FMX.Types,
  ......
begin
  //отключить использование канвы D2D
  GlobalUseDirect2D:= false;

  Application.Initialize;
....
end.

2) В главной форме приложения перекрыть OnFormCreate

procedure TForm1.FormCreate(Sender: TObject);
begin
  Quality:=TCanvasQuality.HighPerformance;
....
end;

Теперь PaintBox на форме в PaintBox1Paint рисует прямые в 1 пиксел, но без
сглаживания.

Alexander и Maximus понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Интересный способ, для PaintBox это удобнее чем попиксельно рисовать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Похожие публикации

    • Автор: ODmitrijS
      Подскажите алгоритм или готовый пример заливки замкнутой области рисунка произвольной формы определенным цветом?
      Моё решение часто приводит к переполнению стека.
    • Автор: AlexG
      Добрый вечер, друзья!
      Кто в курсе, подскажите - возможен ли плавный скроллинг содержимого TListView при работе приложения под Windows?
      Если с мобильным вариантом все ОК, на "автомате" - т.е. плавный скроллинг там работает по умолчанию, то с работой под Windows что-то не понятно как это включить/реализовать.
      Например, чтобы сделать плавный скролл содержимого TListBox, достаточно написать
      TScrollBox(__listbox1___).AniCalculations.Animation := True; А есть ли что-то аналогичное для TListView?
      Заранее благодарен за ответы!
    • Автор: Rusland
      В ходе работы с js библиотекой leaflet столкнулся с проблемой некорректной работы стандартного веббраузера на виндоуз. 
      Как известно компонент Webbrowser в Windows использует движок Internet Explorer. Но, как выяснилось, по умолчанию он работает в режиме совместимости IE6, даже если у вас установлена гораздо более новая версия.
      Для того чтобы заставить его работать в нужно вам режиме требуется внести правку в реестр:
      HKEY_CURRENT_USER или HKEY_LOCAL_MACHINE SOFTWARE Microsoft Internet Explorer Main FeatureControl FEATURE_BROWSER_EMULATION Project1.exe = (DWORD) 0x00002710 (значения см. ниже) где Project1.exe - это название вашего приложения, а значения параметр принимает следующие:
      Value Description 11001 (0x2AF9 Internet Explorer 11. Webpages are displayed in IE11 edge mode, regardless of the declared !DOCTYPE directive. Failing to declare a !DOCTYPE directive causes the page to load in Quirks. 11000 (0x2AF8) IE11. Webpages containing standards-based !DOCTYPE directives are displayed in IE11 edge mode. Default value for IE11. 10001 (0x2711) Internet Explorer 10. Webpages are displayed in IE10 Standards mode, regardless of the !DOCTYPE directive. 10000 (0x02710) Internet Explorer 10. Webpages containing standards-based !DOCTYPE directives are displayed in IE10 Standards mode. Default value for Internet Explorer 10. 9999 (0x270F) Windows Internet Explorer 9. Webpages are displayed in IE9 Standards mode, regardless of the declared !DOCTYPE directive. Failing to declare a !DOCTYPE directive causes the page to load in Quirks. 9000 (0x2328) Internet Explorer 9. Webpages containing standards-based !DOCTYPE directives are displayed in IE9 mode. Default value for Internet Explorer 9. Important  In Internet Explorer 10, Webpages containing standards-based !DOCTYPE directives are displayed in IE10 Standards mode.   8888 (0x22B8) Webpages are displayed in IE8 Standards mode, regardless of the declared !DOCTYPE directive. Failing to declare a !DOCTYPE directive causes the page to load in Quirks. 8000 (0x1F40) Webpages containing standards-based !DOCTYPE directives are displayed in IE8 mode. Default value for Internet Explorer 8 Important  In Internet Explorer 10, Webpages containing standards-based !DOCTYPE directives are displayed in IE10 Standards mode.   7000 (0x1B58) Webpages containing standards-based !DOCTYPE directives are displayed in IE7 Standards mode. Default value for applications hosting the WebBrowser Control.  
      PS. лично мне помогло исправление ветки HKEY_CURRENT_USER и установка версии IE10
      link
    • Автор: Error
      *** Небольшой обмен опытом ***
      Вижу что вопросы о размере текста довольно частые, поделюсь своими наработками.
      function CalcTextSize(Text: string; Font: TFont; Size: Single = 0): TSizeF;
      Функция для расчета размера прямоугольника, занимаемого однострочным текстом.
      Параметры:
      Text - Текст Font - Шрифт с которым будет выводиться текст Size - если 0, то Font.Size будет использоваться из Font, иначе из данного параметра Исходный код:
      uses System.Types, FMX.Types, FMX.Graphics, FMX.TextLayout, System.Math, System.SysUtils; function CalcTextSize(Text: string; Font: TFont; Size: Single = 0): TSizeF; var TextLayout: TTextLayout; begin TextLayout := TTextLayoutManager.DefaultTextLayout.Create; try TextLayout.BeginUpdate; try TextLayout.Text := Text; TextLayout.MaxSize := TPointF.Create(9999, 9999); TextLayout.Font.Assign(Font); if not SameValue(0, Size) then begin TextLayout.Font.Size := Size; end; TextLayout.WordWrap := False; TextLayout.Trimming := TTextTrimming.None; TextLayout.HorizontalAlign := TTextAlign.Leading; TextLayout.VerticalAlign := TTextAlign.Leading; finally TextLayout.EndUpdate; end; Result.Width := TextLayout.Width; Result.Height := TextLayout.Height; finally TextLayout.Free; end; end;   function FontSizeForBox(Text: string; Font: TFont; Width, Height: Single; MaxFontSize: Single = cMaxFontSize): Integer;
      Функция возвращающая максимально возможный размер шрифта, для текста вписанного в заданный прямоугольник.
      Параметры:
      Text - Текст Font - Шрифт с которым будет выводиться текст Width, Height - Ширина и высота прямоугольника MaxFontSize - Максимально возможный размер шрифта Исходный код:
      uses System.Types, FMX.Types, FMX.Graphics, FMX.TextLayout, System.Math, System.SysUtils; const cMaxFontSize = 512; function FontSizeForBox(Text: string; Font: TFont; Width, Height: Single; MaxFontSize: Single = cMaxFontSize): Integer; var Size, Max, Min, MaxIterations: Integer; Current: TSizeF; begin Max := Trunc(MaxFontSize); Min := 0; MaxIterations := 20; repeat Size := (Max + Min) div 2; Current := CalcTextSize(Text, Font, Size); if ((Abs(Width - Current.Width) < 1) and (Width >= Current.Width)) and ((Abs(Height - Current.Height) < 1) and (Height >= Current.Height)) then break else if (Width < Current.Width) or (Height < Current.Height) then Max := Size else Min := Size; Dec(MaxIterations); until MaxIterations = 0; Result := Size; end; ---
      Также данные функции можно найти в этом юните
    • Автор: web_warp
      В этой теме я уже задавал вопрос, но, наверное, я просто ошибся разделом. Аккумулирую вопрос:
      10.1 Berlin, C++, Win8, FMX. Интересует особенность работы Canvas->FillText(), вот код:
      void __fastcall TTabbedForm::StringGrid1DrawColumnCell(TObject *Sender, TCanvas * const Canvas, TColumn * const Column, const TRectF &Bounds, const int Row, const TValue &Value, const TGridDrawStates State) { // код... UnicodeString CT = TabbedForm->StringGrid1->Cells[Column->Index][Row]; Canvas->FillText(Bounds, CT, false, 100,TFillTextFlags() << TFillTextFlag::ftRightToLeft, TTextAlign::taTrailing, TTextAlign::taTrailing); } В итоге наблюдаются совсем странные "фишки":
      1. Разворот времени, хотя в FillText() текст передаётся правильный.
      2. Если текст заканчивается на скобку, то скобка разворачивается и переносится в начало текста.
      3. И, если есть и кириллица, и латиница, то текст просто не выводится)) (хотя есть подозрение, что это кавычки виноваты).
       
      Кто сталкивался? Что делать? Есть альтернативы?
    • Автор: Просто Проги
      Собственно сделал я  программу мини проигрователь всё вроде даже работает, но нужно переключать треки когда приложение свернуто,т.е не видно пробовал реализацию через WinApi
      var   FWnd:HWnd; RegisterHotKey(FWnd, Ord('U'), 0, Ord('U')); но почему то нечего не работает(
       
    • Автор: Steepe_Hare
      Под Windows 32  приложение собирается и работает отлично, под Android при запуске из RAD-среды сразу говорит: Project project1.apk raised exception class ECanvasException with message 'Handle not allocated' и отказывается работать.
      В чем может быть причина?
    • Автор: Vitaldj
      Для проекта под windows, в разделе application есть 3-и чекбокса. Последний понятен - это что бы при запуске давались права администратора. Тут вопросов нет. А что означают первые два?

      В общем понятно, но как говориться что конкретно? Что они дают приложению? Первое про использование тем. Я не нашел разницы при использовании в программе этого чекбокса. Второе, я так понимаю, дает использование high-DPI. Тоже, хотелось бы комментарии от знающих людей. Выделение второго, добавляет общем запускного файла до 5% в среднем.
      Есть знающие люди?
    • Автор: Равиль Зарипов (ZuBy)
      DeviceInfo - модуль для получения информации о девайсе
      Android || Windows || IOS || MAC OS
        

      Intel планшет

      для Андроида нужно включить разрешения (permission)
      Ссылка на GitHub
    • Автор: web_warp
      В DrawColumnCell провожу зарисовку некоторых строк, необходима подсветка цветом. И тут возникла неожиданная проблема на ровном месте: ячейка, где текстом записано время, почему-то меняет местами время и дату, хотя передаётся в функцию FillText как надо.
      TabbedForm->StringGrid1->Canvas->Fill->Color = background_color; TabbedForm->StringGrid1->Canvas->FillRect(Bounds, 0, 0, AllCorners, 100); TabbedForm->StringGrid1->Canvas->Fill->Color = font_color; TabbedForm->StringGrid1->Canvas->Font->Style << fsBold; TabbedForm->StringGrid1->Canvas->FillText(Bounds,TabbedForm->StringGrid1->Cells[Column->Index][Row], false, 100,TFillTextFlags() << TFillTextFlag::ftRightToLeft, TTextAlign::taTrailing, TTextAlign::taTrailing); Подскажите пожалуйста, как развернуть время обратно?

      Ну и параллельно вопрос: как строку сплошным цветом заливать? Без белых границ?
  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу