delphi4arab منتديات دلفي للعرب
مشكل في تلوين خط RadioButton في الدلفي xe - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15)
+--- الموضوع : مشكل في تلوين خط RadioButton في الدلفي xe (/showthread.php?tid=6665)



مشكل في تلوين خط RadioButton في الدلفي xe - zozosoft - 29-12-2014

السلام عليكم ورحمة الله وبركاته

وجدت مشكل في تلوين خط RadioButton في الدلفي xe6

عند الذهاب إلى الخصائص وبالضبط Font ثم color وتغييره إلى لون آخر لا يتغير شيئ.


مشكل في تلوين خط RadioButton في الدلفي xe - SMP3 - 29-12-2014

عند استخدام ال windows visual styles لا يمكنك أن تغير اللون الا عن طريق OwnerDraw أو اعادة رسم المكون .
PHP كود :
unit ColoredRadioButton;
//By SMP3.

interface

uses
  WinApi
.Windows,
  
WinApi.Messages,
  
System.Classes,
  
Vcl.Graphics,
  
Vcl.StdCtrls,
  
Vcl.Styles,
  
Vcl.Themes;

type
  TRadioButton 
= class(Vcl.StdCtrls.TRadioButton)
  private
    
FMouseDown: Boolean;
  protected
    
procedure WndProc(var Message: TMessage); override;
    
procedure PaintRadioButton(Canvas: TCanvas);
  
end;

implementation

{ TRadioButton }

function 
RectVCenter(var R: TRect; Bounds: TRect): TRect;
begin
  OffsetRect
(R, -R.Left, -R.Top);
  
OffsetRect(R, 0, (Bounds.Height - R.Height) div 2);
  
OffsetRect(R, Bounds.Left, Bounds.Top);
  
Result := R;
end;

procedure TRadioButton.PaintRadioButton(Canvas: TCanvas);
var
  
LDetails: TThemedElementDetails;
  
DC: HDC;
  
LRect: TRect;
  
Detail: TThemedButton;
  
TxtRect, BoxRect: TRect;
  
Size: TSize;
  
procedure DrawCheckBoxText(DC: HDC; Text: String; LDetails: TThemedElementDetails; R: TRect);
  var
    
TextFormat: Cardinal;
  
begin
    TextFormat 
:= DT_VCENTER or DT_HIDEPREFIX;
    if 
WordWrap then
      TextFormat 
:= TextFormat or DT_WORDBREAK
    
else
      
TextFormat := TextFormat or DT_SINGLELINE;
    if 
Alignment = taLeftJustify then
      TextFormat 
:= TextFormat or DT_RIGHT
    
else if Alignment = taRightJustify then
      TextFormat 
:= TextFormat or DT_LEFT
    
else
      
TextFormat := TextFormat or DT_CENTER;

    if 
Font.Color < 0 then
      Font
.Color := clBlack;
    
SetTextColor(DC, Font.Color);
    
DrawText(DC, Text, -1, R, TextFormat);
  
end;

begin
  DC 
:= Canvas.Handle;
  
LRect := ClientRect;
  
Canvas.Brush.Color := Color;
  
Canvas.FillRect(LRect);
  if 
Enabled then
    Detail 
:= tbRadioButtonUncheckedNormal
  
else
    
Detail := tbRadioButtonUncheckedDisabled;
  if 
FMouseDown then
    Detail 
:= tbRadioButtonUncheckedPressed
  
else if MouseInClient then
    Detail 
:= tbRadioButtonUncheckedHot;

  if 
Checked then
    Detail 
:= TThemedButton(Integer(Detail) + 4);

  
Size.cx := GetSystemMetrics(SM_CXMENUCHECK);
  
Size.cy := GetSystemMetrics(SM_CYMENUCHECK);

  
LDetails := StyleServices.GetElementDetails(Detail);
  
BoxRect := Rect(0, 0, Size.cx, Size.cy);
  
RectVCenter(BoxRect, LRect);

  if 
BiDiMode = bdRightToLeft then
  begin
    BoxRect
.Left := LRect.Right - BoxRect.Width - 2;
    
BoxRect.Right := LRect.Right;
    
TxtRect := Rect(LRect.Left + 1, LRect.Top, BoxRect.Left, LRect.Bottom);
  
end
  
else
  
begin
    OffsetRect
(BoxRect, 1, 0);
    
TxtRect := Rect(BoxRect.Right + 2, LRect.Top, LRect.Right, LRect.Bottom);
  
end;

  
StyleServices.DrawElement(DC, LDetails, BoxRect);

  if 
Focused then
    Canvas
.DrawFocusRect(LRect);

  
DrawCheckBoxText(DC, Caption, LDetails, TxtRect);
end;

procedure TRadioButton.WndProc(var Message: TMessage);
var
  
ps: TPaintStruct;
  
Canvas: TCanvas;
begin
  
case Message.Msg of
    WM_LBUTTONUP
, WM_CREATE:
      
begin
        FMouseDown 
:= False;
      
end;
    
WM_LBUTTONDOWN:
      
begin
        FMouseDown 
:= True;
      
end;
    
WM_PAINT:
      
begin
        BeginPaint
(Handle, ps);
        
Canvas := TCanvas.Create;
        
Canvas.Handle := ps.HDC;
        
PaintRadioButton(Canvas);
        
Canvas.Free;
        
EndPaint(Handle, ps);
        Exit;
      
end;
  
end;
  
inherited;
end;

end. 
تأكد من استعمال الوحدة ColoredRadioButton بعد الوحدة Vcl.StdCtrls في قسم ال uses :
PHP كود :
uses 
...,Vcl.StdCtrls,ColoredRadioButton; 



مشكل في تلوين خط RadioButton في الدلفي xe - zozosoft - 31-12-2014

شكرا لك أخي.
تم تغيير اللون بنجاح