![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по отрисовке текста при 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 не сменит цвет.