【问题标题】:Add custom colors to TfontDialog in Delphi 7在 Delphi 7 中为 TfontDialog 添加自定义颜色
【发布时间】:2011-03-03 13:22:20
【问题描述】:

如何在 TFontDialog 中为颜色框添加一些值? 或者请告诉我可以选择自定义颜色字体的组件? 我使用的是 Delphi 7。

谢谢。

我找到了一些方法...但是当 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 to @Warren P. 现在我不知道 OP 正在编写什么类型的应用程序,但如果字体选择是应用程序中的一项重要操作,那么实现一个非常有意义自定义字体选择对话框,既简单又有趣(我想——例如看看my custom colour selector)。
  • 是的,创建自己的对话框并不难,但时间很长...... Windows 提供了很好的对话框,但它不包含“CustomColors”......顺便说一句,我找到了一些解决方案,但 Andreas Rejbrand 的回答可能会更好。

标签: delphi winapi


【解决方案1】:

我认为这可行:

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;

但请注意,正如 David 在下面的 cmets 中正确论证的那样,如果对话框在未来版本的 Windows 中发生更改(足够显着),此代码可能会失败。这可能是也可能不是 OP 的亮点。

【讨论】:

  • 这太淘气了,你不知道吗!
  • @David:恐怕我不能完全确定这是在开玩笑还是对这种方法的实际担忧。我没有搞砸消息处理,是吗?
  • 嗯,这对对话框上的控件进行了假设,这些控件是实现细节。我希望你的细节是正确的,但我认为这种方法很脆弱。
  • 您仍然可以进行投票,但我认为您最好指出在更改对话框的某些未来版本的 Windows 上运行此代码的潜在问题。确实,您在哪个版本上进行了测试?
  • @David:是的,确实如此。我不能真正争论这一点,即使这个对话框自 Windows 3.1 以来就相当惰性。至于第二个 Q - 你了解我:现在是 Win 7 64 位。
【解决方案2】:

TFontDialog 是系统通用对话框ChooseFont 的封装。通用对话框无法轻松自定义其颜色下拉菜单。

【讨论】:

    猜你喜欢
    • 2019-02-17
    • 2021-09-25
    • 1970-01-01
    • 2021-06-24
    • 2014-11-08
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多