Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.07.30;
Скачать: [xml.tar.bz2];

Вниз

Координаты буквы   Найти похожие ветки 

 
Quattro ©   (2006-07-07 01:34) [0]

Доброй ночи! Подскажите, пожалуйста, а как узнать координаты буквы на, допустим, лэйбле, чтобы заменить её этой же буквой, только другого цвета?..


 
KilkennyCat ©   (2006-07-07 02:09) [1]

Это очень и очень странный способ...
Но если хочется - винапишный DrawText с флагом DT_CALCRECT


 
Quattro ©   (2006-07-07 02:20) [2]

хм.....есть способ проще?


 
Германн ©   (2006-07-07 02:29) [3]


> м.....есть способ проще?

А для чего?
Опиши нормально задачу. А то пока что "малопонятно" - "я хочу сделать программу,  в которой реализовано действо разноцветной, бегающей буквы...с помощью TextOut научился рисовать...дело за малым осталось :)."
Где, кто и как "бегает" и какое "действо" делает?


 
KilkennyCat ©   (2006-07-07 03:06) [4]

Во, наваял наспех :))))

unit ccLabel;

interface

uses Windows, SysUtils, Classes, Controls, StdCtrls, Dialogs, Graphics, Messages;

type

 TCCLabel = class(TLabel)
 private
   { Private declarations }
 protected
   { Protected declarations }
 public
   { Public declarations }
   FColor : TColor;
   FPos : integer;
   procedure paint; override;
 published
   { Published declarations }
   property ColorChar : TColor read FColor write FColor default clRed;
   property PositionChar : integer read FPos write FPos default 1;
 end;

procedure Register;

implementation

procedure TCCLabel.paint;
const
 Alignments: array[TAlignment] of Word = (DT_LEFT, DT_RIGHT, DT_CENTER);
 WordWraps: array[Boolean] of Word = (0, DT_WORDBREAK);
var
 Rect, CalcRect, CalcRect1: TRect;
 Flags: Longint;

begin
 with Canvas do begin
   Flags := DrawTextBiDiModeFlags(DT_EXPANDTABS or WordWraps[WordWrap] or Alignments[Alignment]);
   Font := Font;
   if not Transparent then begin
     Brush.Color := Self.Color;
     Brush.Style := bsSolid;
     FillRect(ClientRect);
   end;
   Brush.Style := bsClear;
   Rect := ClientRect;
   if Layout <> tlTop then begin
     CalcRect := Rect;
     DrawText(Canvas.Handle, PChar(Caption), Length(Caption), CalcRect, DT_CALCRECT);
     if Layout = tlBottom then OffsetRect(Rect, 0, Height - CalcRect.Bottom)
     else OffsetRect(Rect, 0, (Height - CalcRect.Bottom) div 2);
   end;
   if not Enabled then begin
     OffsetRect(Rect, 1, 1);
     Canvas.Font.Color := clBtnHighlight;
     DrawText(Canvas.Handle, PChar(Caption), Length(Caption), Rect, Flags);
     OffsetRect(Rect, -1, -1);
     Canvas.Font.Color := clBtnShadow;
     DrawText(Canvas.Handle, PChar(Caption), Length(Caption), Rect, Flags);
   end else begin
     DrawText(Canvas.Handle, PChar(Caption), Length(Caption), Rect, Flags);
     DrawText(Canvas.Handle, PChar(copy(Caption, 1, PositionChar)), PositionChar - 1, CalcRect, DT_CALCRECT);
     Canvas.Font.Color := ColorChar;
     OffsetRect(Rect, CalcRect.Right, 0);
     DrawText(Canvas.Handle, PChar(copy(Caption, PositionChar, 1)), 1, Rect, Flags);
   end;
 end;
end;

procedure Register;
begin
 RegisterComponents("CCLabel", [TCCLabel]);
end;

end.


 
KilkennyCat ©   (2006-07-07 03:10) [5]

странно... хотел код включить, а вышел курсив....
добавлю комментарий:
property ColorChar  устанавливает цвет буквы
property PositionChar выбирает позицию буквы (в коде нет проверки корректности!)

Procedure paint передрана из генофонда. добавлено лишь

DrawText(Canvas.Handle, PChar(copy(Caption, 1, PositionChar)), PositionChar - 1, CalcRect, DT_CALCRECT);
Canvas.Font.Color := ColorChar;
OffsetRect(Rect, CalcRect.Right, 0);
DrawText(Canvas.Handle, PChar(copy(Caption, PositionChar,1)), 1, Rect, Flags);
что и является вычислением буквы и заменой :))


 
KilkennyCat ©   (2006-07-07 03:13) [6]

и верхнюю строчку можно упростить до
DrawText(Canvas.Handle, PChar(Caption), PositionChar - 1, CalcRect, DT_CALCRECT);


 
KilkennyCat ©   (2006-07-07 03:25) [7]

гм... и еще надо добавить возвращенияе цвета фонта...


 
Quattro ©   (2006-07-07 03:31) [8]


> А для чего?

Допустим есть надпись "ЛЕНИН ЖИВ!"...хочу чтобы одна буква была другого цвета (допустим красного) и чтобы этот цвет в каждый момент времени подсвечивал следующую по порядку в слове букву...к примеру, в момент 1 буква Л красная..в момент 2 уже буква Е красная, а буква Л приобрела родной черный цвет..и так далее :)..вот что то наколупал, прошу сделать резонные замечания :)

procedure TForm1.FormCreate(Sender: TObject);
begin
 x:=0;\\координата буквы по Х
 z:=0;\\номер буквы в слове
 y:=10;\\координата буквы по Y
 e:=0;\\переменная для запоминания координаты предыдущей буквы
end;

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
if Key = VK_RETURN then
  begin
    for z:=1 to Length(Edit1.Text) do
      begin
        Label1.Canvas.TextOut(x,y,Edit1.Text[z]); // вручную рисуем надпись с    учетом пробела между буквами
        x:=x+Label1.Canvas.TextWidth(Edit1.Text[z])+10;\\10 - это мой,               самопальный, межбуквенный пробел
      end;
    x:=0;
    z:=0;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 Timer1.Enabled:= not Timer1.Enabled;\\Запускаем таймер
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
z:=z + 1;
if z > Length(Edit1.Text) then
  begin
    Label1.Canvas.Font.Color:=clBlack;
    Label1.Canvas.TextOut(e,y,Edit1.Text[z-1]);\\Делаем черной последнюю букву
    z:= 1;
    x:=0;
    e:=0;
  end;
if z = 1 then
  begin
    Label1.Canvas.Font.Color:=clRed;
    Label1.Canvas.TextOut(x,y,Edit1.Text[z]);
    e:=x; //Запоминаем координату по Х предыдущей буквы
    x:=x+Label1.Canvas.TextWidth(Edit1.Text[z])+10;
    Exit;
  end;
Label1.Canvas.Font.Color:=clBlack;
Label1.Canvas.TextOut(e,y,Edit1.Text[z-1]);
Label1.Canvas.Font.Color:=clRed;
Label1.Canvas.TextOut(x,y,Edit1.Text[z]);
e:=x;
x:=x+Label1.Canvas.TextWidth(Edit1.Text[z])+10; // 10 - это пробел между буквами
end;


 
Quattro ©   (2006-07-07 03:34) [9]


> KilkennyCat ©   (07.07.06 03:06) [4]

что то сложновато, не находите?:)


 
KilkennyCat ©   (2006-07-07 03:38) [10]


> [8] Quattro ©   (07.07.06 03:31)


есть у меня сомнения, что TextWidth врет, скажем, на курсиве...

вот так должен выглядеть последний кусок CCLabel:

DrawText(Canvas.Handle, PChar(Caption), Length(Caption), Rect, Flags);
     DrawText(Canvas.Handle, PChar(Caption),  PositionChar - 1, CalcRect, DT_CALCRECT);
     oldcolor := Canvas.Font.Color;
     Canvas.Font.Color := ColorChar;
     OffsetRect(Rect, CalcRect.Right, 0);
     DrawText(Canvas.Handle, PChar(copy(Caption, PositionChar, 1)), 1, Rect, Flags);
     Canvas.Font.Color := oldColor;


http://www.a-cons.com/111.zip - это я наваял , на основе CCLabel (150 кил весит примерно)

исходник:
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ccLabel, ExtCtrls;

type
 TForm1 = class(TForm)
   CCLabel1: TCCLabel;
   Timer1: TTimer;
   procedure Timer1Timer(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 z : integer;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 if CCLabel1.PositionChar + 1 > length(CCLabel1.Caption) then z := -1 else if CCLabel1.PositionChar - 1 = 0 then z := 1;
 CCLabel1.PositionChar := CCLabel1.PositionChar + z;
 cclabel1.Paint;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 CCLabel1.ColorChar := clRed;
 CCLabel1.PositionChar := 1;
 z := 1;
 timer1.Enabled := true;
end;

end.


 
KilkennyCat ©   (2006-07-07 03:43) [11]

> [9] Quattro ©   (07.07.06 03:34)


Угу. но я исходил именно: использование TLabel, определение координат буквы, замена ее другим цветом. То есть, исходил из ТЗ сабжа.

Если исходить из конкретно Вашей задачи, "бегущей" буквы, то я бы вообще не стал применять TLabel...


 
KilkennyCat ©   (2006-07-07 03:45) [12]

К тому же у меня получился компонент, что удобно, а у Вас - кусок кода в теле программы, что неудобно (достаточно сравнить мой исходник основной программы и Ваш).


 
KilkennyCat ©   (2006-07-07 03:58) [13]

что касается Вашего кода:
Он не работает....
вероятно, не весь опубликован?
Ибо, у меня не произошло инициализация Label1 - надпись не изменилась...


 
KilkennyCat ©   (2006-07-07 04:12) [14]

if z = 1 then
 begin
   Label1.Canvas.Font.Color:=clRed;
   Label1.Canvas.TextOut(x,y,Edit1.Text[z]);
   e:=x;
   x:=x+Label1.Canvas.TextWidth(Edit1.Text[z])+10;
   Exit;
 end;
Label1.Canvas.Font.Color:=clBlack;
Label1.Canvas.TextOut(e,y,Edit1.Text[z-1]);


видите жирное? это состояние z. если посчитать, то в последней строке оно становится равным нулю. Вследствие чего вместо первой буквы, вероятно, будет квадратик...


 
Quattro ©   (2006-07-07 12:44) [15]


> видите жирное? это состояние z. если посчитать, то в последней
> строке оно становится равным нулю. Вследствие чего вместо
> первой буквы, вероятно, будет квадратик...

если z=1 то до последней строки дело не дойдет...произойдет  выход из процедуры

if z = 1 then
begin
  Label1.Canvas.Font.Color:=clRed;
  Label1.Canvas.TextOut(x,y,Edit1.Text[z]);
  e:=x;
  x:=x+Label1.Canvas.TextWidth(Edit1.Text[z])+10;
  Exit;
end;


 
Quattro ©   (2006-07-07 12:58) [16]


> что касается Вашего кода:
> Он не работает....
> вероятно, не весь опубликован?
> Ибо, у меня не произошло инициализация Label1 - надпись
> не изменилась..

Вот весь код..у меня работает.....

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ExtCtrls;

type
 TForm1 = class(TForm)
   Label1: TLabel;
   Button1: TButton;
   Timer1: TTimer;
   Edit1: TEdit;
   procedure FormCreate(Sender: TObject);
   procedure Edit1KeyDown(Sender: TObject; var Key: Word;
     Shift: TShiftState);
   procedure Button1Click(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
 private
   { Private declarations }

 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 x,y,z,e,a:Integer;
 TimerFlag:Boolean;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
x:=0; //Координата Х
z:=0; //Номер буквы в слове
y:=10; //Координата Y
e:=0; // Для запоминания коорд. Х предыдущей буквы
a:=0; // Для запоминания коорд. Y предыдущей буквы
TimerFlag:=False;
end;

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
if Key = VK_RETURN then
  begin
    x:=0;
    y:=0;
    Label1.Canvas.Brush.Color:=clBtnFace;
    Label1.Canvas.FillRect(Canvas.ClipRect);
    if TimerFlag then
      begin
        Timer1.Enabled:=False;
        x:=0;
        y:=0;
        e:=0;
        z:=0;
      end;
    for z:=1 to Length(Edit1.Text) do
      begin
        Label1.Canvas.Font.Color:=clBlack;
        Label1.Canvas.TextOut(x,y,Edit1.Text[z]); // вручную рисуем надпись, с учётом пробела м/у буквами
        x:=x+Label1.Canvas.TextWidth(Edit1.Text[z])+15;//15-это мой пробел м/у буквами
        if x+24 > Label1.Width then
          begin
            x:=0;
            y:=y + 40;
          end;
      end;
    x:=0;
    z:=0;
    y:=0;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Timer1.Enabled:= not Timer1.Enabled;
 TimerFlag:= true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
z:=z + 1;
if z > Length(Edit1.Text) then
  begin
    Label1.Canvas.Font.Color:=clBlack;
    Label1.Canvas.TextOut(e,a,Edit1.Text[z-1]); //меняем цвет последней буквы на родной
    z:= 1;
    x:=0;
    e:=0;
    a:=0;
    y:=0;
  end;
if z = 1 then
  begin
    Label1.Canvas.Font.Color:=clRed;
    Label1.Canvas.TextOut(x+5,y-3,Edit1.Text[z]);
    e:=x; //Запоминаем координату Х предыд. буквы
    a:=y; //Запоминаем координату Y предыд. буквы
    x:=x+Label1.Canvas.TextWidth(Edit1.Text[z])+10;
    Exit;
  end;
Label1.Canvas.Font.Color:=clBlack;
Label1.Canvas.TextOut(e,a,Edit1.Text[z-1]);
Label1.Canvas.Font.Color:=clRed;
Label1.Canvas.TextOut(x+3,y-3,Edit1.Text[z]);
e:=x; //Запоминаем координату Х предыд. буквы
a:=y; //Запоминаем координату Y предыд. буквы
x:=x+Label1.Canvas.TextWidth(Edit1.Text[z])+15; // 15 - мой пробел м/у буквами
if x+24 > Label1.Width then
  begin
    x:=0;
    y:=y + 40;
  end;
end;

end.


 
Quattro ©   (2006-07-07 13:10) [17]

(x + 5) и (y - 3) это служит для эффекта подпрыгивания буквы...на 24 - шрифте работало :)
Label1.Canvas.TextOut(x+5,y-3,Edit1.Text[z]);
Здесь + 15 вместо +10 - опечатка вышла :)
x:=x+Label1.Canvas.TextWidth(Edit1.Text[z])+10;


 
Quattro ©   (2006-07-07 13:17) [18]

у меня в лэйбле был 24 шрифт, жирный курсив



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.07.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.012 c
1-1150257710
xex32
2006-06-14 08:01
2006.07.30
Как принять штрих код со сканера Eclipse в компонент TEdit


2-1152531219
zdm
2006-07-10 15:33
2006.07.30
TPageControl


1-1150728345
DJuce
2006-06-19 18:45
2006.07.30
Проверить путь к файлу - сетевой или локальный?


2-1152181187
Quattro
2006-07-06 14:19
2006.07.30
Ширина символа


15-1151432483
JUS
2006-06-27 22:21
2006.07.30
Модераторам





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский