線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2642
推到 Plurk!
推到 Facebook!

TControl Enable=False 時, 如何設定 Font.Color 的顏色?

尚未結案
Wawa
一般會員


發表:27
回覆:55
積分:16
註冊:2002-10-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-25 17:57:44 IP:61.224.xxx.xxx 未訂閱
請教: TControl Enable=True 時, 設定 Font.Color 當然是沒什麼問題. 但當 Enable=False 就無法設定了,不知有何方法才能設定 Font.Color 的顏色? 我是希望當 Enable=False 不要是 Window 預設的灰色,而且可設定較顯眼的顏色,否則預色的灰色看得不是很清楚,較費眼力。 謝謝!!
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-26 19:17:44 IP:202.39.xxx.xxx 未訂閱
一個方法是把這些 TWinControl 放到一個 TPanel 上 要 Disable 這些 TWinControl 時, 就 Disable 這個 TPanel 就好 這樣這些 TWinControl.Enabled := False 時便不會呈現灰色. --- Everything I say is a lie.
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-26 19:48:45 IP:202.39.xxx.xxx 未訂閱
有一篇 Peter Below 大大的範例, 修改 TEdit Disable 後 的 Color 與 Font Color, 如下: http://groups.google.com.tw/groups?hl=zh-TW&lr=&ie=UTF-8&oe=UTF-8&selm=VA.0000a1e2.0060cc29%40nomail.please&rnum=3
unit PBExEdit;    interface    uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;    type
  TPBExEdit = class(Tedit)
  private
    FDisabledColor: TColor;
    FDisabledTextColor: TColor;
    { Private declarations }
    Procedure WMPaint( Var msg: TWMPaint ); message WM_PAINT;
    Procedure WMEraseBkGnd( var msg: TWMEraseBkGnd ); message WM_ERASEBKGND;
    procedure SetDisabledColor(const Value: TColor); virtual;
    procedure SetDisabledTextColor(const Value: TColor); virtual;
  protected
    { Protected declarations }
  public
    { Public declarations }
    Constructor Create( aOwner: TComponent ); override;
  published
    { Published declarations }
    property DisabledTextColor: TColor
      read FDisabledTextColor
      write SetDisabledTextColor
      default clGrayText;
    property DisabledColor: TColor
      read FDisabledColor
      write SetDisabledColor
      default clWindow;
  end;    procedure Register;    implementation    procedure Register;
begin
  RegisterComponents('PBGoodies', [TPBExEdit]);
end;    { TPBExEdit }    constructor TPBExEdit.Create(aOwner: TComponent);
begin
  inherited;
  FDisabledColor := clWindow;
  FDisabledTextColor := clGrayText;
end;    procedure TPBExEdit.SetDisabledColor(const Value: TColor);
begin
  If FDisabledColor <> Value Then Begin
    FDisabledColor := Value;
    If not Enabled Then
      Invalidate;
  End;
end;    procedure TPBExEdit.SetDisabledTextColor(const Value: TColor);
begin
  If FDisabledTextColor <> Value Then Begin
    FDisabledTextColor := Value;
    If not Enabled Then
      Invalidate;
  End;
end;    procedure TPBExEdit.WMEraseBkGnd(var msg: TWMEraseBkGnd);
var
  canvas: TCanvas;
begin
  If Enabled Then
    inherited
  Else Begin
    canvas:= TCanvas.Create;
    try
      canvas.Handle := msg.DC;
      SaveDC( msg.DC );
      try
        canvas.Brush.Color := FDisabledColor;
        canvas.Brush.Style := bsSolid;
        canvas.Fillrect( clientrect );
        msg.result := 1;
      finally
        RestoreDC( msg.DC, -1 );
      end;
    finally
      canvas.free
    end;
  End; { Else }
end;    procedure TPBExEdit.WMPaint(var msg: TWMPaint);
var
  canvas: TCanvas;
  ps: TPaintStruct;
  callEndPaint: Boolean;
begin
  If Enabled Then
    inherited
  Else Begin
    callEndPaint := False;
    canvas:= TCanvas.Create;
    try
      If msg.DC <> 0 Then Begin
        canvas.Handle := msg.DC;
        ps.fErase := true;
      End
      Else Begin
        BeginPaint( handle, ps );
        callEndPaint:= true;
        canvas.handle := ps.hdc;
      End;          If ps.fErase Then
        Perform( WM_ERASEBKGND, canvas.handle, 0 );          SaveDC( canvas.handle );
      try
        canvas.Brush.Style := bsClear;
        canvas.Font := Font;
        canvas.Font.Color := FDisabledTextColor;
        canvas.TextOut( 1, 1, Text );
      finally
        RestoreDC( canvas.handle, -1 );
      end;
    finally
      If callEndPaint Then
        EndPaint( handle, ps );
      canvas.free
    end;
  End; { Else }
end;    end.
--- Everything I say is a lie.
Wawa
一般會員


發表:27
回覆:55
積分:16
註冊:2002-10-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-30 01:26:51 IP:61.224.xxx.xxx 未訂閱
謝謝 hagar 的幫忙。第一次回答比較接近我想要的。 若要寫元件才能達到,那繼承 TControl 的元件不是都要全改了嗎. 我常寫元件, 所以透過元件當然沒問題。我想要的是不需透過元件, 只要簡單幾行程式就可做到, 我在國外網站也看過有人提過跟我一模一樣的問題,但解法都不夠漂亮。 但你第一次的回答,我倒是一時沒想到, 稍加再修改, 應該不難做到。 謝謝 hagar 了!!
JasonSu
一般會員


發表:1
回覆:10
積分:7
註冊:2003-06-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-04-24 17:58:07 IP:211.22.xxx.xxx 訂閱
[code delphi]
procedure EnableControl(AControl: TWinControl; Enable: Boolean);
begin
With AControl Do Begin
If Enable Then Begin
SetWindowLong(Handle, GWL_STYLE, (Not WS_DISABLED) And GetWindowLong(Handle, GWL_STYLE));
End Else Begin
SetWindowLong(Handle, GWL_STYLE, WS_DISABLED GetWindowLong(Handle, GWL_STYLE));
End;
End;
end;

[/code]


使用範例
EnableControl(Edit1, False);
編輯記錄
JasonSu 重新編輯於 2008-04-24 17:59:45, 註解 無‧
JasonSu 重新編輯於 2008-04-24 18:00:50, 註解 無‧
JasonSu 重新編輯於 2008-04-24 18:02:37, 註解 無‧
JasonSu 重新編輯於 2008-04-24 18:03:20, 註解 無‧
系統時間:2024-05-09 7:42:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!