用了xpman后, edit边框变成浅蓝色,有没有办法改变这个颜色?

解决方案 »

  1.   

    你可以自己拦截Edit的重绘消息,然后自己画。
    不得闲的博客有一个模仿 QQ 的 Edit,你可以参考一下。
    http://www.cnblogs.com/DxSoft/archive/2010/05/04/1727023.html
      

  2.   


    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, XPMan;type
      TForm1 = class(TForm)
        Edit1: TEdit;
        XPManifest1: TXPManifest;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
        OldEdtWndProc: TWndMethod;
        procedure NewEdtWndProc(var Message: TMessage);
        procedure DrawControl(FEdit: TCustomEdit);
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}
    function GetWinExStyle(const Handle, dwStyle: Integer): boolean;
    begin
      Result := ((GetWindowLong(Handle, GWL_EXSTYLE) and dwStyle) <> 0);
    end;
    procedure DrawRoundRect(const DC: HDC; const c: TColor; const r: TRect; const w: Integer; const xRound: Integer = 6);
    var
      Pen: hPen;
      OldPen: hPen;
      OldBrush: hBrush;
    begin
      Pen := CreatePen(PS_SOLID, w, c);
      OldPen := SelectObject(dc, Pen);
      OldBrush := SelectObject(dc, GetStockObject(NULL_BRUSH));
      RoundRect(DC, r.Left, r.Top, r.Right, r.Bottom, xRound, xRound);  SelectObject(dc, OldBrush);
      SelectObject(dc, OldPen);
      DeleteObject(Pen);
    end;procedure TForm1.DrawControl(FEdit: TCustomEdit);
    var
      DC: HDC;
      r: TRect;
    begin
      if not GetWinExStyle(FEdit.Handle , WS_EX_CLIENTEDGE) then
        Exit;  DC := GetWindowDC(FEdit.Handle);
      try
        GetWindowRect(FEdit.Handle, r);
        OffsetRect(r, -r.Left, -r.Top);
        DrawRoundRect(DC, clRed, r, 1, 4);
        InflateRect(r, -1, -1);
        DrawRoundRect(DC, clWhite, r, 1, 0);
      finally
        ReleaseDC(FEdit.Handle, DC);
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      OldEdtWndProc := Edit1.WindowProc;
      Edit1.WindowProc := NewEdtWndProc;end;procedure TForm1.NewEdtWndProc(var Message: TMessage);
    begin
      case Message.Msg of
        WM_NCPAINT:
          begin
            //Default(Message);
            DrawControl(Edit1);
          end;
      else
        OldEdtWndProc(Message);
      end;end;end.