자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다. 
  • 제품설치/등록 오류 문의: 설치/등록 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 39525
공지 유용한 관련 사이트 관리자2 2014.03.20 79022
1549 델파이 XE 디버깅시 매번 재컴파일 하나요? [1] 가나다 2019.03.14 369
1548 TIWRegion not found 문의 생각 2019.06.13 369
1547 Datasnap(midas) 사용시 조회 자료를 ADOQuery 에 넣고 싶습니다. [1] 블랙 2019.06.13 369
1546 DATASNAP - CALLBACK 관련 문의 드립니다. [2] 담더기 2017.03.25 369
1545 [10.2 도쿄 출시세미나] 리눅스 플랫폼에서, http클라이언트는 indy기반인가요? 험프리 2017.04.06 369
1544 tStringGrid 버그 확인 요청 [1] 조성긍1 2016.02.01 369
1543 DataSnap 구조에서 미들서버로 파라미터 보낼 때 생기는 문제 superman 2016.09.03 370
1542 Delphi XE 10.2.3 의 TLineTransitionEffect.OffsetProp 의 Getter, Setter 에 버그가 있습니다 [1] DarkRyu 2019.05.08 370
1541 delphi7 win10(64Bit) const 선언값 초기화 오류 둔촌동개발자 2020.04.08 370
1540 델파이로 시스템 초기화 버전 만들려고하는데 C드라이브 초기화 우루사 2020.06.14 370
1539 [무료 온라인 세미나] 새로운 RAD Studio 10 시애틀: 윈도우 10 혜택을 누리세요! 관리자 2015.09.11 370
1538 컴파일과 저장관련 문의드립니다~ [1] syc 2016.04.12 370
1537 문자전송기능?? [2] syc 2015.09.02 371
1536 could not convert varant of type (array byte) into type (double) 오류 해결방법문의합니다 [1] delphi 2015.07.31 371
1535 BitBtn 모양이 프로젝트마다 달라요. 도와주세요. [1] file kwy0702 2017.10.26 372
1534 컴포넌트 설치관련 [4] file 개미 2018.01.03 372
1533 델파이 xe7 로딩시 오류 [1] file chchchchchch 2018.01.04 372
1532 [XE8 웹세미나] 웹 환경의 업무 프로젝트 개발이 얼마나 편리한가요? Humphery 2015.05.13 372
1531 Application Store 로 컴파일 하면 다음과 같은 에러가 나옵니다. [3] kerry 2016.02.18 372
1530 Rad서버 질문입니다. [1] 희망나라 2020.09.04 372