Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по отрисовке текста при TLabel.Enabled=false


denkop ©   (2011-08-29 15:02:00) 

Возникла необходимость при TLabel.Enabled=false видеть текст такой как при TLabel.Enabled=True. Проблема в том, чтобы TLabel который будет лежать на TImage мешает работать событиям onmousemove onmouseenter onmouseleave. Если поставить TLabel.Enabled=false, всё происходит как надо за исключением того что текст становится неактивным.. Нашёл статью как нарисовать неактивный произвольный текст: http://demi-s.narod.ru/other/067.htmlя так понимаю что TLabel тоже где то имеет вызов DrawState(...) Порывшись в исходниках TLabel, не нашёл нигде вызова это процедуры, очень хочется убрать оттуда DSS_DISABLED когда у TLabel.Enabled=false.. Подскажите пож, как решить проблему?


Омлет   (2011-08-30 10:36:00) [1]

Проблема - в неверном выборе способа решения задачи. И, боюсь, она не решена.


denkop   (2011-08-29 16:28:00) [2]

unit ButtonLabel;

interface

uses
 SysUtils, Classes, Controls, StdCtrls, Types, Windows, Graphics;

type
 TButtonLabel = class(TLabel)
 private
   { Private declarations }
 protected
   { Protected declarations }
   procedure DoDrawText(var Rect: TRect; Flags: Longint); override;
 public
   { Public declarations }
 published
   { Published declarations }
 end;

procedure Register;

implementation

procedure Register;
begin
 RegisterComponents('Standard', [TButtonLabel]);
end;

procedure TButtonLabel.DoDrawText(var Rect: TRect; Flags: Integer);
const
 EllipsisStr = '...';
 Ellipsis: array[TEllipsisPosition] of Longint = (0, DT_PATH_ELLIPSIS,
   DT_END_ELLIPSIS, DT_WORD_ELLIPSIS);
var
 Text, DText: string;
 NewRect: TRect;
 Height, Delim: Integer;
begin
 Text := GetLabelText;
 if (Flags and DT_CALCRECT 0) and
    ((Text = '') or ShowAccelChar and (Text[1] = '&') and (Length(Text) = 1)) then
   Text := Text + ' ';

 if Text '' then
 begin
   if not ShowAccelChar then Flags := Flags or DT_NOPREFIX;
   Flags := DrawTextBiDiModeFlags(Flags);
   Canvas.Font := Font;
   if (EllipsisPosition epNone) and not AutoSize then
   begin
     DText := Text;
     Flags := Flags and not DT_EXPANDTABS;
     Flags := Flags or Ellipsis[EllipsisPosition];
     if WordWrap and (EllipsisPosition in [epEndEllipsis, epWordEllipsis]) then
     begin
       repeat
         NewRect := Rect;
         Dec(NewRect.Right, Canvas.TextWidth(EllipsisStr));
         DrawText(Canvas.Handle, DText, Length(DText), NewRect, Flags or DT_CALCRECT);
         Height := NewRect.Bottom - NewRect.Top;
         if (Height > ClientHeight) and (Height > Canvas.Font.Height) then
         begin
           Delim := LastDelimiter(' '#9, Text);
           if Delim = 0 then
             Delim := Length(Text);
           Dec(Delim);
 {$IF NOT DEFINED(CLR)}
           if ByteType(Text, Delim) = mbLeadByte then
             Dec(Delim);
 {$IFEND}
           Text := Copy(Text, 1, Delim);
           DText := Text + EllipsisStr;
           if Text = '' then
             Break;
         end else
           Break;
       until False;
     end;
     if Text '' then
       Text := DText;
   end;
   DrawText(Canvas.Handle, Text, Length(Text), Rect, Flags);
 end;
end;

end.


denkop   (2011-08-29 16:28:00) [3]

проблема решена!


И. Павел   (2011-08-29 15:22:00) [4]

Можно использовать вместо TLabel компонент TPanel без бордюров. Текст на нем всегда остается одного цвета и при Panel.enabled=false он не будет мещать приемом событий. Можно разместить на нем и Label - если Panel.Enabled = false, Label не сменит цвет.


Наверх

Титульная страница Поиск, карта сайта Написать письмо