2007-08-09 21:36:59 +00:00
|
|
|
unit tooledit;
|
|
|
|
|
|
|
|
{$I rx.inc}
|
|
|
|
|
|
|
|
interface
|
|
|
|
|
|
|
|
uses
|
|
|
|
Classes, SysUtils, LCLType, LMessages, Graphics, MaskEdit, Controls;
|
|
|
|
|
|
|
|
|
|
|
|
function PaintComboEdit(Editor: TCustomMaskEdit; const AText: string;
|
|
|
|
AAlignment: TAlignment; StandardPaint: Boolean;
|
|
|
|
var ACanvas: TControlCanvas; var Message: TLMPaint): Boolean;
|
|
|
|
function EditorTextMargins(Editor: TCustomMaskEdit): TPoint;
|
|
|
|
|
|
|
|
implementation
|
|
|
|
uses lclintf;
|
|
|
|
|
|
|
|
function EditorTextMargins(Editor: TCustomMaskEdit): TPoint;
|
|
|
|
var
|
|
|
|
DC: HDC;
|
|
|
|
SaveFont: HFont;
|
|
|
|
I: Integer;
|
|
|
|
SysMetrics, Metrics: TTextMetric;
|
|
|
|
begin
|
|
|
|
with Editor do
|
|
|
|
begin
|
|
|
|
if NewStyleControls then
|
|
|
|
begin
|
|
|
|
if BorderStyle = bsNone then
|
|
|
|
I := 0
|
|
|
|
else
|
|
|
|
{ if Ctl3D then
|
|
|
|
I := 1
|
|
|
|
else}
|
|
|
|
I := 2;
|
|
|
|
Result.X := {SendMessage(Handle, LM_GETMARGINS, 0, 0) and $0000FFFF} + I;
|
|
|
|
Result.Y := I;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
if BorderStyle = bsNone then
|
|
|
|
I := 0
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
DC := GetDC(0);
|
|
|
|
GetTextMetrics(DC, SysMetrics);
|
|
|
|
SaveFont := SelectObject(DC, Font.Handle);
|
|
|
|
GetTextMetrics(DC, Metrics);
|
|
|
|
SelectObject(DC, SaveFont);
|
|
|
|
ReleaseDC(0, DC);
|
|
|
|
I := SysMetrics.tmHeight;
|
|
|
|
if I > Metrics.tmHeight then
|
|
|
|
I := Metrics.tmHeight;
|
|
|
|
I := I div 4;
|
|
|
|
end;
|
|
|
|
Result.X := I;
|
|
|
|
Result.Y := I;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
function PaintComboEdit(Editor: TCustomMaskEdit; const AText: string;
|
|
|
|
AAlignment: TAlignment; StandardPaint: Boolean;
|
|
|
|
var ACanvas: TControlCanvas; var Message: TLMPaint): Boolean;
|
|
|
|
var
|
|
|
|
AWidth, ALeft: Integer;
|
|
|
|
Margins: TPoint;
|
|
|
|
R: TRect;
|
|
|
|
DC: HDC;
|
|
|
|
PS: TPaintStruct;
|
|
|
|
S: string;
|
|
|
|
{$IFDEF RX_D4}
|
|
|
|
ExStyle: DWORD;
|
|
|
|
const
|
|
|
|
AlignStyle: array[Boolean, TAlignment] of DWORD =
|
|
|
|
((WS_EX_LEFT, WS_EX_RIGHT, WS_EX_LEFT),
|
|
|
|
(WS_EX_RIGHT, WS_EX_LEFT, WS_EX_LEFT));
|
|
|
|
{$ENDIF}
|
|
|
|
begin
|
|
|
|
Result := True;
|
|
|
|
with Editor do
|
|
|
|
begin
|
|
|
|
{$IFDEF RX_D4}
|
|
|
|
// if UseRightToLeftAlignment then ChangeBiDiModeAlignment(AAlignment);
|
|
|
|
{$ENDIF}
|
|
|
|
if StandardPaint and not(csPaintCopy in ControlState) then
|
|
|
|
begin
|
|
|
|
{$IFDEF RX_D4}
|
|
|
|
(* if SysLocale.MiddleEast and HandleAllocated and (IsRightToLeft) then
|
|
|
|
begin { This keeps the right aligned text, right aligned }
|
|
|
|
ExStyle := DWORD(GetWindowLong(Handle, GWL_EXSTYLE)) and (not WS_EX_RIGHT) and
|
|
|
|
(not WS_EX_RTLREADING) and (not WS_EX_LEFTSCROLLBAR);
|
|
|
|
if UseRightToLeftReading then
|
|
|
|
ExStyle := ExStyle or WS_EX_RTLREADING;
|
|
|
|
if UseRightToLeftScrollbar then
|
|
|
|
ExStyle := ExStyle or WS_EX_LEFTSCROLLBAR;
|
|
|
|
ExStyle := ExStyle or
|
|
|
|
AlignStyle[UseRightToLeftAlignment, AAlignment];
|
|
|
|
if DWORD(GetWindowLong(Handle, GWL_EXSTYLE)) <> ExStyle then
|
|
|
|
SetWindowLong(Handle, GWL_EXSTYLE, ExStyle);
|
|
|
|
end; *)
|
|
|
|
{$ENDIF RX_D4}
|
|
|
|
Result := False;
|
|
|
|
{ return false if we need to use standard paint handler }
|
|
|
|
Exit;
|
|
|
|
end;
|
|
|
|
{ Since edit controls do not handle justification unless multi-line (and
|
|
|
|
then only poorly) we will draw right and center justify manually unless
|
|
|
|
the edit has the focus. }
|
|
|
|
if ACanvas = nil then
|
|
|
|
begin
|
|
|
|
ACanvas := TControlCanvas.Create;
|
|
|
|
ACanvas.Control := Editor;
|
|
|
|
end;
|
|
|
|
DC := Message.DC;
|
2007-08-10 22:15:51 +00:00
|
|
|
if DC = 0 then DC := BeginPaint(Handle, PS);
|
2007-08-09 21:36:59 +00:00
|
|
|
ACanvas.Handle := DC;
|
|
|
|
try
|
|
|
|
ACanvas.Font := Font;
|
|
|
|
if not Enabled and NewStyleControls and not
|
|
|
|
(csDesigning in ComponentState) and
|
|
|
|
(ColorToRGB(Color) <> ColorToRGB(clGrayText)) then
|
|
|
|
ACanvas.Font.Color := clGrayText;
|
|
|
|
with ACanvas do
|
|
|
|
begin
|
|
|
|
R := ClientRect;
|
|
|
|
if not (NewStyleControls {and Ctl3D}) and (BorderStyle = bsSingle) then
|
|
|
|
begin
|
|
|
|
Brush.Color := clWindowFrame;
|
2007-08-10 22:15:51 +00:00
|
|
|
{ FrameRect(R);
|
|
|
|
InflateRect(R, -1, -1);}
|
2007-08-09 21:36:59 +00:00
|
|
|
end;
|
|
|
|
Brush.Color := Color;
|
|
|
|
S := AText;
|
|
|
|
AWidth := TextWidth(S);
|
|
|
|
Margins := EditorTextMargins(Editor);
|
|
|
|
{ if PopupVisible then
|
|
|
|
ALeft := Margins.X
|
|
|
|
else
|
|
|
|
begin}
|
|
|
|
// if ButtonWidth > 0 then Inc(AWidth);
|
|
|
|
case AAlignment of
|
|
|
|
taLeftJustify:
|
|
|
|
ALeft := Margins.X;
|
|
|
|
taRightJustify:
|
|
|
|
ALeft := ClientWidth {- ButtonWidth} - AWidth - Margins.X - 2;
|
|
|
|
else
|
|
|
|
ALeft := (ClientWidth {- ButtonWidth} - AWidth) div 2;
|
|
|
|
end;
|
|
|
|
{ end;}
|
|
|
|
{$IFDEF RX_D4}
|
|
|
|
if SysLocale.MiddleEast then UpdateTextFlags;
|
|
|
|
{$ENDIF}
|
2007-08-10 22:15:51 +00:00
|
|
|
Brush.Style := bsClear;
|
2007-08-09 21:36:59 +00:00
|
|
|
TextRect(R, ALeft, Margins.Y, S);
|
|
|
|
end;
|
|
|
|
finally
|
|
|
|
ACanvas.Handle := 0;
|
|
|
|
if Message.DC = 0 then EndPaint(Handle, PS);
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
end.
|
|
|
|
|