⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 winsubclass.pas

📁 这是VCLSKIN v4.22 的所有的源代码
💻 PAS
📖 第 1 页 / 共 5 页
字号:
unit WinSubClass;

{$I Compilers.inc}

{.$define combobox}
{.$define buttontest}
{.$define resiztest}
{.$define scrollbartest}
{.$define combox}

{$WARNINGS OFF}
{$HINTS OFF}
{$RANGECHECKS OFF}

{$define progress}

interface

uses
  Windows, SysUtils, Classes, Graphics, Controls, ComCtrls,  Forms,
  Menus, Messages, ExtCtrls, StdCtrls, Buttons, CommCtrl,imglist,
  winskindata,tabs,TypInfo,Dialogs,Grids;

const
   CM_Scroll1= 161;
   CM_Scroll2= 513;
   CM_Scroll3= 162;
   CM_Scroll4= 514;
   C_Paramv = 7;
   C_Paramh = 6;
   c_paramB = 1;
   SBM_GETSCROLLBARINFO = 235;

type
  TSkinControlState = ( scMouseIn,scDown);
  TAcControl = class(TControl);
  TAcWinControl = class(TWinControl);
  TAcGraphicControl = class(TGraphicControl);
  TSkinAcListView = class(TCustomListView);
  TSkinScrollbar = class;

  TSkinControl = class(TComponent)
  Protected
     state : set of TSkinControlState;
     fCanvas : TCanvas;
     done:boolean;
     isdraw : boolean;
     enabled : boolean;
     focused : boolean;
     caption : wideString;
     FObjectInst,FPrevWndProc :pointer;
     skinned:boolean;
     isunicode:boolean;
     procedure FillBG( dc:HDC; rc:TRect);
     procedure FillParentBG( dc:HDC; rc:TRect);
     procedure doLogMsg(aid:string;msg:TMessage);
     procedure Default(Var Msg: TMessage);
     procedure Invalidate;
     procedure WMPaint(message:TMessage);
     procedure WMERASEBKGND(var Msg: TMessage);
     function GetWindowLongEx(ahWnd: HWND; nIndex: Integer): Longint;
     procedure SetParentBK(value:boolean);
     procedure DrawFocus(hDC: HDC; wString: WideString; rc: TRect; uFormat: UINT);
//     procedure Notification(AComponent: TComponent;Operation: TOperation);override;
  public
     fsd: TSkinData;
     hwnd : HWND;
     OldWndProc: TWndMethod;
     control:Twincontrol;
     boundsrect:Trect;
     GControl : TGraphicControl;
     newColor:boolean;
     oldcolor:Tcolor;
     Inited:boolean;
     skinstate : integer;
     skinform: Tcomponent;
     kind :integer;
     sizing:boolean;
     parentbk:boolean;
     constructor Create(AOwner: TComponent); override;
     destructor Destroy; override;
     Procedure Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);virtual;
     Procedure Inithwnd(ahwnd:Thandle;sd:TSkinData;acanvas:TCanvas;sf:Tcomponent);virtual;
     procedure MouseLeave;
     Procedure Unsubclass; virtual;
     procedure NewWndProc(var Message: TMessage);
     function BeforeProc(var Message: TMessage):boolean;virtual;
     procedure AfterProc(var Message: TMessage);virtual;
     procedure PaintControl(adc:HDC=0);virtual;
     procedure DrawControl( dc:HDC; rc:TRect);Virtual;
     Procedure SkinChange; Virtual;
     function  GetState:integer;Virtual;
     Procedure SetColor;
     Procedure RestoreColor;
     procedure DrawBMPSkin( abmp:Tbitmap;rc:TRect;aObject:TdataSkinObject;
              I,N:integer;trans:integer);
     procedure DrawSkinMap( dc:HDC; rc:TRect;
        aObject:TdataSkinObject;I,N:integer);
     procedure DrawSkinMap1( dc:HDC; rc:TRect;
       bmp:Tbitmap;I,N:integer);
     procedure DrawSkinMap2( dc:HDC; rc:TRect;
       bmp:Tbitmap;I,N:integer);
     procedure DrawSkin( rc:TRect;aObject:TdataSkinObject;
                   I,N:integer;trans:integer);
     procedure DrawSkinMap3( acanvas:Tcanvas; rc:TRect;
        bmp:Tbitmap;I,N:integer);
     procedure DrawBuf( dc:HDC; rc:TRect);
     procedure DrawCaption(acanvas: TCanvas; rc:TRect;text:widestring;
             enabled,defaulted:boolean;Alignment:word=DT_CENTER);
     procedure DrawImgCaption(acanvas: TCanvas; rc:TRect;
           ImgList:hImageList;imgIndex:integer;text:widestring;talign:integer=DT_CENTER);
     function TextHeight(dc:HDC;const s: string):integer;
     function GetParentColor(acolor:Tcolor):Tcolor;
     function CheckBiDi(dw:dword):dword;
  end;

  TArrowButton = Class(TCustomControl)
  private
    procedure WMLButtonDown(Var aMsg: TMessage);message WM_LButtonDown;
    procedure WMLButtonUP(Var aMsg: TMessage);message WM_LButtonUP;
//    procedure WMERASEBKGND(var Msg: TMessage);message WM_ERASEBKGND;
    procedure CMMouseEnter(Var aMsg: TMessage);message CM_MOUSEENTER;
    procedure CMMouseLeave(Var aMsg: TMessage);message CM_MOUSELEAVE;
  protected
    procedure Paint; override;
  public
    cw:integer;
    control:TWincontrol;
    obj:TSkinControl;
    hwnd :Thandle;
    state : set of TSkinControlState;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Attach(aobj:Tskincontrol;acontrol:Twincontrol);
  end;

  TSkinDateTime = Class(TSkinControl)
  private
  protected
     arrow:TArrowButton;
     procedure DrawControl( dc:HDC; rc:TRect);override;
  public
     destructor Destroy; override;
     procedure Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);override;
  end;

  TWScrollbar = Class(TCustompanel)
  private
    procedure WMLButtonDown(Var aMsg: TMessage);message WM_LButtonDown;
    procedure WMMouseMove(Var aMsg: TMessage);message WM_MouseMove;
    procedure WMMouseLeave(Var aMsg: TMessage);message WM_MouseLeave;
    procedure WMLButtonDBClick(Var aMsg: TMessage);message WM_LBUTTONDBLCLK;
    procedure WMLButtonUp(Var aMsg: TMessage);message WM_LButtonUp;
    procedure WMERASEBKGND(var Msg: TMessage);message WM_ERASEBKGND;
  protected
    Len:Integer;
    thumbTop,thumbbottom:integer;
    OffsetSC,trackp:tpoint;
    trackthumb:integer;
    fdown:boolean;
    sbDir:integer;
    ERASEBKGND:boolean;
    scrollpos:integer;
    procedure Paint; override;
    procedure GetThumb(rc:TRect);
    function GetScrollPos(p:Tpoint):integer;
    function GetControlInfo(var info:tagScrollBarInfo):boolean;
    function GetControlInfo2(var info:tagScrollBarInfo):boolean;
    procedure CreateParams(var Params: TCreateParams);override;
  public
    CW:integer;
    hwnd:Thandle;
    control:TWincontrol;
    obj:TSkinControl;
    sbType:byte;
    sbRect:Trect;
//    scrollpos:integer;
    sbVisible:boolean;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Attach(aobj:TSkinControl;aControl:Twincontrol;aType:byte);
    procedure AttachHwnd(aobj:TSkinControl;ahwnd:Thandle;aType:byte);
    procedure SetPosition(ahwnd:Thandle);
    procedure ButtonUp;
    procedure HideScrollbar;
    procedure DoLog(Message: TMessage);
  end;

  TSkinButton = class(TSkinControl)
  Protected
     btemp:Tbitmap;
     MultiLine:boolean;
     trans:boolean;
     redraw:boolean;
     isdefault:boolean;
     procedure DrawBtnText(acanvas: TCanvas; rc:TRect;
               text:String; Alignment:word=DT_CENTER);
     procedure DoMouseDown(var Message: TWMMouse);
     procedure WMEnable(var Message: TMessage);
     procedure SetRedraw(b:boolean);
  public
     constructor Create(AOwner: TComponent); override;
     destructor Destroy; override;
     Procedure Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);override;
     function BeforeProc(var Message: TMessage):boolean;override;
     procedure AfterProc(var Message: TMessage);override;
     procedure DrawControl( dc:HDC; rc:TRect);override;
  end;

  TSkinBitButton = class(TSkinButton)
  Protected
     procedure DrawGlyph( acanvas:Tcanvas; rc:TRect;
       bmp:Tbitmap;I,N:integer);
     procedure DrawPicControl( dc:HDC; rc:TRect);
  public
     isPicture:boolean;
     PicField:string;
     procedure DrawControl( dc:HDC; rc:TRect);override;
  end;

  TMPBtnType = (btPlay, btPause, btStop, btNext, btPrev, btStep, btBack,
    btRecord, btEject);
  TButtonSet = set of TMPBtnType;
  TMPGlyph = (mgEnabled, mgDisabled, mgColored);
  TMPButton = record
    Visible: Boolean;
    Enabled: Boolean;
    Colored: Boolean;
    Auto: Boolean;
    Bitmaps: array[TMPGlyph] of TBitmap;
  end;

  TWMediaPlayer = Class(TCustompanel)
  private
    procedure WMLButtonDown(Var aMsg: TMessage);message WM_LButtonDown;
//    procedure WMMouseMove(Var aMsg: TMessage);message WM_MouseMove;
//    procedure WMMouseLeave(Var aMsg: TMessage);message WM_MouseLeave;
//    procedure WMLButtonDBClick(Var aMsg: TMessage);message WM_LBUTTONDBLCLK;
    procedure WMLButtonUp(Var aMsg: TMessage);message WM_LButtonUp;
//    procedure WMERASEBKGND(var Msg: TMessage);message WM_ERASEBKGND;
     procedure LoadBitmaps;
     procedure DestroyBitmaps;
     procedure CheckButtons;
     procedure FindButton(XPos, YPos: Integer);
  protected
     Buttons: array[TMPBtnType] of TMPButton;
     count:integer;
     fsd:TSkinData;
     IsDown:boolean;
     BtnClick: TMPBtnType;
     BtnFocuse: TMPBtnType;
     BtnWidth: integer;
     procedure Paint;override;
     procedure DrawButton(acanvas:Tcanvas;Btn:TMPBtnType;R:TRect);
  public
     obj:TWincontrol;
     skincontrol:TSkincontrol;
     constructor Create(AOwner: TComponent); override;
     destructor Destroy; override;
     procedure Attach(askin:TSkinControl;aObj:Twincontrol);
     procedure SetPosition(aObj:Twincontrol);
  end;

  TSkinMP = class(TSkinControl)
  Protected
     mp:TWMediaPlayer;
//     Buttons: array[TMPBtnType] of TMPButton;
//     procedure LoadBitmaps;
//     procedure DestroyBitmaps;
//     procedure DrawGlyph( acanvas:Tcanvas; rc:TRect;
//       bmp:Tbitmap;I,N:integer);
    procedure Unsubclass;override;
    procedure AfterProc(var Message: TMessage);override;
  public
//     constructor Create(AOwner: TComponent); override;
//     destructor Destroy; override;
     Procedure Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);override;
//     procedure DrawControl( dc:HDC; rc:TRect);override;
  end;

  TSkinMenuButton = class(TSkinButton)
  Protected
//     procedure DrawGlyph( acanvas:Tcanvas; rc:TRect;
//       bmp:Tbitmap;I,N:integer);
  public
     procedure DrawControl( dc:HDC; rc:TRect);override;
  end;

  TSkinSpeedButton = class(TSkinBitButton)
  protected
     FReentr : Boolean;  // RF: flag for reentrancy
  public
//     GControl : TGraphicControl;
     gcanvas:Tcanvas;
     constructor Create(AOwner: TComponent); override;
     destructor Destroy; override;
     procedure DrawSpeedbtn( acanvas:Tcanvas; rc:TRect);
     procedure InitGraphicControl(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas);
     procedure AfterProc(var Message: TMessage);override;
     function BeforeProc(var Message: TMessage):boolean;override;
     procedure PaintControl(adc:HDC=0);override;
     procedure WMPaintSpeed(var Message:Tmessage);
  end;

  TSkinCheckBox = class(TSkinControl)
  Protected
     state:integer;
     trans:boolean;
  public
     function BeforeProc(var Message: TMessage):boolean;override;
     procedure AfterProc(var Message: TMessage);override;
     procedure DrawControl( dc:HDC; rc:TRect);override;
     Procedure Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);override;
  end;

  TComboxScrollBar=class;
  TSkinScrollbarH=class;
  TSkinComBox = class(TSkinControl)
  Protected
     dwStyle,ExStyle:longword;
     hlist,hbtn:Thandle;
     isDrop:boolean;
//     box :Tskinscrollbar;
     FBtnObjectInst,FBtnPrevWndProc :pointer;
     vb:TSkinScrollbarH;
     db:TComboxScrollBar;
     info:tagCOMBOBOXINFO;
     rBtn:TRect;
     procedure FindBtn;
     procedure DrawSkinMap3( dc:HDC; rc:TRect;
        bmp:Tbitmap;I,N:integer);
     procedure DrawControl1( dc:HDC; rc:TRect);
     procedure ButtonProc(var Message: TMessage);
     procedure CNCommand(var Message: TWMCommand);
//     procedure FindScrollbar;
     procedure Unsubclass;override;
     procedure DrawEdit( dc:HDC; rc:TRect);
     procedure SkinDropList;
     procedure DeleteDropList;
  public
     constructor Create(AOwner: TComponent); override;
     destructor Destroy; override;
     procedure AfterProc(var Message: TMessage);override;
     procedure DrawControl( dc:HDC; rc:TRect);override;
     Procedure Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);override;
     Procedure Inithwnd(ahwnd:Thandle;sd:TSkinData;acanvas:TCanvas;sf:Tcomponent);override;
  end;

  TSkinRadioButton = class(TSkinControl)
  Protected
     trans:boolean;
  public
     procedure Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);override;
     procedure AfterProc(var Message: TMessage);override;
     function BeforeProc(var Message: TMessage):boolean;override;
     procedure DrawControl( dc:HDC; rc:TRect);override;
  end;

  TSkinStatusBar = class(TSkinControl)
  Protected
     procedure Defaultpaint(acanvas:Tcanvas; rc:TRect;I:integer;
             text:widestring='';Align:TAlignment=taLeftJustify);
     procedure drawitem(dc:HDC; rc:TRect;I:integer;
             text:widestring='';Align:TAlignment=taLeftJustify);
  public
     SizeGrip:boolean;
     function BeforeProc(var Message: TMessage):boolean;override;
     procedure DrawControl( dc:HDC; rc:TRect);override;
  end;

  TSkinBox = class(TSkinControl)
  Protected
  public
     border:integer;
     procedure AfterProc(var Message: TMessage);override;
     Procedure Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);override;
     Procedure Unsubclass; override;
  end;

  TSkinGroupBox = class(TSkinControl)
  Protected
     procedure DefaultDraw( dc:HDC; rc:TRect);
  public
     border:integer;
     procedure Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);override;
     function BeforeProc(var Message: TMessage):boolean;override;
     procedure DrawControl( dc:HDC; rc:TRect);override;
  end;

  TSkinUpDown = class(TSkinControl)
  Protected
     procedure DrawButton(acanvas:Tcanvas;rc:TRect;n,ar:integer);
     procedure DrawSkinButton(dc:HDC;rc:TRect;n,ar:integer);
     procedure DrawBackGround(msg:Tmessage);
  public
     inedit : boolean;
     dir : integer;
     function BeforeProc(var Message: TMessage):boolean;override;
     procedure DrawControl( dc:HDC; rc:TRect);override;
  end;


  TSkinTabPosition = (StTop,Stbottom,Stleft,Stright);
  TSkinTab = class(TSkinControl)
  Protected
     CloseRect: array of TRect;
     Position:TSkinTabPosition;
     unicode:boolean;
     procedure Drawitem( dc:HDC; rc:TRect;I:integer);
     procedure ERASEBKGND( dc:HDC);
     procedure GetPosition;
//     procedure WMPaint(var msg:Tmessage);
     procedure ClipUpdown(dc:HDC;rc:Trect);
     function FindScroll:boolean;
     procedure DrawTabBorder(adc:HDC);
     procedure drawCloseBtn(rc:TRect;i:integer);
     function BeforeProc(var Message: TMessage):boolean;override;
//     procedure AfterProc(var Message: TMessage);override;
     function ClickClose(var Message: TMessage):boolean;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -