자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Delphi [마이그레이션] 델파이 XE8에서 체크박스, 라디오버튼의 글자의 색상을 변경하고 싶어요.
2015.06.10 02:33
Q.
[VCL] 델파이 XE8에서 체크박스, 라디오버튼의 글자의 색상을 변경하고 싶어요.
A.
VCL 스타일 적용이후 체크박스, 라디오버튼의 글자 색상(Font.Color)이 적용되지 않습니다.
다음 코드를 통해 글자 색상을 적용할 수 있습니다.
1, 새로운 유닛(Vcl.StdCtrls.Ext)을 추가하고, WMPaint, Paint 메소드 오버라이딩 한 클래스를 작성합니다.
unit Vcl.StdCtrls.Ext;
interface
uses
System.Classes, Winapi.Windows, Winapi.Messages,
Vcl.StdCtrls, Vcl.Controls, Vcl.DBCtrls, Vcl.Graphics;
type
http://stackoverflow.com/questions/2356431/how-can-you-change-the-font-color-of-a-theme-enabled-control
TCheckBox = class(Vcl.StdCtrls.TCheckBox)
private
procedure WMPaint(var msg: TWMPaint); message WM_PAINT;
end;
// http://www.delphigroups.info/2/95/170811.html
TDBText = class(Vcl.DBCtrls.TDBText)
protected
procedure Paint; override;
end;
implementation
{ TCheckBox }
procedure TCheckBox.WMPaint(var msg: TWMPaint);
var
BtnWidth: Integer;
canv: TControlCanvas;
begin
BtnWidth := GetSystemMetrics(SM_CXMENUCHECK);
inherited;
canv := TControlCanvas.Create;
try
canv.Control := Self;
canv.Font := Font;
SetBkMode(canv.Handle, Ord(TRANSPARENT));
canv.TextOut(BtnWidth + 1, 2, Caption);
finally
canv.Free;
end;
end;
{ TDBText }
procedure TDBText.Paint;
var
InitChar : char;
begin
Canvas.Brush.Color := Color;
Canvas.FillRect(Canvas.ClipRect); // paint the background color ...
inherited Paint;
end;
end.
2, 폼의 interface uses 절 마지막에 위 유닛을 추가합니다.uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf, FireDAC.DApt.Intf, FireDAC.Stan.StorageBin, Vcl.DBCtrls, Data.DB, FireDAC.Comp.DataSet, FireDAC.Comp.Client, Vcl.StdCtrls.Ext;
위의 작업을 간단하게 설명하면, TCheckBox는 Vcl.StdCtrls에 선언되어 있습니다.Vcl.StdCtrls.Ext.pas에는 Vcl.StdCtrls의 TCheckBox를 상속받아 동일한 클래스를 작성했습니다.폼 유닛에서는 uses절의 마지막에 Vcl.StdCtrls.Ext를 추가했습니다.uses절은 마지막의 유닛부터 참조하기 때문에 TCheckBox 컴포넌트는 Vcl.StdCtrls.Ext.pas의 TCheckBox 클래스를 이용해 컴포넌트를 생성합니다.
위 내용을 참고하면 기본 컴포넌트의 기능을 수정하거나 확장할 수 있습니다.
댓글 0
Delphi [마이그레이션] 델파이 XE8에서 체크박스, 라디오버튼의 글자의 색상을 변경하고 싶어요.
2015.06.10 02:33
Q.
[VCL] 델파이 XE8에서 체크박스, 라디오버튼의 글자의 색상을 변경하고 싶어요.
A.
VCL 스타일 적용이후 체크박스, 라디오버튼의 글자 색상(Font.Color)이 적용되지 않습니다.
다음 코드를 통해 글자 색상을 적용할 수 있습니다.
1, 새로운 유닛(Vcl.StdCtrls.Ext)을 추가하고, WMPaint, Paint 메소드 오버라이딩 한 클래스를 작성합니다.
unit Vcl.StdCtrls.Ext;
interface
uses
System.Classes, Winapi.Windows, Winapi.Messages,
Vcl.StdCtrls, Vcl.Controls, Vcl.DBCtrls, Vcl.Graphics;
type
http://stackoverflow.com/questions/2356431/how-can-you-change-the-font-color-of-a-theme-enabled-control
TCheckBox = class(Vcl.StdCtrls.TCheckBox)
private
procedure WMPaint(var msg: TWMPaint); message WM_PAINT;
end;
// http://www.delphigroups.info/2/95/170811.html
TDBText = class(Vcl.DBCtrls.TDBText)
protected
procedure Paint; override;
end;
implementation
{ TCheckBox }
procedure TCheckBox.WMPaint(var msg: TWMPaint);
var
BtnWidth: Integer;
canv: TControlCanvas;
begin
BtnWidth := GetSystemMetrics(SM_CXMENUCHECK);
inherited;
canv := TControlCanvas.Create;
try
canv.Control := Self;
canv.Font := Font;
SetBkMode(canv.Handle, Ord(TRANSPARENT));
canv.TextOut(BtnWidth + 1, 2, Caption);
finally
canv.Free;
end;
end;
{ TDBText }
procedure TDBText.Paint;
var
InitChar : char;
begin
Canvas.Brush.Color := Color;
Canvas.FillRect(Canvas.ClipRect); // paint the background color ...
inherited Paint;
end;
end.