★★★如何更改button上字体的颜色?我给100分。谢谢
我在object inspector中将button的font color改为红色,可是button上的字体仍然为黑色,不知怎么回事?

解决方案 »

  1.   

    论坛的FAQ里面有答案,我就不抄一遍了。
      

  2.   

    查一下API就知道了﹐這個問題衹能用API來解決﹗
      

  3.   

    老问题
    重载canvas属性自己来画。
      

  4.   

    你可能换一个bitbtn就可以了,button是不行的。
      

  5.   

    就是啊,既然bitbtn很轻松就可以作到,又何必要费那么多时间去钻这个牛角尖?
    有那么多时间放在别的内容上,你肯定可以更上一层了!
      

  6.   

    procedure TForm1.Button7Click(Sender: TObject);
    var     //变量声明
      FullscreenCanvas:TCanvas;
      dc:HDC;
    begin
      DC := GetDC (Button7.Handle);
      FullscreenCanvas := TCanvas.Create;
      FullscreenCanvas.Handle := DC;
      FullscreenCanvas.Brush.Color := clred;
      FullscreenCanvas.FillRect(Rect(0,0,Button7.Width,Button7.Height));
      FullscreenCanvas.Free;
      ReleaseDC (0, DC);
    end;
      

  7.   

    这个要重写组件,以下Kingron提供的猛料上的答案:
    unit ColorButton; interface uses 
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
      StdCtrls, Buttons, ExtCtrls; type 
      TDrawButtonEvent = procedure(Control: TWinControl; 
        Rect: TRect; State: TOwnerDrawState) of object;   TColorButton = class(TButton) 
      private 
        FCanvas: TCanvas; 
        IsFocused: Boolean; 
        FOnDrawButton: TDrawButtonEvent; 
      protected 
        procedure CreateParams(var Params: TCreateParams); override; 
        procedure SetButtonStyle(ADefault: Boolean); override; 
        procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED; 
        procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED; 
        procedure CNMeasureItem(var Message: TWMMeasureItem); message CN_MEASUREITEM; 
        procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM; 
        procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message WM_LBUTTONDBLCLK; 
        procedure DrawButton(Rect: TRect; State: UINT); 
      public 
        constructor Create(AOwner: TComponent); override; 
        destructor Destroy; override; 
        property Canvas: TCanvas read FCanvas; 
      published 
        property OnDrawButton: TDrawButtonEvent read FOnDrawButton write FOnDrawButton; 
        property Color; 
      end; procedure Register; implementation procedure Register; 
    begin 
      RegisterComponents('Samples', [TColorButton]); 
    end; constructor TColorButton.Create(AOwner: TComponent); 
    begin 
      inherited Create(AOwner); 
      FCanvas := TCanvas.Create; 
    end; destructor TColorButton.Destroy; 
    begin 
      inherited Destroy; 
      FCanvas.Free; 
    end; procedure TColorButton.CreateParams(var Params: TCreateParams); 
    begin 
      inherited CreateParams(Params); 
      with Params do Style := Style or BS_OWNERDRAW; 
    end; procedure TColorButton.SetButtonStyle(ADefault: Boolean); 
    begin 
      if ADefault <> IsFocused then 
      begin 
        IsFocused := ADefault; 
        Refresh; 
      end; 
    end; procedure TColorButton.CNMeasureItem(var Message: TWMMeasureItem); 
    begin 
      with Message.MeasureItemStruct^ do 
      begin 
        itemWidth  := Width; 
        itemHeight := Height; 
      end; 
    end; procedure TColorButton.CNDrawItem(var Message: TWMDrawItem); 
    var 
      SaveIndex: Integer; 
    begin 
      with Message.DrawItemStruct^ do 
      begin 
        SaveIndex := SaveDC(hDC); 
        FCanvas.Lock; 
        try 
          FCanvas.Handle := hDC; 
          FCanvas.Font := Font; 
          FCanvas.Brush := Brush; 
          DrawButton(rcItem, itemState); 
        finally 
          FCanvas.Handle := 0; 
          FCanvas.Unlock; 
          RestoreDC(hDC, SaveIndex); 
        end; 
      end; 
      Message.Result := 1; 
    end; procedure TColorButton.CMEnabledChanged(var Message: TMessage); 
    begin 
      inherited; 
      Invalidate; 
    end; procedure TColorButton.CMFontChanged(var Message: TMessage); 
    begin 
      inherited; 
      Invalidate; 
    end; procedure TColorButton.WMLButtonDblClk(var Message: TWMLButtonDblClk); 
    begin 
      Perform(WM_LBUTTONDOWN, Message.Keys, Longint(Message.Pos)); 
    end; procedure TColorButton.DrawButton(Rect: TRect; State: UINT); 
    var 
      Flags, OldMode: Longint; 
      IsDown, IsDefault, IsDisabled: Boolean; 
      OldColor: TColor; 
      OrgRect: TRect; 
    begin 
      OrgRect := Rect; 
      Flags := DFCS_BUTTONPUSH or DFCS_ADJUSTRECT; 
      IsDown := State and ODS_SELECTED <> 0; 
      IsDefault := State and ODS_FOCUS <> 0; 
      IsDisabled := State and ODS_DISABLED <> 0;   if IsDown then Flags := Flags or DFCS_PUSHED; 
      if IsDisabled then Flags := Flags or DFCS_INACTIVE;   if IsFocused or IsDefault then 
      begin 
        FCanvas.Pen.Color := clWindowFrame; 
        FCanvas.Pen.Width := 1; 
        FCanvas.Brush.Style := bsClear; 
        FCanvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom); 
        InflateRect(Rect, - 1, - 1); 
      end;   if IsDown then 
      begin 
        FCanvas.Pen.Color := clBtnShadow; 
        FCanvas.Pen.Width := 1; 
        FCanvas.Brush.Color := clBtnFace; 
        FCanvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom); 
        InflateRect(Rect, - 1, - 1); 
      end 
      else 
        DrawFrameControl(FCanvas.Handle, Rect, DFC_BUTTON, Flags);   if IsDown then OffsetRect(Rect, 1, 1);   OldColor := FCanvas.Brush.Color; 
      FCanvas.Brush.Color := Color; 
      FCanvas.FillRect(Rect); 
      FCanvas.Brush.Color := OldColor; 
      OldMode := SetBkMode(FCanvas.Handle, TRANSPARENT); 
      FCanvas.Font.Color := clBtnText; 
      if IsDisabled then 
        DrawState(FCanvas.Handle, FCanvas.Brush.Handle, nil, Integer(Caption), 0, 
        ((Rect.Right - Rect.Left) - FCanvas.TextWidth(Caption)) div 2, 
        ((Rect.Bottom - Rect.Top) - FCanvas.TextHeight(Caption)) div 2, 
          0, 0, DST_TEXT or DSS_DISABLED) 
      else 
        DrawText(FCanvas.Handle, PChar(Caption), - 1, Rect, 
          DT_SINGLELINE or DT_CENTER or DT_VCENTER); 
      SetBkMode(FCanvas.Handle, OldMode);   if Assigned(FOnDrawButton) then 
        FOnDrawButton(Self, Rect, TOwnerDrawState(LongRec(State).Lo));   if IsFocused and IsDefault then 
      begin 
        Rect := OrgRect; 
        InflateRect(Rect, - 4, - 4); 
        FCanvas.Pen.Color := clWindowFrame; 
        FCanvas.Brush.Color := clBtnFace; 
        DrawFocusRect(FCanvas.Handle, Rect); 
      end; 
    end; end
      

  8.   

    这不值得自己研究下吗?从技术角度出发,碰到什么问题首先想到找其它控件来实现永远不会有所提高!重载Canvas和用GDI画没有本质区别!前一种可以充分利用现成资源!其实要做这类控件也很简单,直接参考BitBtn的代码!后一种比较通用,VB,VC里都可以用!而实际也没有区别,TCanvas对象本来就是对GDI的封装!在技术上多钻牛角尖才能进步得更快!
      

  9.   

    到www.netgocn.com去,有一个示例,含源代码。