Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 24.12.2011, 16:18
Ankor Ankor вне форума
Новичок
 
Регистрация: 19.08.2011
Сообщения: 68
Версия Delphi: XE2, XE3
Репутация: 10
По умолчанию

Ну это наверно не очень удобно, каждый раз вырисовывать текст на канве, да и сколько там всего прописывать надо, поэтому я и использую Label, кидаешь их куда угодно, 2 строчки кода и всё.
Ответить с цитированием
  #17  
Старый 24.12.2011, 21:25
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Ты спросил, я ответил. Хотя, если завернуть в процедуру, вызов составит 1 строку.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #18  
Старый 25.12.2011, 01:31
Ankor Ankor вне форума
Новичок
 
Регистрация: 19.08.2011
Сообщения: 68
Версия Delphi: XE2, XE3
Репутация: 10
По умолчанию

А в мой модуль нельзя как-нибудь эти Ваши функции завернуть, чтобы потом все Label-ы, более чётче перерисовывались?
А то в данном модуле черная обводка например, на некоторых картинках отсвечивает иногда красным, да и другми цветами, нет четкого контура.

Может можно и проще в модуле дописать, вам как специалистам виднее.

Плюсики, спасибы и благодарности всегда за мной.
Ответить с цитированием
  #19  
Старый 25.12.2011, 01:42
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Я тут на скорую руку состряпял юнит:
stroke.pas
Код:
unit stroke;

interface

uses
  Windows, Messages, Classes, Controls, Graphics, StdCtrls;
  
type
  TCustomStrokeLabel	= class(TCustomLabel)
  private
    fShowAccelChar	: Boolean;
    fAlignment		: TAlignment;
    fLayout		: TTextLayout;
    fWordWrap		: Boolean;
    fPathColor		: TColor;
    procedure SetAlignment(Value : TAlignment);
    procedure SetShowAccelChar(Value : Boolean);
    function  GetPathColor : TColor;
    procedure SetPathColor(aColor : TColor);
  protected
    function  GetLabelText : String ; override;
    procedure DoDrawText(var Rect : TRect; Flags : Longint); override;
    procedure Paint; override;

    property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify;
    property ShowAccelChar : Boolean read FShowAccelChar write SetShowAccelChar default True;
  public
    constructor Create(AOwner : TComponent); override;
    property PathColor : TColor read GetPathColor write SetPathColor default clRed;
  end;
    
  TStrokeLabel		= class(TCustomStrokeLabel)
  published
    property Align;
    property Alignment;
    property Anchors;
    property AutoSize;
    property BiDiMode;
    property Caption;
    property Color nodefault;
    property Constraints;
    property DragCursor;
    property DragKind;
    property DragMode;
    property Enabled;
    property FocusControl;
    property Font;
    property ParentBiDiMode;
    property ParentColor;
    property ParentFont;
    property ParentShowHint;
    property PathColor;
    property PopupMenu;
    property ShowAccelChar;
    property ShowHint;
    property Transparent;
    property Layout;
    property WordWrap;
    property OnClick;
    property OnContextPopup;
    property OnDblClick;
    property OnDragDrop;
    property OnDragOver;
    property OnEndDock;
    property OnEndDrag;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
    property OnMouseEnter;
    property OnMouseLeave;
    property OnStartDock;
    property OnStartDrag;
  end;

procedure Register;

implementation

{ TStrokeLabel }

constructor TCustomStrokeLabel.Create(AOwner : TComponent);
begin
  inherited Create(AOwner);
  fShowAccelChar := True;
  fPathColor := clRed;
end;

function TCustomStrokeLabel.GetLabelText : String;
begin
  Result := Caption;
end;

procedure TCustomStrokeLabel.DoDrawText(var Rect : TRect; Flags : Longint);
var
  Text : String;
begin
  Text := GetLabelText;
  if (Flags and DT_CALCRECT <> 0) and ((Text = '') or FShowAccelChar and
     (Text[1] = '&') and (Text[2] = #0)) then
    Text := Text + ' ';

  if not FShowAccelChar then
    Flags := Flags or DT_NOPREFIX;

  Flags := DrawTextBiDiModeFlags(Flags);
  Canvas.Font := Font;

  if not Enabled then
  begin
    OffsetRect(Rect, 1, 1);
    Canvas.Font.Color := clBtnHighlight;
    DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, Flags);
    OffsetRect(Rect, -1, -1);
    Canvas.Font.Color := clBtnShadow;
    DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, Flags);
  end
  else
  begin
    Canvas.Brush.Style := bsClear;
    Canvas.Pen.Color := fPathColor;
    BeginPath(Canvas.Handle);
    DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, Flags);
    EndPath(Canvas.Handle); 
    Canvas.Brush.Style := bsSolid;
    Canvas.Brush.Color := Canvas.Font.Color;
    StrokeAndFillPath(Canvas.Handle);
  end;
end;

procedure TCustomStrokeLabel.Paint;
const
  Alignments : array[TAlignment] of Word = (DT_LEFT, DT_RIGHT, DT_CENTER);
  WordWraps  : array[Boolean] of Word = (0, DT_WORDBREAK);
var
  Rect, CalcRect : TRect;
  DrawStyle      : Longint;
begin
  with Canvas do
  begin
    if not Transparent then
    begin
      Brush.Color := Self.Color;
      Brush.Style := bsSolid;
      FillRect(ClientRect);
    end;
    Brush.Style := bsClear;
    Rect := ClientRect;
    { DoDrawText takes care of BiDi alignments }
    DrawStyle := DT_EXPANDTABS or WordWraps[FWordWrap] or Alignments[FAlignment];
    { Calculate vertical layout }
    if FLayout <> tlTop then
    begin
      CalcRect := Rect;
      DoDrawText(CalcRect, DrawStyle or DT_CALCRECT);
      if FLayout = tlBottom then
        OffsetRect(Rect, 0, Height - CalcRect.Bottom)
      else
        OffsetRect(Rect, 0, (Height - CalcRect.Bottom) div 2);
    end;
    DoDrawText(Rect, DrawStyle);
  end;
end;

procedure TCustomStrokeLabel.SetAlignment(Value : TAlignment);
begin
  if fAlignment <> Value then
  begin
    fAlignment := Value;
    Invalidate;
  end;
end;

procedure TCustomStrokeLabel.SetShowAccelChar(Value : Boolean);
begin
  if FShowAccelChar <> Value then
  begin
    FShowAccelChar := Value;
    Invalidate;
  end;
end;

function TCustomStrokeLabel.GetPathColor : TColor;
begin
  Result := fPathColor;
end;

procedure TCustomStrokeLabel.SetPathColor(aColor : TColor);
begin
  if fPathColor <> aColor then
  begin
    fPathColor := aColor;
    Invalidate;
  end;
end;

procedure Register;
begin
  RegisterComponents('Samples', [TStrokeLabel]);
end;

end.
stroke_d7.dpk
Код:
package stroke_d7;

{$ALIGN ON}
{$ASSERTIONS ON}
{$BOOLEVAL OFF}
{$DEBUGINFO ON}
{$EXTENDEDSYNTAX ON}
{$IMPORTEDDATA ON}
{$IOCHECKS ON}
{$LOCALSYMBOLS ON}
{$LONGSTRINGS ON}
{$OPENSTRINGS ON}
{$OPTIMIZATION ON}
{$OVERFLOWCHECKS OFF}
{$RANGECHECKS OFF}
{$REFERENCEINFO ON}
{$SAFEDIVIDE OFF}
{$STACKFRAMES OFF}
{$TYPEDADDRESS OFF}
{$VARSTRINGCHECKS ON}
{$WRITEABLECONST ON}
{$MINENUMSIZE 1}
{$IMAGEBASE $400000}
{$DESCRIPTION 'Stroke Label'}
{$IMPLICITBUILD OFF}

requires
  vcl70;

contains
  Stroke in 'Stroke.pas';

end.
stroke_d2009.dpk
Код:
package stroke_d2009;

{$ALIGN ON}
{$ASSERTIONS ON}
{$BOOLEVAL OFF}
{$DEBUGINFO ON}
{$EXTENDEDSYNTAX ON}
{$IMPORTEDDATA ON}
{$IOCHECKS ON}
{$LOCALSYMBOLS ON}
{$LONGSTRINGS ON}
{$OPENSTRINGS ON}
{$OPTIMIZATION ON}
{$OVERFLOWCHECKS OFF}
{$RANGECHECKS OFF}
{$REFERENCEINFO OFF}
{$SAFEDIVIDE OFF}
{$STACKFRAMES OFF}
{$TYPEDADDRESS OFF}
{$VARSTRINGCHECKS ON}
{$WRITEABLECONST ON}
{$MINENUMSIZE 1}
{$IMAGEBASE $400000}
{$DESCRIPTION 'Stroke Label'}
{$IMPLICITBUILD ON}

requires
  rtl,
  vcl;

contains
  stroke in 'stroke.pas';

end.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 25.12.2011 в 03:57.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
Ankor (25.12.2011)
  #20  
Старый 25.12.2011, 02:12
Ankor Ankor вне форума
Новичок
 
Регистрация: 19.08.2011
Сообщения: 68
Версия Delphi: XE2, XE3
Репутация: 10
По умолчанию

Спасибо огромное за труды, правда мне в этом не разобраться(.

Я вот Ваш юнит сделал, вроде без ошибок компилируется, а как всё это хозяйство к Label-ам применить?

Вот если можно, на моём примере покажите пожалуйста, а то я и за пол года не разбирусь.
Вложения
Тип файла: rar stroke1.rar (95.0 Кбайт, 8 просмотров)
Ответить с цитированием
  #21  
Старый 25.12.2011, 02:25
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Ankor
...Я вот Ваш юнит сделал, вроде без ошибок компилируется, а как всё это хозяйство к Label-ам применить? ...
Модуль рабочий, протестирован в Дельфи 7 и 2009. Второй и третий файлы это установщики для соответствующих версий дельфи. Выбирай подходящий и запускай - установится в закладку Samples под названием TStrokeLabel. Использовать точно также как и обычный TLabel, добавлено свойство PathColor, им выставляется цвет обводки текста.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
Ankor (25.12.2011)
  #22  
Старый 25.12.2011, 02:45
Ankor Ankor вне форума
Новичок
 
Регистрация: 19.08.2011
Сообщения: 68
Версия Delphi: XE2, XE3
Репутация: 10
По умолчанию

Ну вроде установил, правда четкой обводки по контуру не получилось.

В любом случае огромное спасибо, наверно как-то допиливать придётся.
Изображения
Тип файла: jpg Stroke1.jpg (5.3 Кбайт, 7 просмотров)
Ответить с цитированием
  #23  
Старый 25.12.2011, 03:34
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Несколько изменил вывод текста, для более чёткой прорисовки. Up.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #24  
Старый 25.12.2011, 17:20
Ankor Ankor вне форума
Новичок
 
Регистрация: 19.08.2011
Сообщения: 68
Версия Delphi: XE2, XE3
Репутация: 10
По умолчанию

Спасибо.

Я тут нашел более крутой компонент, там и ширину тени, и цвета, и много чего можно сразу выставлять, да вот беда, именно нужного свойства - обводки текста по периметру(контуру) там нету.
Наверняка там несложно одну функцию эту добавить, и было бы вообще супер.

Если будет время и желание, посмотрите пожалуйста этот компонент.
Буду признателен.

Текст файла не уместился, поэтому вложение сделал.
Вложения
Тип файла: rar LABEL3DF.rar (2.6 Кбайт, 4 просмотров)

Последний раз редактировалось Ankor, 25.12.2011 в 17:38.
Ответить с цитированием
  #25  
Старый 25.12.2011, 18:25
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Есть совершенно бесплатные и очень симпатишные компоненты AlphaControls. Искомый вами эффект и еще куча всяких вкусностей там есть. Попробуйте.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #26  
Старый 25.12.2011, 21:23
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Ankor
...Я тут нашел более крутой компонент...
Всю крутость весьма легко добавить, смотри как реализуется свойство PathColor, по аналогии добавляйте свои. Дополнительно смотрите как свойства реализуются в Дельфи у разных классов. Если знаний не хватает используйте вариант от Страдалецъ.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #27  
Старый 25.12.2011, 22:07
Ankor Ankor вне форума
Новичок
 
Регистрация: 19.08.2011
Сообщения: 68
Версия Delphi: XE2, XE3
Репутация: 10
По умолчанию

Спасибо и на этом. Вариант AlphaControls мне не подходит.

Кстати Вы последний свой исправленный пример с лучшей чёткостью сами то смотрели?
Там если размер текста Size = 8, то весь текст закрашивается, без всякой обводки, вот я и нашел другой, более навороченный компонент, но это уже не важно.
Сам я врядли конечно сделаю, если спецам даже иногда не удаётся.

Спс за внимание.
Ответить с цитированием
  #28  
Старый 25.12.2011, 22:24
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Конечно смотрел. Беда в том, что используя функцию StrokeAndFillPath, хорошой читабельности можно добиться только при достаточно большом размере шрифта. Увы по-другому она не умеет. Я эту функцию использовал не для TLabel, а когда мне нужно было вывести сообщение привлекающее внимание - достаточно крупное.
P.S. Для маленьких шрифтов я делал не обводку, а тень - с выбором позиции, размера и цвета.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 25.12.2011 в 22:26.
Ответить с цитированием
  #29  
Старый 26.12.2011, 00:45
Ankor Ankor вне форума
Новичок
 
Регистрация: 19.08.2011
Сообщения: 68
Версия Delphi: XE2, XE3
Репутация: 10
По умолчанию

Ну да бог тогда с Вашей функцией, а Вы вот этот модуль можете мне доработать так, чтобы его как компонент (название - LabelF) можно было на делфи установить, со всеми свойствами обычного Label и там несколько новых, которые в модуле?
В какой раздел среды неважно, можно и в вкладку Samples.

Код:
unit LabelShadowUnit;

interface

uses
  SysUtils, Classes, Graphics, Controls, StdCtrls;

type
  TLabel2       = class(TLabel);
  TLabel        = class(TLabel2)
    constructor Create(Owner : TComponent); override;
    destructor Destroy; override; //запуск деструктора
    procedure AddShadow(x: integer = 3; y: integer = 1; colorr : TColor = clBlack);
    procedure AddShadowText(widthh : byte = 1; colorr : TColor = clBlack);
    procedure ClearShadow;
  private
    shad : TList;
  end;

implementation

{ TLabel }

procedure TLabel.AddShadow(x : integer = 3; y : integer = 1; colorr : TColor = clBlack);
var
  sh: TLabel;
begin
  sh := TLabel.Create(self.Owner);
  with sh do
  begin
    WordWrap    := self.WordWrap;
    Alignment   := self.Alignment;
    Autosize    := self.AutoSize;
    Parent      := TWinControl(self.Parent);
    Font        := self.Font;
    Top         := self.Top + y;
    Left        := self.Left + x;
    Width       := self.width;
    Height      := self.Height;
    Font.Color  := colorr;
    Caption     := self.Caption;
    Transparent := True;
  end;
  self.Transparent := True;
  self.BringToFront;
  shad.Add(sh);
end;

procedure TLabel.AddShadowText(widthh: byte; colorr : TColor);
begin
  // прямоугольник
  AddShadow(widthh, 0, colorr);
  AddShadow(-1 * widthh, 0, colorr);
  AddShadow(0, widthh, colorr);
  AddShadow(0, -1 * widthh, colorr);
  // по бокам
  AddShadow(widthh, widthh, colorr);
  AddShadow(-1 * widthh, -1 * widthh, colorr);
  AddShadow(-1 * widthh, widthh, colorr);
  AddShadow(widthh, -1 * widthh, colorr);
end;

procedure TLabel.ClearShadow;
var
  I : Integer;
begin
  for I := 0 to shad.Count - 1 do
    TLabel(shad[i]).Destroy;
  shad.Clear;
end;

constructor TLabel.Create(Owner : TComponent);
begin
  inherited Create(Owner);
  shad := TList.Create;
end;

destructor TLabel.Destroy;
var
  I : Integer;
begin
  for I := 0 to shad.Count - 1 do
    TLabel(shad[i]).Destroy;
  shad.Destroy;
  inherited Destroy;
end;

end.

Последний раз редактировалось Ankor, 26.12.2011 в 01:03.
Ответить с цитированием
  #30  
Старый 26.12.2011, 01:57
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Добавь в модуль
Код:
procedure Register;
begin
  RegisterComponents('Additional', [TShadowLabel]);
end;
А потом Component-Install Component, выбираешь Into New Package, указываешь путь к юниту, имя, описание, жмешь Ok

Последний раз редактировалось YVitaliy, 19.04.2012 в 00:35.
Ответить с цитированием
Этот пользователь сказал Спасибо YVitaliy за это полезное сообщение:
Ankor (26.12.2011)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:06.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter