2011-03-03 4 views
4

TFontDialog의 색상 상자에 값을 추가 할 수 있습니까? 또는 사용자 정의 색상의 글꼴을 선택할 수있는 구성 요소에 대해 알려주십시오. 저는 Delphi 7을 사용합니다.Delphi 7의 TfontDialog에 맞춤 색상 추가

감사합니다.

나는 어떤 식 으로든 찾았습니다 ...하지만 itemIndex = 0에서 색상 상자가 변경되면 어떻게 TColorDialog를 표시 할 수 있습니까?

procedure TForm1.FontDialog1Show(Sender: TObject); 
const 
IDCOLORCMB = $473; 
SMyColorName: PChar = 'clMoneyGreen'; 
CMyColor: TColor = clMoneyGreen; 
begin 
SendDlgItemMessage(FontDialog1.Handle, IDCOLORCMB, CB_INSERTSTRING, 0, 
Integer(SMyColorName)); 
SendDlgItemMessage(FontDialog1.Handle, IDCOLORCMB, CB_SETITEMDATA, 0, 
    ColorToRGB(CMyColor)); 
end; 
+1

OWN 글꼴 대화 상자를 작성하십시오. 정확히는 아니에요? –

+0

+1 @Warren P. 지금 OP가 쓰고있는 응용 프로그램의 유형을 모르지만 글꼴 선택이 응용 프로그램에서 중요한 작업 인 경우 사용자 정의 글꼴 선택 대화 상자를 구현하는 것이 좋습니다. 매우 쉽고 재미 있습니다. (예를 들어, [내 사용자 정의 색상 선택기] (http://privat.rejbrand.se/rejbrandcolourselector1.png)를보십시오). –

+0

네, 자체 생성 대화 상자는 어렵지 않지만 오랜 시간입니다 ... Windows는 좋은 대화 상자를 제공하지만 "CustomColors"는 포함되어 있지 않습니다 ... btw, 몇 가지 해결책을 찾았지만 Andreas Rejbrand의 대답이 더 좋을 수 있습니다. –

답변

6

나는이 작품 생각 :

interface 

TFontDialog = class(Dialogs.TFontDialog) 
const 
    IDCOLORCMB = $473; 
protected 
    procedure WndProc(var Message: TMessage); override; 
    procedure DoShow; override; 
end; 

... 

implementation 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    FontDialog1.Execute(); 
end; 

{ TFontDialog } 

procedure TFontDialog.DoShow; 
const 
    SMyColorName: PChar = 'Custom...'; 
    CMyColor: TColor = $0033ccff; 
begin 
    SendDlgItemMessage(Handle, IDCOLORCMB, CB_INSERTSTRING, 0, Integer(SMyColorName)); 
    SendDlgItemMessage(Handle, IDCOLORCMB, CB_SETITEMDATA, 0, ColorToRGB(CMyColor)); 
end; 

procedure TFontDialog.WndProc(var Message: TMessage); 
begin 
    inherited; 
    with Message do 
    if (Msg = WM_COMMAND) and (WParamHi = CBN_SELENDOK) and (WParamLo = IDCOLORCMB) and (SendDlgItemMessage(Handle, IDCOLORCMB, CB_GETCURSEL, 0, 0) = 0) then 
     with TColorDialog.Create(Self) do 
     try 
      Color := TColor(SendDlgItemMessage(Self.Handle, IDCOLORCMB, CB_GETITEMDATA, 0, 0)); 
      Options := [cdFullOpen]; 
      if Execute(Self.Handle) then 
      SendDlgItemMessage(Self.Handle, IDCOLORCMB, CB_SETITEMDATA, 0, ColorToRGB(Color)); 
     finally 
      Free; 
     end; 
end; 

그러나 통지, 다윗이 올바르게 대화 상자가 윈도우의 이후 버전에서는 (매우 충분) 변경해야하는 경우이 코드가 실패 할 수 있음을, 아래의 의견 주장한다. 그것은 OP에 대한 지지자가 아닐 수도 있습니다.

+3

그것은 매우 장난 꾸러기이다, 당신은 모르고있다! –

+0

@David : 접근법에 대한 농담이나 실제적인 우려가 있는지 여부를 나는 확실히 말할 수 없다. 나는 메시지 처리를 엉망으로 만들지 않았던가? –

+2

그러면 대화 상자의 컨트롤에 대한 구현 정보가 가정됩니다. 나는 당신이 세부 사항을 바로 잡길 기대하지만 접근법은 약하다고 생각합니다. –

2

TFontDialog는 시스템의 일반 대화, ChooseFont 래퍼입니다. 공통 대화 상자에서는 색상 드롭 다운을 쉽게 사용자 정의 할 수 없습니다.

+0

나는 약간의 방법을 발견했다 :). 그러나 그것은 충분하지 않다. .. –