zoukankan      html  css  js  c++  java
  • 用delphi编程实现XP界面效果

    给你个按扭=========================================================
    {*******************************************************}
    { }
    { XPButton v1.01 }
    { }
    { Copyright (c) 2002-1 Liren Zhao BeiJing China }
    { }
    { HomePage: Http://Stef.533.net/54 }
    { Http://Aojianjianghu.126.com }
    { Address:Beijing Syntong Tech Delvelop co.,LTD }
    { Email:Liren.z@163.com }
    { }
    {*******************************************************}
    unit XPButton;

    interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    StdCtrls, Buttons;

    type
    TShade = record
    C: array[0..15] of TColor;
    end;

    type
    TXPButton = class(TButton)
    private
    FBaseColor: TColor;
    FCanvas: TCanvas;
    IsFocused: Boolean;
    Shade: TShade;
    procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
    procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
    procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
    procedure DrawItem(const DrawItemStruct: TDrawItemStruct);
    procedure SetBaseColor(Value: TColor);
    function LoadShades(BaseColor: TColor): TShade;
    function ShadeColor(BaseColor: TColor; Offset: Integer): TColor;
    protected
    procedure CreateParams(var Params: TCreateParams); override;
    procedure SetButtonStyle(ADefault: Boolean); override;
    public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    published
    //property BaseColor: TColor read FBaseColor write SetBaseColor default $00777777;
    property OnClick;
    property OnContextPopup;
    property OnDragDrop;
    property OnDragOver;
    property OnEndDock;
    property OnEndDrag;
    property OnEnter;
    property OnExit;
    property OnKeyDown;
    property OnKeyPress;
    property OnKeyUp;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
    property OnStartDock;
    property OnStartDrag;
    end;

    procedure Register;
    implementation

    procedure Register;
    begin
    RegisterComponents('Liren.z', [TXPButton]);
    end;

    constructor TXPButton.Create(AOwner: TComponent);
    begin
    inherited Create(AOwner);
    FCanvas := TCanvas.Create;
    FBaseColor := $00DDB9B9; //$00777777;
    ControlStyle := ControlStyle - [csDoubleClicks];
    Width := 85;
    Height := 30;
    Shade := LoadShades(FBaseColor);
    end;

    destructor TXPButton.Destroy;
    begin
    inherited Destroy;
    FCanvas.Free;
    end;

    procedure TXPButton.CreateParams(var Params: TCreateParams);
    begin
    inherited CreateParams(Params);
    with Params do Style := Style or BS_OWNERDRAW;
    end;

    procedure TXPButton.CNDrawItem(var Message: TWMDrawItem);
    begin
    DrawItem(Message.DrawItemStruct^);
    end;

    procedure TXPButton.CMFontChanged(var Message: TMessage);
    begin
    inherited;
    Invalidate;
    end;

    procedure TXPButton.CMEnabledChanged(var Message: TMessage);
    begin
    inherited;
    Invalidate;
    end;

    procedure TXPButton.DrawItem(const DrawItemStruct: TDrawItemStruct);
    var
    IsDown, IsDefault: Boolean;
    Rec, FocusRect: TRect;
    Flags: Longint;
    FilCol, BorCol, CapCol, T1, T2, B1, B2: TColor;
    begin
    FCanvas.Handle := DrawItemStruct.hDC;
    Rec := ClientRect;

    with DrawItemStruct do begin
    IsDown := itemState and ODS_SELECTED <> 0;
    IsDefault := itemState and ODS_FOCUS <> 0;
    end;
    Flags := DFCS_BUTTONPUSH or DFCS_ADJUSTRECT;
    if IsDown then Flags := Flags or DFCS_PUSHED;
    if (DrawItemStruct.itemState and ODS_DISABLED <> 0) then
    Flags := Flags or DFCS_INACTIVE;

    FCanvas.Font := Font;

    if Enabled then begin
    BorCol := Shade.C[0];
    if IsDown then begin
    T1 := Shade.C[4];
    T2 := Shade.C[5];
    B1 := Shade.C[7];
    B2 := Shade.C[8];
    FilCol := Shade.C[6];
    CapCol := Shade.C[15];
    end
    else begin
    T1 := Shade.C[13];
    T2 := Shade.C[15];
    B1 := Shade.C[10];
    B2 := Shade.C[7];
    FilCol := Shade.C[13];
    CapCol := Font.Color;
    end
    end
    else begin
    BorCol := Shade.C[8];
    CapCol := Shade.C[8];
    FilCol := Shade.C[13];
    end;

    with FCanvas do begin
    Pen.Style := psSolid;
    Brush := Parent.Brush;
    FillRect(ClientRect);
    Brush.Color := FilCol;
    Pen.Color := BorCol;
    InflateRect(Rec, -3, -3);
    RoundRect(Rec.Left, Rec.Top, Rec.Right, Rec.Bottom, 3, 3);
    if Enabled then begin
    Pen.Color := T1;
    MoveTo(Rec.Left + 1, Rec.Bottom - 3);
    LineTo(Rec.Left + 1, Rec.Top + 1);
    MoveTo(Rec.Left + 2, Rec.Top + 1);
    LineTo(Rec.Right - 2, Rec.Top + 1);
    Pen.Color := T2;
    MoveTo(Rec.Left + 2, Rec.Bottom - 4);
    LineTo(Rec.Left + 2, Rec.Top + 2);
    LineTo(Rec.Right - 3, Rec.Top + 2);
    Pen.Color := B1;
    MoveTo(Rec.Left + 3, Rec.Bottom - 3);
    LineTo(Rec.Right - 3, Rec.Bottom - 3);
    LineTo(Rec.Right - 3, Rec.Top + 2);
    Pen.Color := B2;
    MoveTo(Rec.Left + 3, Rec.Bottom - 2);
    LineTo(Rec.Right - 2, Rec.Bottom - 2);
    MoveTo(Rec.Right - 2, Rec.Bottom - 3);
    LineTo(Rec.Right - 2, Rec.Top + 2);

    { Make pixel-perfect modifications }
    if IsDown then begin
    Pixels[Rec.Left + 2, Rec.Top + 2] := T1;
    Pixels[Rec.Left + 3, Rec.Top + 3] := T2;
    Pixels[Rec.Left + 2, Rec.Bottom - 2] := B1;
    Pixels[Rec.Right - 2, Rec.Top + 2] := B1;
    Pixels[Rec.Right - 3, Rec.Bottom - 3] := B2;
    Pixels[Rec.Right - 4, Rec.Bottom - 4] := B1;
    end
    else begin
    Pixels[Rec.Left + 1, Rec.Top + 2] := Shade.C[11];
    Pixels[Rec.Left + 2, Rec.Top + 1] := Shade.C[11];
    Pixels[Rec.Left + 3, Rec.Top + 3] := T2;
    Pixels[Rec.Left + 1, Rec.Bottom - 3] := Shade.C[11];
    Pixels[Rec.Left + 2, Rec.Bottom - 2] := Shade.C[11];
    Pixels[Rec.Right - 3, Rec.Top + 1] := Shade.C[11];
    Pixels[Rec.Right - 2, Rec.Top + 2] := Shade.C[11];
    Pixels[Rec.Right - 4, Rec.Bottom - 4] := B1;
    Pixels[Rec.Right - 3, Rec.Bottom - 3] := B2;
    end;

    end;
    InflateRect(Rec, -8, -4);
    Font.Color := CapCol;
    Rec.Top := Rec.Top - 1;
    DrawText(Handle, PChar(Caption), Length(Caption), Rec,
    DT_CENTER or DT_VCENTER or DT_SINGLELINE);

    if Enabled then begin
    FocusRect := Rect(6, 6, width - 6, height - 6);
    if IsFocused then
    DrawFocusRect(FocusRect);
    end;
    end;
    FCanvas.Handle := 0;
    end;

    procedure TXPButton.SetButtonStyle(ADefault: Boolean);
    begin
    if (ADefault <> IsFocused) then begin
    IsFocused := ADefault;
    Invalidate;
    end;
    end;

    procedure TXPButton.SetBaseColor(Value: TColor);
    begin
    if (Value <> FBaseColor) then begin
    FBaseColor := Value;
    Shade := LoadShades(FBaseColor);
    Repaint;
    end;
    end;

    function TXPButton.LoadShades(BaseColor: TColor): TShade;
    var
    Index: Integer;
    begin
    for Index := 0 to 7 do
    Result.C[Index] := ShadeColor(BaseColor, -(7 - Index) * 17);
    for Index := 8 to 15 do
    Result.C[Index] := ShadeColor(BaseColor, (Index - 7) * 17);
    end;

    function TXPButton.ShadeColor(BaseColor: TColor; Offset: Integer): TColor;
    var
    Red, Green, Blue: Integer;
    begin
    Red := (BaseColor and $FF) + Offset;
    Green := ((BaseColor and $FF00) div 256) + Offset;
    Blue := ((BaseColor and $FF0000) div 65536) + Offset;
    if (Red > $FF) then Red := $FF;
    if (Red < $00) then Red := $00;
    if (Green > $FF) then Green := $FF;
    if (Green < $00) then Green := $00;
    if (Blue > $FF) then Blue := $FF;
    if (Blue < $00) then Blue := $00;
    Result := (Blue * 65536) + (Green * 256) + Red;
    end;

    end.

    制作特殊窗体=========================================================

    {*******************************************************}
    { }
    { ImgForm v1.01 }
    { }
    { Copyright (c) 2002-1 Liren Zhao BeiJing China }
    { }
    { HomePage: Http://Stef.533.net/54 }
    { Http://Aojianjianghu.126.com }
    { Address:Beijing Syntong Tech Delvelop co.,LTD }
    { Email:Liren.z@163.com }
    { }
    {*******************************************************}
    unit ImgForm;

    interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    ExtCtrls;

    type
    EImgFormError = class(Exception);
    TImgForm = class(TCustomPanel) //TGraphicControl
    private
    FPicture:TBitMap;
    FMoveForm:Boolean;
    FormHandle:Hwnd;
    procedure SetPicture(Value: TBitMap);
    procedure PictureChange(Sender: TObject);

    protected
    procedure paint;override;
    procedure MouseMove(Shift: TShiftState; X,Y: Integer);Override;
    public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Execute;
    procedure HideInTaskBar;
    published
    property Picture: TBitMap read FPicture write SetPicture;
    property MoveForm:boolean read FMoveForm write FMoveForm ;
    property PopupMenu;
    property DragCursor;
    property DragKind;
    property DragMode;
    property OnClick;
    property OnContextPopup;
    property OnDblClick;
    property OnDragDrop;
    property OnDragOver;
    property OnEndDock;
    property OnEndDrag;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
    property OnStartDock;
    property OnStartDrag;
    end;

    procedure Register;

    implementation

    procedure Register;
    begin
    RegisterComponents('Liren.z', [TImgForm]);
    end;

    { TImgForm }

    constructor TImgForm.Create(AOwner: TComponent);
    begin
    //记得以后加上,判断Parent是不是窗体,还有就是self的个数只能为一个
    inherited Create(AOwner);

    if not (AOwner is TForm) then //
    raise EImgFormError.Create('Control parent must be a form!')
    else
    with (AOwner as TForm) do begin
    AutoSize:=true;
    BorderStyle:=bsNone;
    FormHandle:=Handle;
    end;

    Align:=alClient;
    FMoveForm:=true;
    FPicture :=TBitMap.Create;
    FPicture.OnChange:=PictureChange;
    end;

    destructor TImgForm.Destroy;
    begin
    FPicture.Free;
    inherited Destroy;
    end;

    procedure TImgForm.paint;
    const
    XorColor = $00FFD8CE;
    begin
    with Canvas do begin
    if (csDesigning in ComponentState) then begin
    Pen.Style := psDot;
    Pen.Mode := pmXor;
    Pen.Color := XorColor;
    Brush.Style := bsClear;
    Rectangle(0, 0, ClientWidth, ClientHeight);
    TextOut(5,5,'ImgForm');
    moveto(0,0);
    Lineto(Width,height);
    moveto(0,Height);
    Lineto(Width,0);
    end;

    if not FPicture.Empty then
    Draw(0,0,FPicture);
    end;
    // inherited Paint; // 如果控件从TGraphicControl继承,就不要注释这里
    end;

    procedure TImgForm.PictureChange(Sender: TObject);
    begin
    if not FPicture.Empty then begin
    Align:=alNone;
    Width:=FPicture.Width;
    Height:=FPicture.Height;
    end
    else
    Align:=alClient;
    end;

    procedure TImgForm.Execute;
    var
    h,w,i,j:integer;
    tc:Tcolor;
    hrgn1,hrgn3:HRGN;
    begin
    if not FPicture.Empty then begin
    tc:=FPicture.Canvas.Pixels[0,0];
    h:=FPicture.Canvas.ClipRect.Bottom -FPicture.Canvas.ClipRect.top ;
    w:=FPicture.Canvas.ClipRect.Right -FPicture.Canvas.ClipRect.left ;
    hrgn3:=createrectrgn(0,0,w,h);
    try
    for i:=0 to w-1 do
    for j:=0 to h-1 do
    begin
    if FPicture.Canvas.Pixels[i,j]=tc then
    begin
    deleteobject(hrgn1);
    hrgn1:=CreateRectRgn(i,j,i+1,j+1);
    if hrgn1<>0 then
    begin
    CombineRgn(hrgn3,hrgn3,hrgn1,RGN_DIFF);
    end;
    end;
    end;
    deleteobject(hrgn1);
    setwindowrgn(FormHandle,hrgn3,true);
    except
    //RaiseException Here
    end;
    end;
    end;

    procedure TImgForm.SetPicture(Value: TBitMap);
    begin
    FPicture.Assign(Value);
    Invalidate;
    end;

    procedure TImgForm.MouseMove(Shift: TShiftState; X,
    Y: Integer);
    begin
    inherited;
    if FMoveForm then begin
    ReleaseCapture;
    (Parent as TForm).perform(WM_SysCommand, $F012, 0);
    end;
    end;

    procedure TImgForm.HideInTaskBar;
    var
    ExtendedStyle : Integer;
    begin
    ExtendedStyle := GetWindowLong (Application.Handle, GWL_EXSTYLE);
    SetWindowLong(Application.Handle, GWL_EXSTYLE, ExtendedStyle OR WS_EX_TOOLWINDOW AND NOT WS_EX_APPWINDOW);
    end;

    end.

    使用图片做按扭的控件=========================================

    {*******************************************************}
    { }
    { ImgButton v2.01 (Freeware) }
    { }
    { Copyright (c) 2002-1 Liren Zhao BeiJing China }
    { }
    { HomePage: Http://Stef.533.net/54 }
    { Http://Aojianjianghu.126.com }
    { }
    { Email:Liren.z@163.com }
    { }
    {*******************************************************}

    unit ImgButton;

    interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

    type
    TImgButton = class(TGraphicControl)
    private
    FGNormal: TBitmap;
    FGMouseDown: TBitMap;
    FGMouseUp: TBitMap;
    FGDisabled: TBitMap;
    tmpBitmap: TBitMap;
    FCaption: String;
    FShowCaption: Boolean;
    FModalResult: TModalResult;
    FFont:TFont;
    procedure SetGNormal(Value: TBitMap);
    procedure SetGMouseDown(Value: TBitMap);
    procedure SetGMouseUp(Value: TBitMap);
    procedure SetGDisabled(Value: TBitMap);
    procedure SetCaption(Value:String);
    procedure Resize(Sender: TObject);
    procedure SetShowCaption(Value:Boolean);
    procedure DrawCaption;
    procedure SetFont(Value:TFont);
    protected
    procedure paint;override;
    procedure MouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
    procedure MouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
    public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    published
    property PictureEnter: TBitMap read FGMouseUp write SetGMouseUp;
    property PictureDown: TBitMap read FGMouseDown write SetGMouseDown;
    property PictureNormal: TBitMap read FGNormal write SetGNormal;
    property PictureDisable: TBitMap read FGDisabled write SetGDisabled;
    property ModalResult: TModalResult read FModalResult write FModalResult default 0;
    property Caption: String read FCaption write SetCaption;
    property ShowCaption:Boolean read FShowCaption write SetShowCaption;
    property Font:TFont read FFont write SetFont;
    property Action;
    property Anchors;
    property Enabled;
    property ParentShowHint;
    property PopupMenu;
    property ShowHint;
    property Visible;
    property OnClick;
    property OnDblClick;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
    end;

    procedure Register;

    implementation

    procedure Register;
    begin
    RegisterComponents('Liren.z', [TImgButton]);
    end;

    { TImgButton }

    constructor TImgButton.Create(AOwner: TComponent);
    begin
    inherited Create(AOwner);
    Width := 100;
    Height := 100;
    FGNormal :=TBitMap.Create;
    FGMouseDown :=TBitMap.Create;
    FGMouseUp :=TBitMap.Create;
    FGDisabled :=TBitMap.Create;
    tmpBitmap :=TBitMap.Create;
    OnResize:=Resize;
    With Canvas.Font do begin
    Charset:=GB2312_CHARSET;
    Color:= clWindowText;
    Height:=-12;
    Name:='宋体';
    Pitch:=fpDefault;
    Size:=9;
    end;
    FFont:=Canvas.Font;
    end;

    destructor TImgButton.Destroy;
    begin
    FGNormal.Free;
    FGMouseDown.Free;
    FGMouseUp.Free;
    FGDisabled.Free;
    tmpBitMap:=nil;
    tmpBitmap.Free;
    inherited Destroy;
    end;

    procedure TImgButton.paint;
    const
    XorColor = $00FFD8CE;
    begin
    with Canvas do begin
    if (csDesigning in ComponentState) then begin
    Pen.Style := psDot;
    Pen.Mode := pmXor;
    Pen.Color := XorColor;
    Brush.Style := bsClear;
    Rectangle(0, 0, ClientWidth, ClientHeight);
    end;

    if not Enabled then
    if not FGDisabled.Empty then
    tmpBitmap:= FGDisabled
    else
    tmpBitMap:=FGNormal
    else
    tmpBitMap:=FGNormal;

    Canvas.StretchDraw(ClientRect, tmpBitmap);
    DrawCaption;
    end;
    end;

    procedure TImgButton.SetGDisabled(Value: TBitMap);
    begin
    FGDisabled.Assign(Value);
    Invalidate;
    end;

    procedure TImgButton.SetGMouseDown(Value: TBitMap);
    begin
    FGMouseDown.Assign(Value);
    Invalidate;
    end;

    procedure TImgButton.SetGNormal(Value: TBitMap);
    begin
    FGNormal.Assign(Value);
    tmpBitmap:= FGNormal;
    Width:=FGNormal.Width;
    Height:=FGNormal.Height;
    Repaint;
    Canvas.StretchDraw(ClientRect, FGNormal);
    Invalidate;
    end;

    procedure TImgButton.SetGMouseUp(Value: TBitMap);
    begin
    FGMouseUp.Assign(Value);
    Invalidate;
    end;

    procedure TImgButton.MouseDown(Button: TMouseButton; Shift: TShiftState; X,Y: Integer);
    begin
    if (x>0) and (x<Width) and (y>0) and (y<Height) then begin
    if button = mbLeft then begin
    Repaint;
    Canvas.StretchDraw(ClientRect, FGMouseDown);
    DrawCaption;
    end;
    end;
    inherited;
    end;

    procedure TImgButton.MouseEnter(var Msg: TMessage);
    begin
    if Enabled then begin
    Repaint;
    Canvas.StretchDraw(ClientRect, FGMouseUp);
    DrawCaption;
    end;
    end;

    procedure TImgButton.MouseLeave(var Msg: TMessage);
    begin
    if Enabled then begin
    Repaint;
    Canvas.StretchDraw(ClientRect, FGNormal);
    DrawCaption;
    end;
    end;

    procedure TImgButton.MouseUp(Button: TMouseButton; Shift: TShiftState; X,
    Y: Integer);
    begin
    if (x>0) and (x<Width) and (y>0) and (y<Height) then begin
    if button = mbLeft then begin
    Repaint;
    Canvas.StretchDraw(ClientRect, FGMouseUp);
    DrawCaption;
    end;
    end;
    inherited;
    end;

    procedure TImgButton.Resize(Sender: TObject);
    begin
    if not FGNormal.Empty then begin
    Width:=FGNormal.Width;
    Height:=FGNormal.Height;
    DrawCaption;
    end;
    end;

    procedure TImgButton.SetCaption(Value: String);
    begin
    FCaption:=Value;
    DrawCaption;
    Invalidate;
    end;

    procedure TImgButton.DrawCaption;
    var
    x,y:integer;
    begin
    if FShowCaption then begin
    with Canvas do begin
    Brush.Style := bsClear;
    x:=Round((Width-TextWidth(Caption))/2);
    y:=Round((Height-TextHeight(Caption))/2);
    TextOut(x,y,Caption);
    end;
    end;
    end;

    procedure TImgButton.SetShowCaption(Value: Boolean);
    begin
    FShowCaption:=Value;
    Invalidate;
    end;

    procedure TImgButton.SetFont(Value: TFont);
    begin
    FFont:=Value;
    Canvas.Font:=Value;
    Invalidate;
    end;

    end.

  • 相关阅读:
    SyncNavigator V8.6.2数据库同步工具安装与卸载
    数据库同步软件|SyncNavigator数据库同步软件 V8.6.2官网下载地址
    sql server两个数据库同步
    怎么实现数据库异地同步备份
    两台服务器数据库同步
    如何实现数据实时同步
    数据库同步软件|SyncNavigator数据库同步软件 V8.6.2
    syncnavigator使用说明
    go 编译
    Go语言实现FastDFS分布式存储系统WebAPI网关
  • 原文地址:https://www.cnblogs.com/toosuo/p/981310.html
Copyright © 2011-2022 走看看