你是不是说在一个应用程序改变另外一个程序里的button颜色啊?   wm_ctlsetcolor应该是设置颜色的

解决方案 »

  1.   

    是要改变别的程序(不一定是delphi做的,甚至于一个对话框里的按扭)窗口里的button的颜色。
      

  2.   

    这个得找一下win API相关的函数了
      

  3.   

    普通按钮颜色好像不嫩该吧,(在windows主题中除外),你可以看一下源代码,好像是调用的windows 的API创建的按钮,没法指定颜色,要么你用第三方控件,或者你改写buttons单元中的创建按钮部分,因该是在paint方法上吧,自己用函数画,用那个画多边形的救行,名字我忘了
      

  4.   

    应该可以,Get这个Button的DC,那么可以用GDI API直接Draw了。
      

  5.   

    Kingron大虾,抓dc是可以的,但怕刷新啊。帮着试一下吧。。
    vcl里我从createparams到createwnd到createhandle到paintto都看了个遍还没找到从哪里下手的好。呵呵。
      

  6.   

    //看我做的组件,自己完善一下。:)
    unit tzButton;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls,ExtCtrls;type
      TtzButton = class(TButton) //思想就是给它加个画布,改画布颜色
      private
        FCanvas: TCanvas;
        procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
      protected
        procedure Paint; virtual;   //后加的
        procedure PaintWindow(DC: HDC); override;
        property Canvas: TCanvas read FCanvas;    procedure ButtonClick(Sender: TObject); virtual;
      public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      published
        property Color;
      end;
    procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('TZhuang', [TtzButton]);
    end;{ TtzButton }procedure TtzButton.paint;
    var ARect: TRect;
      Flags: Longint;begin  with Canvas do begin
        ARect := GetClientRect;
        Brush.Color := Self.Color;
        FillRect(ARect);
                                      //模仿TCustomPanel.paint的代码
        Frame3D(Canvas, ARect, clBtnHighlight, clBtnShadow, 1);
        Flags := DT_EXPANDTABS or DT_VCENTER or DT_CENTER;
        //Flags := DT_CENTER or DT_VCENTER;
        Flags := DrawTextBiDiModeFlags(Flags);
        DrawText(Handle, PChar(Caption), -1, ARect, Flags);  end;end;constructor TtzButton.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      FCanvas := TControlCanvas.Create;
      TControlCanvas(FCanvas).Control := Self;  OnClick:= ButtonClick;
    end;destructor TtzButton.Destroy;
    begin
      FCanvas.Free;
      inherited Destroy;
    end;procedure TtzButton.WMPaint(var Message: TWMPaint);
    begin
      ControlState:= ControlState + [csCustomPaint];
      //Include(FControlState, csCustomPaint);
      inherited;
      //Exclude(FControlState, csCustomPaint);
      ControlState:= ControlState - [csCustomPaint];
    end;procedure TtzButton.PaintWindow(DC: HDC);
    begin
      FCanvas.Lock;
      try
        FCanvas.Handle := DC;
        try
          TControlCanvas(FCanvas).UpdateTextFlags;
          Paint;
        finally
          FCanvas.Handle := 0;
        end;
      finally
        FCanvas.Unlock;
      end;
    end;procedure TtzButton.ButtonClick(Sender: TObject);
    begin
      invalidate;  //刷新!
    end;end.
      

  7.   

    我想,应该很难,如果是自己的程序,那么很好办,但是要求任意程序的Button,就很难了,除非Hook那个程序的Button的Paint事件,但是这个有谁可以做到?也许有其他的方法,但是我不知道,我学习。