자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다. 
  • 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)

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 클래스를 이용해 컴포넌트를 생성합니다.

위 내용을 참고하면 기본 컴포넌트의 기능을 수정하거나 확장할 수 있습니다.

번호 제목 글쓴이 날짜 조회 수
공지 [프로그래밍 강의] 2021.6~2021.12 관리자 2015.01.22 20111
공지 유용한 관련 사이트 관리자2 2014.03.20 59010
공지 본 게시판은 개발자 여러분들의 질문과 답변을 공유하는 공간입니다. 관리자 2012.01.10 102637
1019 [공유] 라이브바인딩으로 날짜필드를 연결할때 포맷을 지정할 수 있나요? file 험프리 2015.10.21 416
1018 [세미나][DavidI] 윈도우 10 폰 타켓 플랫폼 지원 로드맵이 있나요? 험프리 2015.10.21 271
1017 [세미나][DavidI] MidaConverter를 이용한 프로젝트 변환과 비콘 연동에 대해 더 알고 싶습니다. 험프리 2015.10.21 143
1016 [세미나][DavidI] 이번 세미나에서 FireMonkey 새로운 기능에 대한 소개가 적어 아쉬웠습니다. 험프리 2015.10.21 162
1015 [세미나][DavidI] BeaconFence의 인식 범위는 어느정도까지 가능한가요? 험프리 2015.10.21 151
1014 [마이그레이션][델파이3>델파이10시애틀] Quick Report 마이그레이션 방법 알려주세요(마이그레이션 후 레포트 폼이 실행되지 않습니다.) [1] 박성민 2015.10.20 411
1013 [XE8] 안드로이드 이벤트 처리법 [1] 가을이다 2015.10.19 385
1012 XE8 WebBrowser컴포넌트 메모리 해제법 가을이다 2015.10.16 839
1011 비콘 블루투스 끊겼을때 exception 처리에 대해 devdevil0625 2015.10.16 282
1010 [마이그레이션] WinExec로 외부 실행파일 호출이 되지 않습니다. 험프리 2015.10.16 1634
1009 [마이그레이션][델파이 1~3] WinProcs.dcu, WinTypes.dcu not found 오류 발생 시 대처방법 험프리 2015.10.16 342
1008 [마이그레이션][팁] TServerSocket, TClientSocket 컴포넌트 추가 방법 험프리 2015.10.13 265
1007 FastReport 문의. [1] 회원 2015.10.12 1281
1006 델파이 xe5 firemonkey mobile Applicaton에서 Mediaplayer 사용 [6] superman 2015.10.11 934
1005 [XE8] 모바일개발시 스크롤뷰 감도 낮추는 방법 [1] 가을이다 2015.10.07 245
1004 사진앨범 접근, 사진 가져오기 [1] file 라드 2015.10.05 334
1003 delphi dx 및 er stduio 설치후 기존 버전 문제 [1] voyager 2015.10.12 162
1002 [마이그레이션][팁] 함수(또는 변수)에 빨간밑줄이 가고 컴파일 시 Undeclared Identifier 오류 시 조치방법 험프리 2015.10.12 163
1001 [마이그레이션][델파이4>2007] DBCtrlGrid에 DBLookupCombo를 올린 후 콤보를 선택하면 ""Operation not allowed in DBCtrlGrid"" 오류가 발생하고 목록이 표시되지 않습니다. 어떻게 해결해야하나요? 험프리 2015.05.30 432
» [마이그레이션] 델파이 XE8에서 체크박스, 라디오버튼의 글자의 색상을 변경하고 싶어요. 험프리 2015.06.10 1288