Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.07.2015, 15:20   #1
Dagmanor
Пользователь
 
Регистрация: 26.02.2014
Сообщений: 26
По умолчанию path в GDI+ ...

Уважаемые посетители форума. Прошу совета в решении задачки...

Суть состоит в том, что надо нарисовать текст с обводкой букв.
Обводку букв можно нарисовать с помощью :

Код:
BeginPath( Canvas.Handle);
 DrawText(Canvas.Handle,'Test str',-1,r, DT_WORDBREAK) ;
 EndPath(Canvas.Handle) ;
 StrokePath(PaintBox1.Canvas.Handle);
Но в таком случае она получается довольно корявой...
А для рисования сглаженного контура было принято решение нарисовать его с помощью GDI+.

Для этого я использовал GetPath:

Код:
var
  points: PGPPoint;
  p_flags: PByte;
begin
....
  points := nil;
  p_flags := nil;
 
  p_size:=GetPath(PaintBox1.Canvas.Handle,PPointer(nil)^,PPointer(nil)^,0);
 
  points := GetMemory(p_size * SizeOf(TPoint));
  p_flags := GetMemory(p_size * SizeOf(Byte));
 
  GetPath(Canvas.Handle,points^,p_flags^,p_size);
 
....
end;
И, судя по всему, координаты пути вытягиваются так как если для теста сделать


Код:
for i := 0 to p_size - 1 do
begin
  Canvas.MoveTo(points^.x, points^.y);
  Memo1.Lines.Add( Format('(%d;%d)  |%d', [points^.x, points^.y,p_flags^]) );
  Inc(points);
  Inc(p_flags);
  Canvas.LineTo(points^.x, points^.y);
end;
то на форме рисуется текст (хоть и с лишними линиями между точками).

Вопрос, собственно, в том как этот путь передать в GDI+.
Пробовал так:

Код:
//  g: TGPGraphics;
//  path: TGPGraphicsPath;
//  pen: TGPPen;
 
path:=TGPGraphicsPath.Create(points,p_flags,p_size);
 
  g:=TGPGraphics.Create(PaintBox1.Canvas.Handle);
  pen:=TGPPen.Create(ColorRefToARGB($0083182E), 2);
  g.SetSmoothingMode(2);
  g.DrawPath(pen, path);
но на канву ничего не выводится. И метод path.GetPathPoints(points,p_size) возвращает 0...
В то же время если сделать так:


Код:
path.AddPolygon(points,p_size) ;
то на канву выводится текст, но вместе с лишними линиями (от точки к точке между буквами).

Знаю что можно рисовать контур букв средствами самого GDI+ ( path.addString(...) ), но тогда я несмогу использовать флаги форматирования текста DT_WORDBREAK, DT_END_ELLIPSIS и иже с ними. А силу некоторых причин - без них совсем никак

Подскажите пожалуйста как в path GDI+ правильно добавить points и p_flags..

Среда - Delphi 7.
Dagmanor вне форума Ответить с цитированием
Старый 24.07.2015, 11:10   #2
Dagmanor
Пользователь
 
Регистрация: 26.02.2014
Сообщений: 26
По умолчанию

В общем проблема решилась так (может кому-то пригодится):
Код:
procedure TForm1.Button1Click(Sender: TObject);
type
  PPointArray = ^TPointArray;
  TPointArray = array[0..1000] of TPoint;
var
  r:TRect;
//  points: PGPPoint;//array[0..1000] of TPoint;
//  p_flags: PByte;//array[0..1000] of Byte;
  p_size: Integer;
  i,j: Integer;
  points: PPointArray;
  p_flags: PByteArray;//array[0..1000] of Byte;

  tempArr : array of TGPPoint ;
  g_point:PGPPoint;

  g: TGPGraphics;
  path: TGPGraphicsPath;
  pen: TGPPen;
  brush: TGPSolidBrush;

  figureStart: Integer;
  bezierIndex: Byte;
begin

  PaintBox1.Canvas.Brush.Style := bsClear;
//  PaintBox1.Canvas.Pen.width:=2;
  PaintBox1.Canvas.Font.Color := clRed;
  PaintBox1.Canvas.Font.Name := 'Tahoma';
  PaintBox1.Canvas.Font.Size := 60;


  r:=  Rect(10,10,50,150);
  BeginPath( PaintBox1.Canvas.Handle);
  DrawText(PaintBox1.Canvas.Handle,'Test string sss',-1,r, DT_WORDBREAK or DT_END_ELLIPSIS) ;

  EndPath(PaintBox1.Canvas.Handle) ;

  points := nil;
  p_flags := nil;

  p_size:=GetPath(PaintBox1.Canvas.Handle,PPointer(nil)^,PPointer(nil)^,0);

  points := GetMemory(p_size * SizeOf(TPoint));
  p_flags := GetMemory(p_size * SizeOf(Byte));
  GetPath(PaintBox1.Canvas.Handle,points[0],p_flags[0],p_size);

  path:=TGPGraphicsPath.Create();

  bezierIndex := 0;
  figureStart := 0;
  for i := 0 to p_size - 1 do
  begin

    case p_flags[i] of
      PT_BEZIERTO:
        Inc(bezierIndex);
      PT_MOVETO:
      begin
        path.AddLine(MakePoint(Points[i].X,points[i].y),MakePoint(Points[i].X,points[i].y));

        Canvas.MoveTo(points[i].x, points[i].y);
        figureStart := i;
      end;
    else
      // draw bezier
      if bezierIndex > 0 then
      begin
        Windows.PolyBezierTo(Canvas.Handle, points[i-bezierIndex], bezierIndex);
        SetLength(tempArr,0);
        j:=i-bezierIndex;
        while j<=i do
        begin;
          SetLength(tempArr,Length(tempArr)+1);
          tempArr[High(tempArr)].X:=points[j].X;
          tempArr[High(tempArr)].Y:=points[j].Y;
          inc(j);
        end;
        g_point:=@tempArr[0];//;
//        path.AddCurve(g_point,bezierIndex);
        path.Addbeziers(g_point, bezierIndex-2);
        SetLength(tempArr,0);
      end;
      bezierIndex := 0;

      if p_flags[i] and PT_LINETO <> 0 then
      begin
        Canvas.LineTo(points[i].x, points[i].y);
        path.AddLine(MakePoint(Points[i-1].X,points[i-1].y),MakePoint(Points[i].X,points[i].y));
      end;

      if p_flags[i] and PT_CLOSEFIGURE <> 0 then
      begin
        Canvas.LineTo(points[figureStart].x, points[figureStart].y);
        path.CloseFigure;
      end;
    end;

  end;

  g:=TGPGraphics.Create(PaintBox1.Canvas.Handle);
  pen:=TGPPen.Create(ColorRefToARGB($0083182E), 1);
//  brush:=TGPSolidBrush.Create(ColorRefToARGB(clLime));
  g.SetSmoothingMode(4);
  g.DrawPath(pen, path);
//  g.FillPath(brush, path);

  g.Free;
  pen.Free;
  path.Free;

end;
Dagmanor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
GDI\GDI+\Photoshop - как добиться прозрачности пикселей определенного цвета? STRELOK-2007 Мультимедиа в Delphi 12 11.01.2014 13:37
Path в Windows 8 Pein95 Операционные системы общие вопросы 12 18.04.2013 00:20
С++ path KooKish Помощь студентам 6 04.03.2013 10:19
Формат *.path meganet Софт 7 16.01.2013 11:12
Path not found igor_564 Паскаль, Turbo Pascal, PascalABC.NET 3 05.12.2009 21:24