WinSubClass.pas
上传用户:xjwsee
上传日期:2008-08-02
资源大小:796k
文件大小:278k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit WinSubClass;
  2. {$I Compilers.inc}
  3. {.$define combobox}
  4. {.$define buttontest}
  5. {.$define resiztest}
  6. {.$define scrollbartest}
  7. {.$define combox}
  8. {$WARNINGS OFF}
  9. {$HINTS OFF}
  10. {$RANGECHECKS OFF}
  11. {$define progress}
  12. interface
  13. uses
  14.   Windows, SysUtils, Classes, Graphics, Controls, ComCtrls,  Forms,
  15.   Menus, Messages, ExtCtrls, StdCtrls, Buttons, CommCtrl,imglist,
  16.   winskindata,tabs,TypInfo,Dialogs,Grids;
  17. const
  18.    CM_Scroll1= 161;
  19.    CM_Scroll2= 513;
  20.    CM_Scroll3= 162;
  21.    CM_Scroll4= 514;
  22.    C_Paramv = 7;
  23.    C_Paramh = 6;
  24.    c_paramB = 1;
  25.    SBM_GETSCROLLBARINFO = 235;
  26. type
  27.   TSkinControlState = ( scMouseIn,scDown);
  28.   TAcControl = class(TControl);
  29.   TAcWinControl = class(TWinControl);
  30.   TAcGraphicControl = class(TGraphicControl);
  31.   TSkinAcListView = class(TCustomListView);
  32.   TSkinScrollbar = class;
  33.   TSkinControl = class(TComponent)
  34.   Protected
  35.      state : set of TSkinControlState;
  36.      fCanvas : TCanvas;
  37.      done:boolean;
  38.      isdraw : boolean;
  39.      enabled : boolean;
  40.      focused : boolean;
  41.      caption : wideString;
  42.      FObjectInst,FPrevWndProc :pointer;
  43.      skinned:boolean;
  44.      isunicode:boolean;
  45.      procedure FillBG( dc:HDC; rc:TRect);
  46.      procedure FillParentBG( dc:HDC; rc:TRect);
  47.      procedure doLogMsg(aid:string;msg:TMessage);
  48.      procedure Default(Var Msg: TMessage);
  49.      procedure Invalidate;
  50.      procedure WMPaint(message:TMessage);
  51.      procedure WMERASEBKGND(var Msg: TMessage);
  52.      function GetWindowLongEx(ahWnd: HWND; nIndex: Integer): Longint;
  53.      procedure SetParentBK(value:boolean);
  54.      procedure DrawFocus(hDC: HDC; wString: WideString; rc: TRect; uFormat: UINT);
  55. //     procedure Notification(AComponent: TComponent;Operation: TOperation);override;
  56.   public
  57.      fsd: TSkinData;
  58.      hwnd : HWND;
  59.      OldWndProc: TWndMethod;
  60.      control:Twincontrol;
  61.      boundsrect:Trect;
  62.      GControl : TGraphicControl;
  63.      newColor:boolean;
  64.      oldcolor:Tcolor;
  65.      Inited:boolean;
  66.      skinstate : integer;
  67.      skinform: Tcomponent;
  68.      kind :integer;
  69.      sizing:boolean;
  70.      parentbk:boolean;
  71.      constructor Create(AOwner: TComponent); override;
  72.      destructor Destroy; override;
  73.      Procedure Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);virtual;
  74.      Procedure Inithwnd(ahwnd:Thandle;sd:TSkinData;acanvas:TCanvas;sf:Tcomponent);virtual;
  75.      procedure MouseLeave;
  76.      Procedure Unsubclass; virtual;
  77.      procedure NewWndProc(var Message: TMessage);
  78.      function BeforeProc(var Message: TMessage):boolean;virtual;
  79.      procedure AfterProc(var Message: TMessage);virtual;
  80.      procedure PaintControl(adc:HDC=0);virtual;
  81.      procedure DrawControl( dc:HDC; rc:TRect);Virtual;
  82.      Procedure SkinChange; Virtual;
  83.      function  GetState:integer;Virtual;
  84.      Procedure SetColor;
  85.      Procedure RestoreColor;
  86.      procedure DrawBMPSkin( abmp:Tbitmap;rc:TRect;aObject:TdataSkinObject;
  87.               I,N:integer;trans:integer);
  88.      procedure DrawSkinMap( dc:HDC; rc:TRect;
  89.         aObject:TdataSkinObject;I,N:integer);
  90.      procedure DrawSkinMap1( dc:HDC; rc:TRect;
  91.        bmp:Tbitmap;I,N:integer);
  92.      procedure DrawSkinMap2( dc:HDC; rc:TRect;
  93.        bmp:Tbitmap;I,N:integer);
  94.      procedure DrawSkin( rc:TRect;aObject:TdataSkinObject;
  95.                    I,N:integer;trans:integer);
  96.      procedure DrawSkinMap3( acanvas:Tcanvas; rc:TRect;
  97.         bmp:Tbitmap;I,N:integer);
  98.      procedure DrawBuf( dc:HDC; rc:TRect);
  99.      procedure DrawCaption(acanvas: TCanvas; rc:TRect;text:widestring;
  100.              enabled,defaulted:boolean;Alignment:word=DT_CENTER);
  101.      procedure DrawImgCaption(acanvas: TCanvas; rc:TRect;
  102.            ImgList:hImageList;imgIndex:integer;text:widestring;talign:integer=DT_CENTER);
  103.      function TextHeight(dc:HDC;const s: string):integer;
  104.      function GetParentColor(acolor:Tcolor):Tcolor;
  105.      function CheckBiDi(dw:dword):dword;
  106.   end;
  107.   TArrowButton = Class(TCustomControl)
  108.   private
  109.     procedure WMLButtonDown(Var aMsg: TMessage);message WM_LButtonDown;
  110.     procedure WMLButtonUP(Var aMsg: TMessage);message WM_LButtonUP;
  111. //    procedure WMERASEBKGND(var Msg: TMessage);message WM_ERASEBKGND;
  112.     procedure CMMouseEnter(Var aMsg: TMessage);message CM_MOUSEENTER;
  113.     procedure CMMouseLeave(Var aMsg: TMessage);message CM_MOUSELEAVE;
  114.   protected
  115.     procedure Paint; override;
  116.   public
  117.     cw:integer;
  118.     control:TWincontrol;
  119.     obj:TSkinControl;
  120.     hwnd :Thandle;
  121.     state : set of TSkinControlState;
  122.     constructor Create(AOwner: TComponent); override;
  123.     destructor Destroy; override;
  124.     procedure Attach(aobj:Tskincontrol;acontrol:Twincontrol);
  125.     procedure MoveArrow( r:TRect);
  126.   end;
  127.   TSkinDateTime = Class(TSkinControl)
  128.   private
  129.   protected
  130.      arrow:TArrowButton;
  131.      procedure AfterProc(var Message: TMessage);override;
  132.      procedure DrawControl( dc:HDC; rc:TRect);override;
  133.   public
  134.      destructor Destroy; override;
  135.      procedure Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);override;
  136.   end;
  137.   TWScrollbar = Class(TCustompanel)
  138.   private
  139.     procedure WMLButtonDown(Var aMsg: TMessage);message WM_LButtonDown;
  140.     procedure WMMouseMove(Var aMsg: TMessage);message WM_MouseMove;
  141.     procedure WMMouseLeave(Var aMsg: TMessage);message WM_MouseLeave;
  142.     procedure WMLButtonDBClick(Var aMsg: TMessage);message WM_LBUTTONDBLCLK;
  143.     procedure WMLButtonUp(Var aMsg: TMessage);message WM_LButtonUp;
  144.     procedure WMERASEBKGND(var Msg: TMessage);message WM_ERASEBKGND;
  145.   protected
  146.     Len:Integer;
  147.     thumbTop,thumbbottom:integer;
  148.     OffsetSC,trackp:tpoint;
  149.     trackthumb:integer;
  150.     fdown:boolean;
  151.     sbDir:integer;
  152.     ERASEBKGND:boolean;
  153.     scrollpos:integer;
  154.     procedure Paint; override;
  155.     procedure GetThumb(rc:TRect);
  156.     function GetScrollPos(p:Tpoint):integer;
  157.     function GetControlInfo(var info:tagScrollBarInfo):boolean;
  158.     function GetControlInfo2(var info:tagScrollBarInfo):boolean;
  159.     procedure CreateParams(var Params: TCreateParams);override;
  160.   public
  161.     CW:integer;
  162.     hwnd:Thandle;
  163.     control:TWincontrol;
  164.     obj:TSkinControl;
  165.     sbType:byte;
  166.     sbRect:Trect;
  167. //    scrollpos:integer;
  168.     sbVisible:boolean;
  169.     constructor Create(AOwner: TComponent); override;
  170.     destructor Destroy; override;
  171.     procedure Attach(aobj:TSkinControl;aControl:Twincontrol;aType:byte);
  172.     procedure AttachHwnd(aobj:TSkinControl;ahwnd:Thandle;aType:byte);
  173.     procedure SetPosition(ahwnd:Thandle);
  174.     procedure ButtonUp;
  175.     procedure HideScrollbar;
  176.     procedure DoLog(Message: TMessage);
  177.   end;
  178.   TSkinButton = class(TSkinControl)
  179.   Protected
  180.      btemp:Tbitmap;
  181.      MultiLine:boolean;
  182.      trans:boolean;
  183.      redraw:boolean;
  184.      isdefault:boolean;
  185.      procedure DrawBtnText(acanvas: TCanvas; rc:TRect;
  186.                text:String; Alignment:word=DT_CENTER);
  187.      procedure DoMouseDown(var Message: TWMMouse);
  188.      procedure WMEnable(var Message: TMessage);
  189.      procedure SetRedraw(b:boolean);
  190.      function GetFontColor(var acolor:Tcolor):boolean;
  191.   public
  192.      constructor Create(AOwner: TComponent); override;
  193.      destructor Destroy; override;
  194.      Procedure Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);override;
  195.      function BeforeProc(var Message: TMessage):boolean;override;
  196.      procedure AfterProc(var Message: TMessage);override;
  197.      procedure DrawControl( dc:HDC; rc:TRect);override;
  198.   end;
  199.   TSkinBitButton = class(TSkinButton)
  200.   Protected
  201.      procedure DrawGlyph( acanvas:Tcanvas; rc:TRect;
  202.        bmp:Tbitmap;I,N:integer);
  203.      procedure DrawPicControl( dc:HDC; rc:TRect);
  204.   public
  205.      isPicture:boolean;
  206.      PicField:string;
  207.      procedure DrawControl( dc:HDC; rc:TRect);override;
  208.   end;
  209.   TMPBtnType = (btPlay, btPause, btStop, btNext, btPrev, btStep, btBack,
  210.     btRecord, btEject);
  211.   TButtonSet = set of TMPBtnType;
  212.   TMPGlyph = (mgEnabled, mgDisabled, mgColored);
  213.   TMPButton = record
  214.     Visible: Boolean;
  215.     Enabled: Boolean;
  216.     Colored: Boolean;
  217.     Auto: Boolean;
  218.     Bitmaps: array[TMPGlyph] of TBitmap;
  219.   end;
  220.   TWMediaPlayer = Class(TCustompanel)
  221.   private
  222.     procedure WMLButtonDown(Var aMsg: TMessage);message WM_LButtonDown;
  223. //    procedure WMMouseMove(Var aMsg: TMessage);message WM_MouseMove;
  224. //    procedure WMMouseLeave(Var aMsg: TMessage);message WM_MouseLeave;
  225. //    procedure WMLButtonDBClick(Var aMsg: TMessage);message WM_LBUTTONDBLCLK;
  226.     procedure WMLButtonUp(Var aMsg: TMessage);message WM_LButtonUp;
  227. //    procedure WMERASEBKGND(var Msg: TMessage);message WM_ERASEBKGND;
  228.      procedure LoadBitmaps;
  229.      procedure DestroyBitmaps;
  230.      procedure CheckButtons;
  231.      procedure FindButton(XPos, YPos: Integer);
  232.   protected
  233.      Buttons: array[TMPBtnType] of TMPButton;
  234.      count:integer;
  235.      fsd:TSkinData;
  236.      IsDown:boolean;
  237.      BtnClick: TMPBtnType;
  238.      BtnFocuse: TMPBtnType;
  239.      BtnWidth: integer;
  240.      procedure Paint;override;
  241.      procedure DrawButton(acanvas:Tcanvas;Btn:TMPBtnType;R:TRect);
  242.   public
  243.      obj:TWincontrol;
  244.      skincontrol:TSkincontrol;
  245.      constructor Create(AOwner: TComponent); override;
  246.      destructor Destroy; override;
  247.      procedure Attach(askin:TSkinControl;aObj:Twincontrol);
  248.      procedure SetPosition(aObj:Twincontrol);
  249.   end;
  250.   TSkinMP = class(TSkinControl)
  251.   Protected
  252.      mp:TWMediaPlayer;
  253. //     Buttons: array[TMPBtnType] of TMPButton;
  254. //     procedure LoadBitmaps;
  255. //     procedure DestroyBitmaps;
  256. //     procedure DrawGlyph( acanvas:Tcanvas; rc:TRect;
  257. //       bmp:Tbitmap;I,N:integer);
  258.     procedure Unsubclass;override;
  259.     procedure AfterProc(var Message: TMessage);override;
  260.   public
  261. //     constructor Create(AOwner: TComponent); override;
  262. //     destructor Destroy; override;
  263.      Procedure Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);override;
  264. //     procedure DrawControl( dc:HDC; rc:TRect);override;
  265.   end;
  266.   TSkinMenuButton = class(TSkinButton)
  267.   Protected
  268.      procedure DrawGlyph( acanvas:Tcanvas; rc:TRect;
  269.        bmp:Tbitmap;I,N:integer);
  270.   public
  271.      procedure DrawControl( dc:HDC; rc:TRect);override;
  272.   end;
  273.   TSkinSpeedButton = class(TSkinBitButton)
  274.   protected
  275.      FReentr : Boolean;  // RF: flag for reentrancy
  276.      procedure DrawPicbtn( acanvas:Tcanvas; rc:TRect);
  277.   public
  278. //     GControl : TGraphicControl;
  279.      PicField:string;
  280.      gcanvas:Tcanvas;
  281.      constructor Create(AOwner: TComponent); override;
  282.      destructor Destroy; override;
  283.      procedure DrawSpeedbtn( acanvas:Tcanvas; rc:TRect);
  284.      procedure InitGraphicControl(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas);
  285.      procedure AfterProc(var Message: TMessage);override;
  286.      function BeforeProc(var Message: TMessage):boolean;override;
  287.      procedure PaintControl(adc:HDC=0);override;
  288.      procedure WMPaintSpeed(var Message:Tmessage);
  289.   end;
  290.   TSkinCheckBox = class(TSkinControl)
  291.   Protected
  292.      state:integer;
  293.      trans:boolean;
  294.   public
  295.      function BeforeProc(var Message: TMessage):boolean;override;
  296.      procedure AfterProc(var Message: TMessage);override;
  297.      procedure DrawControl( dc:HDC; rc:TRect);override;
  298.      Procedure Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);override;
  299.   end;
  300.   TComboxScrollBar=class;
  301.   TSkinScrollbarH=class;
  302.   TSkinComBox = class(TSkinControl)
  303.   Protected
  304.      dwStyle,ExStyle:longword;
  305.      hlist,hbtn:Thandle;
  306.      isDrop:boolean;
  307. //     box :Tskinscrollbar;
  308.      FBtnObjectInst,FBtnPrevWndProc :pointer;
  309.      vb:TSkinScrollbarH;
  310.      db:TComboxScrollBar;
  311.      info:tagCOMBOBOXINFO;
  312.      rBtn:TRect;
  313.      procedure FindBtn;
  314.      procedure DrawSkinMap3( dc:HDC; rc:TRect;
  315.         bmp:Tbitmap;I,N:integer);
  316.      procedure DrawControl1( dc:HDC; rc:TRect);
  317.      procedure ButtonProc(var Message: TMessage);
  318.      procedure CNCommand(var Message: TWMCommand);
  319. //     procedure FindScrollbar;
  320.      procedure Unsubclass;override;
  321.      procedure DrawEdit( dc:HDC; rc:TRect);
  322.      procedure SkinDropList;
  323.      procedure DeleteDropList;
  324.      procedure DrawBorder( dc:HDC; rc:TRect);
  325.      procedure DrawArrow( dc:HDC; rc:TRect;i:integer);
  326.   public
  327.      HasButton:boolean;
  328.      constructor Create(AOwner: TComponent); override;
  329.      destructor Destroy; override;
  330.      procedure AfterProc(var Message: TMessage);override;
  331.      procedure DrawControl( dc:HDC; rc:TRect);override;
  332.      Procedure Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);override;
  333.      Procedure Inithwnd(ahwnd:Thandle;sd:TSkinData;acanvas:TCanvas;sf:Tcomponent);override;
  334.   end;
  335.   TSkinRadioButton = class(TSkinControl)
  336.   Protected
  337.      trans:boolean;
  338.   public
  339.      procedure Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);override;
  340.      procedure AfterProc(var Message: TMessage);override;
  341.      function BeforeProc(var Message: TMessage):boolean;override;
  342.      procedure DrawControl( dc:HDC; rc:TRect);override;
  343.   end;
  344.   TSkinStatusBar = class(TSkinControl)
  345.   Protected
  346.      procedure Defaultpaint(acanvas:Tcanvas; rc:TRect;I:integer;
  347.              text:widestring='';Align:TAlignment=taLeftJustify);
  348.      procedure drawitem(dc:HDC; rc:TRect;I:integer;
  349.              text:widestring='';Align:TAlignment=taLeftJustify);
  350.   public
  351.      SizeGrip:boolean;
  352.      function BeforeProc(var Message: TMessage):boolean;override;
  353.      procedure DrawControl( dc:HDC; rc:TRect);override;
  354.   end;
  355.   TSkinBox = class(TSkinControl)
  356.   Protected
  357.   public
  358.      border:integer;
  359.      procedure AfterProc(var Message: TMessage);override;
  360.      Procedure Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);override;
  361.      Procedure Unsubclass; override;
  362.   end;
  363.   TSkinGroupBox = class(TSkinControl)
  364.   Protected
  365.      procedure DefaultDraw( dc:HDC; rc:TRect);
  366.   public
  367.      border:integer;
  368.      procedure Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);override;
  369.      function BeforeProc(var Message: TMessage):boolean;override;
  370.      procedure DrawControl( dc:HDC; rc:TRect);override;
  371.   end;
  372.   TSkinUpDown = class(TSkinControl)
  373.   Protected
  374.      procedure DrawButton(acanvas:Tcanvas;rc:TRect;n,ar:integer);
  375.      procedure DrawSkinButton(dc:HDC;rc:TRect;n,ar:integer);
  376.      procedure DrawBackGround(msg:Tmessage);
  377.   public
  378.      inedit : boolean;
  379.      dir : integer;
  380.      function BeforeProc(var Message: TMessage):boolean;override;
  381.      procedure DrawControl( dc:HDC; rc:TRect);override;
  382.   end;
  383.   TSkinTabPosition = (StTop,Stbottom,Stleft,Stright);
  384.   TSkinTab = class(TSkinControl)
  385.   Protected
  386.      CloseRect: array of TRect;
  387.      Position:TSkinTabPosition;
  388.      unicode:boolean;
  389.      procedure Drawitem( dc:HDC; rc:TRect;I:integer);
  390.      procedure ERASEBKGND( dc:HDC);
  391.      procedure GetPosition;
  392. //     procedure WMPaint(var msg:Tmessage);
  393.      procedure ClipUpdown(dc:HDC;rc:Trect);
  394.      function FindScroll:boolean;
  395.      procedure DrawTabBorder(adc:HDC);
  396.      procedure drawCloseBtn(rc:TRect;i:integer);
  397.      function BeforeProc(var Message: TMessage):boolean;override;
  398. //     procedure AfterProc(var Message: TMessage);override;
  399.      function ClickClose(var Message: TMessage):boolean;
  400.   public
  401.      tabbmp,borderbmp : Tbitmap;
  402.      Drawtemp: Tbitmap;
  403.      updown:TskinUpdown;
  404.      showclose:boolean;
  405.      constructor Create(AOwner: TComponent); override;
  406.      destructor Destroy; override;
  407.      procedure DrawControl( dc:HDC; rc:TRect);override;
  408. //     function  BeforeProc(var Message: TMessage):boolean;override;
  409.      Procedure Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);override;
  410.      Procedure Inithwnd(ahwnd:Thandle;sd:TSkinData;acanvas:TCanvas;sf:Tcomponent);override;
  411.      Procedure inittab;
  412.      Procedure SkinChange;override;
  413.   end;
  414.   TSkinTab31 = class(TSkinControl)
  415.   Protected
  416.      tabbmp:Tbitmap;
  417.      updown:TskinUpdown;
  418.      scroller : Twincontrol;
  419.   public
  420.      constructor Create(AOwner: TComponent); override;
  421.      destructor Destroy; override;
  422.      function BeforeProc(var Message: TMessage):boolean;override;
  423.      procedure DrawControl( dc:HDC; rc:TRect);override;
  424.      //Procedure Inithwnd(ahwnd:Thandle;sd:TSkinData;acanvas:TCanvas;sf:Tcomponent);override;
  425.      Procedure Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);override;
  426.      Procedure inittab;
  427.      Procedure SkinChange;override;
  428.   end;
  429.   TSkinTabBtn = class(TSkinControl)
  430.   protected
  431.   public
  432.      function BeforeProc(var Message: TMessage):boolean;override;
  433.      procedure DrawControl( dc:HDC; rc:TRect);override;
  434.   end;
  435.   TSkinTransObj = class(TSkinControl)
  436.   Protected
  437.      procedure ERASEBKGND( dc:HDC);
  438.   public
  439. //     Brush,Oldbrush: HBrush;
  440.      function BeforeProc(var Message: TMessage):boolean;override;
  441.      procedure AfterProc(var Message: TMessage);override;
  442.   end;
  443.   TSkinProgress = class(TSkinControl)
  444.   Protected
  445.   public
  446.      function BeforeProc(var Message: TMessage):boolean;override;
  447.      procedure DrawControl1( dc:HDC; rc:TRect);
  448.      procedure DrawControl( dc:HDC; rc:TRect);override;
  449.   end;
  450.   TSkinTrackBar = class(TSkinControl)
  451.   Protected
  452.      procedure Drawthumb(PDraw:PNMCustomDraw);
  453.      function CustomDraw(PDraw:PNMCustomDraw):integer;
  454.      procedure DrawTrack(PDraw:PNMCustomDraw);
  455.   public
  456.      procedure Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);override;
  457.      procedure skinchange;override;
  458.      procedure Unsubclass;override;
  459.      function BeforeProc(var Message: TMessage):boolean;override;
  460.   end;
  461.   TSkinToolbar = class(TSkinControl)
  462.   Protected
  463.     gradCol1,gradCol2:integer;
  464. //     procedure Drawthumb(PDraw:PNMCustomDraw);
  465. //     function CustomDraw(PDraw:PNMCustomDraw):integer;
  466.      procedure ERASEBKGND(msg:Tmessage);
  467.   public
  468.      function BeforeProc(var Message: TMessage):boolean;override;
  469.      Procedure Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);override;
  470.   end;
  471.   TSkinEdit = class(TSkinControl)
  472.   Protected
  473.      procedure FindUPDown(ahwnd:Thandle;sd:TSkinData;acanvas:TCanvas);
  474.      procedure DrawControl1( dc:HDC; rc:TRect);
  475.      procedure PaintControl1(adc:HDC=0);
  476.   public
  477.      updown:TSkinUpDown;
  478. //     procedure Init(aControl:Twincontrol;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);override;
  479. //     procedure Inithwnd(ahwnd:Thandle;sd:TSkinData;acanvas:TCanvas);override;
  480.      procedure AfterProc(var Message: TMessage);override;
  481.      procedure DrawControl( dc:HDC; rc:TRect);override;
  482.   end;
  483.   TSkinSizer = class(TSkinControl)
  484.   Protected
  485.   public
  486. //      Procedure Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);override;
  487.       function BeforeProc(var Message: TMessage):boolean;override;
  488.       procedure DrawControl( dc:HDC; rc:TRect);override;
  489.   end;
  490.   TSkinBoxH = class(TSkinControl)
  491.   Protected
  492.   public
  493.       function BeforeProc(var Message: TMessage):boolean;override;
  494. //      procedure DrawControl( dc:HDC; rc:TRect);override;
  495.   end;
  496.   TSkinTabSheet = class(TSkinControl)
  497.   Protected
  498.   public
  499.       procedure DrawControl( dc:HDC; rc:TRect);override;
  500. //      Procedure Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);override;
  501.       function BeforeProc(var Message: TMessage):boolean;override;
  502.   end;
  503.   TSkinObjImage = class(TSkinControl)
  504.   Protected
  505.      procedure ChangeImage;
  506.      procedure SetRzImage;
  507.      procedure SetRzRadio;
  508.      procedure SetDevCheck;
  509.   public
  510.      kind:integer;
  511.      procedure Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);override;
  512.      procedure SkinChange; override;
  513.      procedure Unsubclass; override;
  514.   end;
  515.   TSkinAdvPage = class(TSkinControl)
  516.   Protected
  517.      updown:TskinUpdown;
  518.      procedure ChangeImage;
  519.      procedure SetAdvPage;
  520.      function FindScroll:boolean;
  521.   public
  522.      kind:integer;
  523.      procedure Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);override;
  524.      procedure SkinChange; override;
  525.      procedure Unsubclass; override;
  526.      procedure DrawControl( dc:HDC; rc:TRect);override;
  527.   end;
  528.   TScrollBarPos = record
  529.       Btn:integer;
  530.       ScrollArea:integer;
  531.       Thumb:integer;
  532.       ThumbPos:integer;
  533.       MsgID:integer;
  534.   end;
  535.   TSkinScroll=(HB,VB);
  536.   TSkinScrollBar = Class(TSkinControl)
  537.   protected
  538.     nobe:boolean;
  539.     procedure AfterProc(var Message: TMessage);override;
  540.     function BeforeProc(var Message: TMessage):boolean;override;
  541.     procedure SetScrollbarPos(message:TMessage);
  542.     procedure Unsubclass;override;
  543.     procedure DrawBorder( dc:HDC; rc:TRect);
  544.     procedure BENCPAINT(adc:HDC);
  545.   public
  546.     hb,vb:TWscrollbar;
  547.     postype:integer;
  548.     painted:boolean;
  549.     border:boolean;
  550.     constructor Create(AOwner: TComponent); override;
  551.     destructor Destroy; override;
  552.     procedure InitScrollbar(acontrol:Twincontrol;sd:TSkinData;acanvas:TCanvas;sf:Tcomponent);virtual;
  553.     procedure DrawControl( dc:HDC; rc:TRect);override;
  554.     procedure SkinChange;override;
  555.   end;
  556.   TComboxScrollBar = Class(TSkinControl)
  557.   protected
  558.     nobe:boolean;
  559.     cw,len:integer;
  560.     scrollpos:integer;
  561.     thumbtop,thumbBottom:integer;
  562.     OffsetSC,trackp:tpoint;
  563.     trackthumb:integer;
  564.     fdown:boolean;
  565.     sbDir:integer;
  566.     procedure AfterProc(var Message: TMessage);override;
  567.     function BeforeProc(var Message: TMessage):boolean;override;
  568. //    procedure SetScrollbarPos(message:TMessage);
  569.     procedure PaintScrollbar( dc:HDC; rc:TRect; sbtype:integer );
  570.     procedure Unsubclass;override;
  571.     procedure GetThumb(rc:TRect);
  572.     function WMNCPaint(var message:TMessage):boolean;
  573.     function NCLButtonDown(var Message: TMessage):boolean;
  574.   public
  575.     postype:integer;
  576.     painted:boolean;
  577.     border:boolean;
  578. //    Info:array[HB..VB] of SCROLLINFO;
  579.     constructor Create(AOwner: TComponent); override;
  580.     destructor Destroy; override;
  581.     procedure DrawControl( dc:HDC; rc:TRect);override;
  582.   end;
  583.   TSkinScrollBarH = Class(TSkinControl)
  584.   protected
  585.     procedure AfterProc(var Message: TMessage);override;
  586.     procedure SetScrollbarPos(message:TMessage);
  587.     procedure Unsubclass;override;
  588.   public
  589.     hb,vb:TWscrollbar;
  590.     postype:integer;
  591.     constructor Create(AOwner: TComponent); override;
  592.     destructor Destroy; override;
  593.     procedure Inithwnd(ahwnd:Thandle;sd:TSkinData;acanvas:TCanvas;sf:Tcomponent);override;
  594.     procedure DrawControl( dc:HDC; rc:TRect);override;
  595.   end;
  596.   TSkinScControl = class(TSkinControl)
  597.   protected
  598.      downBtn:integer;
  599.      SP: TScrollBarPos;
  600.      sb:TWscrollbar;
  601.      procedure AfterProc(var Message: TMessage);override;
  602.   public
  603.      procedure DrawControl( dc:HDC; rc:TRect);override;
  604.      procedure InitScrollbar(acontrol:Twincontrol;sd:TSkinData;acanvas:TCanvas;sf:Tcomponent);
  605.      procedure Unsubclass;override;
  606.      destructor Destroy;override;
  607.   end;
  608. {  TSkinSCeControl = class(TSkinControl)
  609.   protected
  610.      sb:TEscrollbar;
  611.      sceControl:Tcontrol;
  612.      procedure AfterProc(var Message: TMessage);override;
  613.   public
  614.      procedure DrawControl( dc:HDC; rc:TRect);override;
  615.      procedure InitScrollbar(acontrol:Twincontrol;ascrollbar:Tcontrol;aType:integer;
  616.                              sd:TSkinData;sf:Tcomponent);
  617.      procedure Unsubclass;override;
  618.   end;}
  619.   TSkinHeader = class(TSkinControl)
  620.   protected
  621.      Items:array of TRect;
  622.      indexitem:integer;
  623. //     trackinfo : TTrackMouseEvent;
  624.      procedure WMMouseMove(var Message: TMessage);
  625.      procedure DrawItem(ImgList:hImageList;acanvas:Tcanvas;rc:Trect;index:Integer);
  626.      procedure DrawItemImgCaption(acanvas: TCanvas; rc:TRect;
  627.                 ImgList:hImageList;imgIndex:integer;text:widestring;talign:integer=DT_CENTER);
  628.   public
  629.      destructor Destroy;override;
  630.      procedure Inithwnd(ahwnd:Thandle;sd:TSkinData;acanvas:TCanvas;sf:Tcomponent);override;
  631.      procedure Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);override;
  632.      function BeforeProc(var Message: TMessage):boolean;override;
  633.      procedure AfterProc(var Message: TMessage);override;
  634.      procedure DrawControl( dc:HDC; rc:TRect);override;
  635.   end;
  636.   TSkinListView = class(TSkinScrollBar)
  637.   protected
  638.      FHeaderInstance: Pointer;
  639.      FDefHeaderProc: Pointer;
  640.      hHwnd: THandle;
  641.      header:Tskinheader;
  642.      procedure SetHeaderOwnerDraw;
  643.      procedure DrawHeaderItem(DrawItemStruct: TDrawItemStruct);
  644.      procedure Drawheader;
  645.      procedure drawitem(dc:HDC; rc:TRect;acolumn:TListColumn);
  646.      procedure WMNotify(var Message:TWMNotify);
  647.   public
  648.      Procedure InitScrollbar(acontrol:Twincontrol;sd:TSkinData;acanvas:TCanvas;sf:Tcomponent);override;
  649. //     function BeforeProc(var Message: TMessage):boolean;override;
  650.      procedure HeaderProc(var Message: TMessage);
  651.   end;
  652. function  GetProperty(control: TObject ;aprop:string):string;
  653. function  GetIntProperty(control: TObject ;aprop:string):integer;
  654. function  GetEnumProperty(control: TObject;aprop:string):string;
  655. function  GetStringProp(control: TObject;aprop:string):widestring;
  656. function GetObjProp(control: TObject;aprop:string; MinClass: TClass):Tobject;
  657. function  GetObjMethod(control: TObject;aprop:string): TMethod;
  658. procedure  SetProperty(control: TObject;aprop,value:string);
  659. function StringReplaceW(s,s1,s2:widestring):widestring;
  660. procedure CopyBMP(src:Tbitmap;var dst:Tbitmap);
  661. procedure FillColor( dc:HDC; rc:TRect;acolor:Tcolor);
  662. function GetDisableImg(FOriginal:TBitmap):Tbitmap;
  663. procedure DrawArrow(ACanvas: TCanvas; X, Y, Orientation: integer);
  664. procedure MyDrawCaption(acanvas: TCanvas; rc:TRect;
  665.  text:widestring; enabled,defaulted:boolean;Alignment: TAlignment=taCenter);
  666. procedure MyDrawImgCaption(acanvas: TCanvas; rc:TRect;
  667.  ImgList:TCustomImageList;imgIndex:integer;
  668.  text:string; enabled,defaulted:boolean;Alignment: TAlignment=taCenter);
  669.  //{$R MPLAYER}
  670. implementation
  671. uses ImgUtil,WinSkinForm,winskindlg;
  672. const _maxcaption = 80;
  673. function IsPopupWindow(hwnd:Thandle):boolean;
  674. var style:dword;
  675. begin
  676.    style:= GetWindowLong(hWnd,GWL_STYLE);
  677.    result:=false;
  678.    if (style and ws_popup)>0 then result:=true;
  679.    if GetParent(hWnd)=65556 then result:=true;
  680. end;
  681. procedure CopyBMP(src:Tbitmap;var dst:Tbitmap);
  682. begin
  683.     dst.Width:=src.Width;
  684.     dst.Height:=src.Height;
  685.     dst.PixelFormat:=src.PixelFormat;
  686.     dst.Canvas.Draw(0,0,src);
  687. end;
  688. function GetFormCaption(ahwnd:Thandle):widestring;
  689. var  buf:array[0..1000] of char;
  690. begin
  691.   result:='';
  692.   if Win32PlatformIsUnicode then begin
  693.     SetLength(Result, GetWindowTextLengthW(ahwnd) + 1);
  694.     GetWindowTextW(ahwnd, PWideChar(Result), Length(Result));
  695.     SetLength(Result, Length(Result) - 1);
  696.   end else begin
  697.      sendmessage(ahwnd,WM_GETTEXT,1000,integer(@buf));
  698.      result:=strpas(buf);
  699.   end;
  700. end;
  701. {procedure TControlSubClass.winpaint(var Message: TMessage);
  702. var  DC: HDC;
  703.   PS: TPaintStruct;
  704.   hwnd : Thandle;
  705. begin
  706.      hwnd:=Twincontrol(control).handle;
  707.      canvas.handle := BeginPaint(hwnd, ps);
  708.      PaintControl;
  709.      if not done then orgWindowProc(Message);
  710.      EndPaint(hwnd, ps);
  711.      Canvas.Handle := 0;
  712.      message.result:=0;
  713.   Canvas.Lock;
  714.   try
  715.     Canvas.Handle := message.wparam;
  716.     try
  717.      PaintControl;
  718.     finally
  719.     end;
  720.   finally
  721.     Canvas.Unlock;
  722.   end;
  723.   message.result:=0;
  724. end;}
  725. constructor TSkinControl.Create(AOwner: TComponent);
  726. begin
  727.    inherited create(aowner);
  728.    hwnd:=0;
  729.    Gcontrol := nil;
  730.    control := nil;
  731.    inited:=false;
  732.    skinstate:=0;
  733.    skinform:=nil;
  734.    isunicode:=false;
  735.    skinned:=true;
  736.    kind :=0;
  737.    sizing:=false;
  738.    parentbk:=false;
  739. end;
  740. //in Tfrom : skincontrol will destory when owner (control) is destory
  741. //in Hwnd window : skincontrol will destory when capture wm_ncdestory message
  742. //Unsubclass : used for unskin, restore old color.
  743. Procedure TSkinControl.Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);
  744. begin
  745.    if inited then exit;
  746.    newcolor:=acolor;
  747.    fsd:=sd;
  748.    skinform:=sf;
  749.    fCanvas:=acanvas;
  750.    control:=Twincontrol(owner);
  751.    hwnd := control.handle;
  752.    isunicode:=IsWindowUnicode(hwnd);
  753.    
  754.    OldWndProc:= Control.WindowProc;
  755.    Control.WindowProc := NewWndProc;
  756. //   control.DoubleBuffered:=true;
  757.    Twinskinform(skinform).addcontrollist(self);
  758. //   Focused := (GetFocus= hWnd);
  759. //   enabled := (GetWindowLong(hWnd,GWL_STYLE) and WS_DISABLED)=0;
  760. //   caption:=getformcaption(hwnd);
  761.    if newcolor then begin
  762.       setparentbk(true);
  763.       oldcolor:=Taccontrol(control).color;
  764.       Taccontrol(control).color:=fsd.colors[csButtonFace];
  765.    end;
  766.    if parentbk then kind:=1;
  767.    control.Invalidate;
  768.    inited:=true;
  769.    skinstate:=skin_active;
  770. end;
  771. Procedure TSkinControl.SetColor;
  772. begin
  773. end;
  774. Procedure TSkinControl.SetParentBK(value:boolean);
  775. var  PropInfo:PPropInfo;
  776.      s:string;
  777. begin
  778. {$ifdef DELPHI_7}
  779.      if xoParentBackGround in fsd.options then exit;
  780.      if control=nil then exit;
  781.      PropInfo:=GetPropInfo(control,'ParentBackground');
  782.      if PropInfo<>nil then  begin
  783.         if value then begin
  784.           s:=lowercase(GetEnumProp(control,PropInfo));
  785.           if s='true' then parentbk:=true
  786.           else parentbk:=false;
  787.           if parentbk then
  788.              SetProperty(control,'ParentBackground','False');
  789.         end else begin
  790.           if parentbk then
  791.              SetProperty(control,'ParentBackground','True');
  792.         end;
  793.      end;
  794. {$endif}
  795. end;
  796. Procedure TSkinControl.RestoreColor;
  797. begin
  798. end;
  799. Procedure TSkinControl.Inithwnd(ahwnd:Thandle;sd:TSkinData;acanvas:TCanvas;sf:Tcomponent);
  800. begin
  801.    fsd:=sd;
  802.    fCanvas:=acanvas;
  803.    skinform:=sf;
  804.    hwnd := ahwnd;
  805.    enabled:=true;
  806.    kind := 0;
  807.    Twinskinform(skinform).addcontrollist(self);
  808.    isunicode:=IsWindowUnicode(hwnd);
  809.    caption:=getformcaption(hwnd);
  810.    FObjectInst := MakeObjectInstance(NewWndProc);
  811.    if isunicode then begin
  812.       FPrevWndProc := Pointer(GetWindowLongw(hwnd,GWL_WNDPROC));
  813.       SetWindowLongw(hwnd, GWL_WNDPROC,LongInt(FObjectInst));
  814.    end else begin
  815.       FPrevWndProc := Pointer(GetWindowLong(hwnd,GWL_WNDPROC));
  816.       SetWindowLong(hwnd, GWL_WNDPROC,LongInt(FObjectInst));
  817.    end;
  818.    if hwnd<>0 then
  819.       InvalidateRect(hwnd, 0,true)  ;
  820.    inited := true;
  821.    skinstate:=skin_active;
  822. end;
  823. Procedure TSkinControl.Unsubclass;
  824. begin
  825.    if not skinned then exit;
  826.    skinned:=false;
  827.    if  skinstate=skin_deleted then exit;
  828.    if newcolor and (control<>nil) then begin
  829.         setparentbk(false);
  830.         Taccontrol(control).color:=oldcolor;
  831.    end;
  832. end;
  833. Procedure TSkinControl.SkinChange;
  834. begin
  835.    if newcolor and (control<>nil) then
  836.      Taccontrol(control).color:=fsd.colors[csButtonFace];
  837.    Invalidate;
  838. //      setproperty(control,'Color',inttostr(fsd.colors[csButtonFace]));
  839. end;
  840. destructor TSkinControl.Destroy;
  841. var s:string;
  842. begin
  843. {     s:=caption;
  844.      if control<>nil then s:=s+' '+control.ClassName;
  845.      if gcontrol<>nil then s:=s+' '+gcontrol.ClassName;
  846.      skinaddlog('skincontrol destory '+s); }
  847.    if assigned(oldwndproc) then begin
  848.         if control<>nil then Control.WindowProc := OldWndProc;
  849.         oldwndproc:=nil;
  850.    end;
  851.    if fobjectinst<>nil then begin
  852.        if isunicode then
  853.          SetWindowLongw(hwnd, GWL_WNDPROC,LongInt(FPrevWndProc))
  854.        else
  855.          SetWindowLong(hwnd, GWL_WNDPROC,LongInt(FPrevWndProc));
  856.        FreeObjectInstance(FObjectInst);
  857.        fobjectinst:=nil;
  858.    end;
  859.    if skinform<>nil then Twinskinform(skinform).DeleteControl(self);
  860.    inherited destroy;
  861. end;
  862. function TSkinControl.GetParentColor(acolor:Tcolor):Tcolor;
  863. var pcontrol:TacControl;
  864.     PropInfo:PPropInfo;
  865. begin
  866.    result:=acolor;
  867.    if control<>nil then begin
  868.       pcontrol:=TAccontrol(control.parent);
  869.       if pcontrol<>nil then begin
  870.           PropInfo:=GetPropInfo(pcontrol,'Color');
  871.           if (PropInfo<>nil) and
  872.               (propinfo^.PropType^.Kind = tkInteger) then
  873.               result :=GetOrdProp(pcontrol,PropInfo)
  874.           else
  875.              result:= acolor;
  876.       end ;
  877.    end ;
  878. end;
  879. procedure TSkinControl.NewWndProc(var Message: TMessage);
  880. var s:string;
  881. begin
  882.   done:=false;
  883.   if message.msg=CN_SkinEnabled then begin
  884.        skinned:=message.WParam>0;
  885.        if skinned then Invalidate;
  886.   end else
  887.   if skinned then begin
  888.      if BeforeProc(message) then begin
  889.        default(Message);
  890.        AfterProc(message);
  891.      end;
  892.   end
  893.   else default(Message);
  894. end;
  895. procedure TSkinControl.Default(Var Msg: TMessage);
  896. begin
  897.   if assigned(oldwndproc) then
  898.          OldWndProc(Msg)
  899.   else
  900.      msg.result:=CallWindowProc(FPrevWndProc,hwnd,Msg.msg,msg.WParam,msg.LParam);
  901. end;
  902. {procedure TSkinControl.Notification(AComponent: TComponent;Operation: TOperation);
  903. var j:integer;
  904.     sf:TWinskinform;
  905. begin
  906.   inherited Notification(AComponent, Operation);
  907.   if (Operation = opInsert) and (AComponent <> nil)
  908.      and (AComponent is Tcontrol) then begin
  909.       sf:=TWinskinform(skinform);
  910.       sf.AddComp(Tcontrol(acomponent),sf.FForm);
  911.       skinaddlog(format('Notification Insert :%s,%s',[acomponent.classname,acomponent.name]));
  912.   end;
  913. end;  }
  914. procedure TSkinControl.MouseLeave;
  915. begin
  916.   if hwnd>0 then sendmessage(hwnd,CM_MOUSELEAVE,0,0);
  917. //  Twinskinform(owner).activeskincontrol:=nil;
  918. end;
  919. procedure TSkinControl.Invalidate;
  920. begin
  921.   //if control<>nil then control.Invalidate
  922.   //else
  923.   if gcontrol<>nil then gcontrol.invalidate
  924.   else if (hwnd>0) then begin
  925.        InvalidateRect(hwnd,0,true);
  926.        UpdateWindow(hwnd);
  927.   end;
  928. end;
  929. procedure TSkinControl.PaintControl(adc:HDC=0);
  930. var dc:HDC ;
  931.     rc:TRect;
  932. begin
  933.   if GetWindowRect( hWnd, rc ) then begin;
  934.     try
  935.       boundsrect:=rc;
  936.       OffsetRect( rc, -rc.left, -rc.top );
  937.       if (adc=0) then begin
  938.           DC := GetWindowDC( hWnd );
  939.           try
  940.              Drawcontrol(dc,rc);
  941.           finally
  942.              ReleaseDC( hwnd, DC );
  943.           end;
  944.       end else begin
  945.          //dc:=adc;
  946.          //boundsrect:=rc;
  947.          //OffsetRect( rc, -rc.left, -rc.top );
  948.          Drawcontrol(adc,rc);
  949.       end;
  950.     except
  951.     end;
  952.   end;
  953. end;
  954. procedure FillColor( dc:HDC; rc:TRect;acolor:Tcolor);
  955. var  Brush: HBrush;
  956. begin
  957.     Brush := CreateSolidBrush(acolor);
  958.     try
  959.       fillrect(dc,rc,brush);
  960.     finally
  961.       DeleteObject(Brush);
  962.     end;
  963. end;
  964. procedure TSkinControl.FillBG( dc:HDC; rc:TRect);
  965. var  Brush: HBrush;
  966. begin
  967.     Brush := CreateSolidBrush(fsd.colors[csButtonFace]);
  968.     try
  969.       fillrect(dc,rc,brush);
  970.     finally
  971.       DeleteObject(Brush);
  972.     end;
  973. end;
  974. function TSkinControl.GetWindowLongEx(ahWnd: HWND; nIndex: Integer): Longint;
  975. begin
  976.    if isunicode then
  977.        result:=GetWindowLongw( ahWnd, nIndex )
  978.    else
  979.        result:=GetWindowLong( ahWnd, nIndex );
  980. end;
  981. procedure TSkinControl.FillParentBG( dc:HDC; rc:TRect);
  982. var  Brush: HBrush;
  983.      acolor:Tcolor;
  984. begin
  985.     acolor:= getparentcolor(fsd.colors[csButtonFace]);
  986.     Brush := CreateSolidBrush(COLORREF(acolor));
  987.     try
  988.       fillrect(dc,rc,brush);
  989.     finally
  990.       DeleteObject(Brush);
  991.     end;
  992. end;
  993. procedure TSkinControl.DrawFocus(hDC: HDC; wString: WideString; rc: TRect; uFormat: UINT);
  994. var r1:Trect;
  995. //const
  996. //  Alignments: array[TAlignment] of Word = (DT_LEFT,DT_RIGHT,DT_CENTER );
  997. begin
  998.      r1:=rc;
  999.      Tnt_DrawTextW(hdc,caption,r1,uformat or DT_CALCRECT or DT_NOCLIP);
  1000.      if uformat and dt_center >0 then
  1001.        OffsetRect(r1, ((rc.right - rc.left) - (r1.right - r1.left)) div 2,
  1002.         ((rc.Bottom - rc.Top) - (r1.Bottom - r1.Top)) div 2-1)
  1003.      else if uformat and DT_RIGHT >0 then begin
  1004.        OffsetRect(r1,((rc.right - rc.left) - (r1.right - r1.left)), 0);
  1005.      end;
  1006.      InflateRect(r1,2,1);
  1007.      if r1.Top<rc.Top then r1.Top:=rc.Top;
  1008.      if r1.Bottom>rc.Bottom then r1.Bottom:=rc.Bottom;
  1009.      if r1.Right>rc.Right then r1.Right := rc.Right;
  1010.      if r1.Left<rc.Left then r1.Left := rc.Left;
  1011.      DrawFocusRect(hdc, r1);
  1012. end;
  1013. procedure TSkinControl.doLogMsg(aid:string;msg:TMessage);
  1014. var s:string;
  1015. begin
  1016.   {$IFDEF test}
  1017.     s:=MsgtoStr(msg);
  1018.     if s='' then exit;
  1019.     if SkinCanLog then Logstring.add(aid+s);
  1020.   {$ENDIF}
  1021. end;
  1022. procedure TSkinControl.AfterProc(var Message: TMessage);
  1023. begin
  1024.     case message.msg of
  1025.       WM_Paint:
  1026.          PaintControl(message.WParam);
  1027.       WM_KILLFOCUS,WM_SETFOCUS:
  1028.          Invalidate;
  1029. //          PaintControl;
  1030.       WM_SETTEXT: begin
  1031.            Invalidate;
  1032.          end;
  1033.       CN_SkinEnabled :skinned := message.WParam>0;
  1034.       wm_enable,CM_ENABLEDCHANGED:Invalidate;
  1035.     end;
  1036. end;
  1037. function TSkinControl.BeforeProc(var Message: TMessage):boolean;
  1038. begin
  1039.    result:=false;
  1040.    case message.msg of
  1041.       CN_IsSkined : message.result := 1;
  1042.       WM_NCDESTROY:begin
  1043.           result:=false;
  1044.           skinstate:=skin_deleted;
  1045.           default(message);
  1046.           if skinned then begin
  1047.              //skinned:=false;
  1048.              Unsubclass;
  1049.           end;
  1050.           //can't free,leave it,until skinform free;
  1051.           //         free;
  1052.          end;
  1053.      else result:=true;
  1054.    end;
  1055. end;
  1056. procedure TSkinControl.DrawControl( dc:HDC; rc:TRect);
  1057. begin
  1058. end;
  1059. function  TSkinControl.GetState:integer;
  1060. begin
  1061.    result:=1;
  1062. end;
  1063. function  GetProperty(control: TObject ;aprop:string):string;
  1064. var PropInfo:PPropInfo;
  1065.     s:string;
  1066.     i:integer;
  1067. begin
  1068.    s:='';
  1069.    i:=0;
  1070.    if  control<>nil then begin
  1071.       PropInfo:=GetPropInfo(control,aprop);
  1072.       if PropInfo<>nil then  begin
  1073.          if propinfo^.PropType^.Kind= tkEnumeration then
  1074.           s:=GetEnumProp(control,PropInfo)
  1075.          else if propinfo^.PropType^.Kind = tkInteger then begin
  1076. //           i:= GetInt64Prop(control,PropInfo);
  1077.            i:=GetOrdProp(control,PropInfo);
  1078.            s:=inttostr(i);
  1079.          end;
  1080.       end;
  1081.    end;
  1082.    result := s;
  1083. end;
  1084. function  GetIntProperty(control: TObject ;aprop:string):integer;
  1085. var PropInfo:PPropInfo;
  1086. begin
  1087.    result:= -1;
  1088.    if  control<>nil then begin
  1089.       PropInfo:=GetPropInfo(control,aprop);
  1090.       if (PropInfo<>nil) and
  1091.          (propinfo^.PropType^.Kind = tkInteger) then begin
  1092. //           i:= GetInt64Prop(control,PropInfo);
  1093.            result :=GetOrdProp(control,PropInfo);
  1094.       end;
  1095.    end;
  1096. end;
  1097. function  GetEnumProperty(control: TObject;aprop:string):string;
  1098. var PropInfo:PPropInfo;
  1099. begin
  1100.    result:= '';
  1101.    if  control<>nil then begin
  1102.       PropInfo:=GetPropInfo(control,aprop);
  1103.       if (PropInfo<>nil) then
  1104.            result := GetEnumProp(control,PropInfo);
  1105.    end;
  1106. end;
  1107. {$IFNDEF COMPILER_5a}
  1108. procedure AssignWideStr(var Dest: WideString; const Source: WideString);
  1109. begin
  1110.   Dest := Source;
  1111. end;
  1112. procedure IntGetWideStrProp(Instance: TObject; PropInfo: PPropInfo;
  1113.   var Value: WideString); assembler;
  1114. asm
  1115.         { ->    EAX Pointer to instance         }
  1116.         {       EDX Pointer to property info    }
  1117.         {       ECX Pointer to result string    }
  1118.         PUSH    ESI
  1119.         PUSH    EDI
  1120.         MOV     EDI,EDX
  1121.         MOV     EDX,[EDI].TPropInfo.Index       { pass index in EDX }
  1122.         CMP     EDX,$80000000
  1123.         JNE     @@hasIndex
  1124.         MOV     EDX,ECX                         { pass value in EDX }
  1125. @@hasIndex:
  1126.         MOV     ESI,[EDI].TPropInfo.GetProc
  1127.         CMP     [EDI].TPropInfo.GetProc.Byte[3],$FE
  1128.         JA      @@isField
  1129.         JB      @@isStaticMethod
  1130. @@isVirtualMethod:
  1131.         MOVSX   ESI,SI                          { sign extend slot offset }
  1132.         ADD     ESI,[EAX]                       { vmt + slot offset }
  1133.         CALL    DWORD PTR [ESI]
  1134.         JMP     @@exit
  1135. @@isStaticMethod:
  1136.         CALL    ESI
  1137.         JMP     @@exit
  1138. @@isField:
  1139.   AND  ESI,$00FFFFFF
  1140.   MOV  EDX,[EAX+ESI]
  1141.   MOV  EAX,ECX
  1142.   CALL  AssignWideStr
  1143. @@exit:
  1144.         POP     EDI
  1145.         POP     ESI
  1146. end;
  1147. function GetWideStrProp(Instance: TObject; PropInfo: PPropInfo): WideString;
  1148. begin
  1149.   IntGetWideStrProp(Instance, PropInfo, Result);
  1150. end;
  1151. procedure SetWideStrProp(Instance: TObject; PropInfo: PPropInfo;
  1152.   const Value: WideString); assembler;
  1153. asm
  1154.         { ->    EAX Pointer to instance         }
  1155.         {       EDX Pointer to property info    }
  1156.         {       ECX Pointer to string value     }
  1157.         PUSH    ESI
  1158.         PUSH    EDI
  1159.         MOV     ESI,EDX
  1160.         MOV     EDX,[ESI].TPropInfo.Index       { pass index in EDX }
  1161.         CMP     EDX,$80000000
  1162.         JNE     @@hasIndex
  1163.         MOV     EDX,ECX                         { pass value in EDX }
  1164. @@hasIndex:
  1165.         MOV     EDI,[ESI].TPropInfo.SetProc
  1166.         CMP     [ESI].TPropInfo.SetProc.Byte[3],$FE
  1167.         JA      @@isField
  1168.         JB      @@isStaticMethod
  1169. @@isVirtualMethod:
  1170.         MOVSX   EDI,DI
  1171.         ADD     EDI,[EAX]
  1172.         CALL    DWORD PTR [EDI]
  1173.         JMP     @@exit
  1174. @@isStaticMethod:
  1175.         CALL    EDI
  1176.         JMP     @@exit
  1177. @@isField:
  1178.   AND  EDI,$00FFFFFF
  1179.   ADD  EAX,EDI
  1180.   MOV  EDX,ECX
  1181.   CALL  AssignWideStr
  1182. @@exit:
  1183.         POP     EDI
  1184.         POP     ESI
  1185. end;
  1186. {$ENDIF}
  1187. //TypInfo.pas
  1188. function  GetStringProp(control: TObject;aprop:string):widestring;
  1189. var PropInfo:PPropInfo;
  1190.     s:string;
  1191. begin
  1192.    result:='';
  1193.    if  control<>nil then begin
  1194.       PropInfo:=GetPropInfo(control,aprop);
  1195.       if PropInfo<>nil then  begin
  1196.         case PropInfo^.PropType^.Kind of
  1197. {$IFDEF VER200}
  1198.           tkUString: result :=GetStrProp(control,PropInfo);
  1199. {$ENDIF}
  1200.           tkWString: result := GetWideStrProp(control,PropInfo);
  1201.           else  result:=StrToWideStr(GetStrProp(control,PropInfo));
  1202.         end;
  1203.       end;
  1204.    end;
  1205. end;
  1206. function  GetControlCaption(control: TACControl):widestring;
  1207. var PropInfo:PPropInfo;
  1208.     s:string;
  1209.     aprop:string;
  1210. begin
  1211.    result:='';
  1212.    aprop:='Caption';
  1213.    if  control<>nil then begin
  1214.       PropInfo:=GetPropInfo(control,aprop);
  1215.       if PropInfo<>nil then  begin
  1216.         case PropInfo^.PropType^.Kind of
  1217.           tkWString: result := control.caption;
  1218.           else  result:=StrToWideStr(control.caption);
  1219.         end;
  1220.       end;
  1221.    end;
  1222. end;
  1223. function  GetObjMethod(control: TObject;aprop:string): TMethod;
  1224. var PropInfo:PPropInfo;
  1225. begin
  1226. //   result:=nil;
  1227.    if  control<>nil then begin
  1228.       PropInfo:=GetPropInfo(control,aprop);
  1229.       if PropInfo<>nil then  begin
  1230.         result:=GetMethodProp(control,PropInfo);
  1231.       end;
  1232.    end;
  1233. end;
  1234. function GetObjProp(control: TObject;aprop:string; MinClass: TClass):Tobject;
  1235. var PropInfo:PPropInfo;
  1236. begin
  1237.    result:=nil;
  1238.    if  control<>nil then begin
  1239.       PropInfo:=GetPropInfo(control,aprop);
  1240.       if PropInfo<>nil then  begin
  1241.         result:=GetObjectProp(control,PropInfo,MinClass);
  1242.       end;
  1243.    end;
  1244. end;
  1245. procedure  SetProperty(control: TObject;aprop,value:string);
  1246. var PropInfo:PPropInfo;
  1247. begin
  1248.    if  control<>nil then begin
  1249.       PropInfo:=GetPropInfo(control,aprop);
  1250.       if PropInfo<>nil then  begin
  1251.          if propinfo^.PropType^.Kind= tkEnumeration then
  1252.           SetEnumProp(control,PropInfo,value)
  1253.          else if propinfo^.PropType^.Kind= tkInteger then
  1254.           SetOrdProp(control,PropInfo,strtoint(value))
  1255.          else if propinfo^.PropType^.Kind= tkString then
  1256.           SetStrProp(control,PropInfo,value)
  1257.          else if propinfo^.PropType^.Kind= tkLString then
  1258.           SetStrProp(control,PropInfo,value)
  1259.          else if propinfo^.PropType^.Kind= tkWString then
  1260.           SetStrProp(control,PropInfo,value);
  1261.       end;
  1262.    end;
  1263. end;
  1264. procedure TSkinButton.DoMouseDown(var Message: TWMMouse);
  1265. var acontrol:Taccontrol;
  1266.     p:Tpoint;
  1267. begin
  1268.     acontrol:=TACcontrol(control);
  1269.     with Message do
  1270.       if (acontrol.Width > 32768) or (acontrol.Height > 32768) then begin
  1271.         GetCursorPos(p);
  1272.         p := acontrol.ScreenToClient(p);
  1273.         acontrol.MouseDown(mbLeft, KeysToShiftState(Keys), p.X, p.Y);
  1274. //        with acontrol.CalcCursorPos do
  1275. //          acontrol.MouseDown(mbLeft, KeysToShiftState(Keys), p.X, p.Y);
  1276.       end  else
  1277.        acontrol.MouseDown(mbLeft, KeysToShiftState(Keys), Message.XPos, Message.YPos);
  1278. end;
  1279. {procedure TSkinButton.SetRedraw(b:boolean);
  1280. begin
  1281.    redraw:=b;
  1282.    if b then begin
  1283.        KillTimer(hwnd, 1);
  1284.        sendmessage(hwnd,WM_SETREDRAW,1,0);
  1285.        Application.ProcessMessages;
  1286.    end else begin
  1287.        KillTimer(hwnd, 1);
  1288.        sendmessage(hwnd,WM_SETREDRAW,0,0);
  1289.        SetTimer(hwnd, 1, 100, nil);
  1290.    end;
  1291. end;   }
  1292. procedure TSkinButton.SetRedraw(b:boolean);
  1293. var dw:dword;
  1294. begin
  1295. //   redraw:=b;
  1296.    dw := GetWindowLong(hwnd, GWL_STYLE);
  1297.    if b then begin
  1298.       KillTimer(hwnd, 1);
  1299.       if redraw then
  1300.          dw := dw or WS_VISIBLE;
  1301.       redraw:=false;
  1302.    end else begin
  1303.       KillTimer(hwnd, 1);
  1304.       redraw := true;
  1305.       dw := dw and not WS_VISIBLE;
  1306.       SetTimer(hwnd, 1, 100, nil);
  1307.    end;
  1308.    SetWindowLong(hwnd, GWL_STYLE, dw);
  1309. end; 
  1310. function TSkinButton.BeforeProc(var Message: TMessage):boolean;
  1311.  var s:string;
  1312.      sf: Twinskinform;
  1313. begin
  1314.   {$IFDEF buttontest}
  1315.     s:= MsgtoStr(message);
  1316.     if s<>''  then begin
  1317.       s:=format('Button %s %1x %s',[caption,hwnd,s]);
  1318.       fsd.dodebug(s);
  1319.       //skinaddlog(s);
  1320.     end;
  1321.   {$ENDIF}
  1322. {    if message.msg= CM_VISIBLECHANGED then begin
  1323.         if message.wParam=0 then begin
  1324.             if redraw then setredraw(true);
  1325.         end;
  1326.         result:=true;
  1327.         exit;
  1328.     end else if isdefault then begin
  1329.        default(message);
  1330.        result:=false;
  1331.        exit;
  1332.     end;  }
  1333.     result:=true;
  1334.     case message.msg of
  1335.     WM_LBUTTONDOWN, WM_LBUTTONDBLCLK:
  1336.       begin
  1337.        if not Focused then  begin
  1338.         SetFocus(hwnd);
  1339.        end;
  1340.        state:=state+[scDown];
  1341.        PaintControl(0);
  1342.        result:=false;
  1343.        if (kind=0) and (control<>nil) then DoMouseDown(TWMMouse(message));
  1344.       end;
  1345. {   WM_LBUTTONUP:
  1346.       if scDown in state then begin
  1347.          state:=state-[scDown];
  1348.          PaintControl(0);
  1349.          setredraw(false);
  1350.          skinned:=false;
  1351.          sendmessage(hwnd,WM_LBUTTONDOWN,message.WParam,message.LParam);
  1352.          application.ProcessMessages;
  1353.          sendmessage(hwnd,WM_LBUTTONUP,message.WParam,message.LParam);
  1354.          skinned:=true;
  1355.          setredraw(true);
  1356.          if IsWindowVisible(hwnd) then
  1357.             Invalidate;
  1358.          application.ProcessMessages;
  1359.          result:=false;
  1360.       end;  }
  1361. {    WM_LBUTTONDOWN, WM_LBUTTONDBLCLK:
  1362.       begin
  1363.        if not Focused then  begin
  1364.         SetFocus(hwnd);
  1365.        end;
  1366.        state:=state+[scDown];
  1367.        setredraw(false);
  1368. //       sendmessage(hwnd,WM_SETREDRAW,0,0);
  1369.        default(message);
  1370. //       sendmessage(hwnd,WM_SETREDRAW,1,0);
  1371.        setredraw(true);
  1372.        PaintControl(0);
  1373.        result:=false;
  1374.       end;
  1375.     WM_LBUTTONUP:
  1376.       if scDown in state then begin
  1377.          state:=state-[scDown];
  1378.          setredraw(false);
  1379.          default(message);
  1380.          setredraw(true);
  1381.          if IsWindowVisible(hwnd) then
  1382.             Invalidate;
  1383.          result:=false;
  1384.       end;}
  1385.     WM_TIMER : begin
  1386.          setredraw(true);
  1387.          result:=false;
  1388.        end;
  1389.     WM_ERASEBKGND:begin
  1390.          message.Result:=1;
  1391.          result:=false;
  1392.       end;
  1393.     wm_paint: begin
  1394.         wmpaint(message);
  1395.         result:=false;
  1396.       end;
  1397. {    wm_enable,CM_ENABLEDCHANGED:begin
  1398.         WMEnable(message);
  1399.         result:=false;
  1400.       end;   }
  1401.     else result:=inherited beforeProc(message);
  1402.     end;
  1403. end;
  1404. {function TSkinButton.BeforeProc(var Message: TMessage):boolean;
  1405.  var s:string;
  1406.      sf: Twinskinform;
  1407. begin
  1408.     if message.msg= CM_VISIBLECHANGED then begin
  1409.         if message.wParam=0 then begin
  1410.             if redraw then setredraw(true);
  1411.         end;
  1412.         result:=true;
  1413.         exit;
  1414.     end else if isdefault then begin
  1415.        default(message);
  1416.        result:=false;
  1417.        exit;
  1418.     end;
  1419.     result:=true;
  1420.     case message.msg of
  1421.     WM_LBUTTONDOWN, WM_LBUTTONDBLCLK:
  1422.       begin
  1423.        if not Focused then  begin
  1424.         SetFocus(hwnd);
  1425.        end;
  1426.        state:=state+[scDown];
  1427.        PaintControl(0);
  1428.        result:=false;
  1429.       end;
  1430.     WM_LBUTTONUP:
  1431.       if scDown in state then begin
  1432.          state:=state-[scDown];
  1433.          PaintControl(0);
  1434.          setredraw(false);
  1435.          isdefault:=true;
  1436.          sendmessage(hwnd,WM_LBUTTONDOWN,message.WParam,message.LParam);
  1437.          sendmessage(hwnd,WM_LBUTTONUP,message.WParam,message.LParam);
  1438.          isdefault:=false;
  1439.          setredraw(true);
  1440.          if IsWindowVisible(hwnd) then
  1441.             Invalidate;
  1442.          result:=false;
  1443.       end;
  1444.     WM_TIMER : begin
  1445.          setredraw(true);
  1446.          result:=false;
  1447.        end;
  1448.     WM_ERASEBKGND:begin
  1449.          message.Result:=1;
  1450.          result:=false;
  1451.       end;
  1452.     wm_paint: begin
  1453.         wmpaint(message);
  1454.         result:=false;
  1455.       end;
  1456.     else result:=inherited beforeProc(message);
  1457.     end;
  1458. end;}
  1459. procedure TSkinButton.WMEnable(var Message: TMessage);
  1460. var dw: dword;
  1461. begin
  1462. {   dw:=GetWindowLong(hWnd,GWL_STYLE);
  1463.    dw := dw and ( not WS_VISIBLE);
  1464.    SetWindowLong( hwnd, GWL_STYLE, dw);
  1465.    dw := dw or WS_VISIBLE;
  1466.    SetWindowLong( hwnd, GWL_STYLE, dw);}
  1467.    default(Message);
  1468.    Invalidate;
  1469. end;
  1470. procedure TSkinButton.AfterProc(var Message: TMessage);
  1471. var sf:Twinskinform;
  1472.     s:string;
  1473. begin
  1474.     case message.msg of
  1475. {     CM_MOUSEENTER:
  1476.       if Enabled then begin
  1477.         state:=state+[scMouseIn];
  1478.         Invalidate;
  1479.       end;   
  1480.    CM_MOUSELEAVE:
  1481.       if Enabled then begin
  1482.         state:=state-[scMouseIn];
  1483.         state:=state-[scDown];
  1484.         Invalidate;
  1485.       end;  }
  1486.     WM_MOUSEMove:begin
  1487.       if enabled and (not (scmousein in state)) then begin
  1488.         state:=state+[scMouseIn];
  1489.         Invalidate;
  1490.       end;
  1491.       WinSkinData.DoTrackMouse(hwnd);
  1492.       end;
  1493.     WM_MOUSELEAVE: begin
  1494. //          if (scDown in state) then begin
  1495.           state:=state-[scMouseIn];
  1496.           state:=state-[scDown];
  1497.           invalidate;
  1498. //          end;
  1499.         end;
  1500.     WM_LBUTTONUP:
  1501.       if scDown in state then begin
  1502.          state:=state-[scDown];
  1503.          //PaintControl(0);
  1504.          Invalidate;
  1505.          s:=lowercase(GetWindowClassname(hwnd));
  1506.          if control<>nil then begin
  1507.            TACcontrol(control).Click  ;
  1508. //           postMessage(getparent(hwnd),WM_COMMAND,BN_CLICKED,hWnd)
  1509.          end else if (s='tbutton') then
  1510.            postMessage(getparent(hwnd),WM_COMMAND,BN_CLICKED,hWnd)
  1511.          else
  1512.            postMessage(getparent(hwnd),WM_COMMAND,BN_CLICKED*$100+GetDlgCtrlID(hwnd),hWnd);
  1513.       end;
  1514.     WM_SETTEXT: PaintControl(0);
  1515.     CM_FOCUSCHANGED : invalidate;
  1516.     CM_DIALOGKEY:invalidate;
  1517.     WM_KEYDOWN:
  1518.       if Message.WParam = VK_SPACE then begin
  1519.        state:=state+[scDown];
  1520.        Invalidate;
  1521.       end;
  1522.     WM_KEYUP:
  1523.       if Message.WParam = VK_SPACE then begin
  1524.         state:=state-[scDown];
  1525.         Invalidate;
  1526.       end;
  1527.     else inherited AfterProc(message);
  1528.     end;
  1529. end;
  1530. {procedure TSkinButton.DrawControl( dc:HDC; rc:TRect);
  1531. var i:integer;
  1532.     r1:Trect;
  1533.     acolor:Tcolor;
  1534.     bfont,cfont:Hfont;
  1535.     temp:Tbitmap;
  1536. begin
  1537.     if fsd.button=nil then exit;
  1538.     if fsd.Button.map.empty then exit;
  1539.     i:=1;
  1540.     temp:=Tbitmap.create;
  1541.     Focused := (GetFocus= hWnd);
  1542.     enabled := (GetWindowLong(hWnd,GWL_STYLE) and WS_DISABLED)=0;
  1543.     caption:=getformcaption(hwnd);
  1544.     if (caption='') and (control<>nil) then
  1545.       caption:=Taccontrol(control).caption;
  1546.     if focused then i:=4;
  1547.     if (scDown in state)  then i:=2
  1548.     else if (scMouseIn in state) then i:=4;
  1549.     if not enabled then i:=3;
  1550.     r1:=rc;
  1551.     offsetrect(r1,-r1.left,-r1.top);
  1552.     temp.width:=r1.right;
  1553.     temp.height:=r1.bottom;
  1554.     DrawBMPSkin(temp,r1,fsd.button,i,5,fsd.button.Trans);
  1555.     bfont:=sendmessage(hwnd,wm_getfont,0,0);
  1556.     cfont:=selectobject(temp.canvas.handle,bfont);
  1557.     SetTextColor(temp.canvas.handle,fsd.colors[csButtonText]);
  1558.     if (i=1) then
  1559.        SetTextColor(temp.canvas.handle,fsd.button.normalcolor2);
  1560.     if (i=4) then
  1561.        SetTextColor(temp.canvas.handle,fsd.button.overcolor2);
  1562.     if (i=2) then
  1563.        SetTextColor(temp.canvas.handle,fsd.button.downcolor2);
  1564.     if not enabled then
  1565.       SetTextColor(temp.canvas.handle,COLORREF(clBtnShadow));
  1566.     DrawCaption(temp.canvas,r1,caption,enabled,false);
  1567. //    DrawBuf( dc,rc);
  1568.     BitBlt(dc,rc.left ,rc.top,rc.right-rc.left,rc.bottom-rc.Top,
  1569.                  temp.Canvas.Handle ,0 ,0 ,Srccopy);
  1570.     selectobject(temp.canvas.handle,cfont);
  1571.     temp.Free;
  1572. end;}
  1573. constructor TSkinButton.Create(AOwner: TComponent);
  1574. begin
  1575.    inherited create(aowner);
  1576.    btemp:=Tbitmap.create;
  1577.    trans:=false;
  1578.    isdefault:=false;
  1579. end;
  1580. destructor TSkinButton.Destroy;
  1581. begin
  1582.    if btemp<>nil then btemp.free;
  1583.    btemp:=nil;
  1584.    inherited destroy;
  1585. end;
  1586. Procedure TSkinButton.Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);
  1587. var s:string;
  1588. begin
  1589.     inherited init(sf,sd,acanvas,acolor);
  1590.     kind :=0;
  1591.     s:=lowercase(control.classname);
  1592.     if pos('trz',s)=1 then kind:=1;
  1593.     if pos('tel',s)=1 then kind:=1;
  1594.     if (control.Tag=5555) or (xoTransparent in fsd.options) then
  1595.        trans:=true;
  1596. end;
  1597. procedure TSkinButton.DrawBtnText(acanvas: TCanvas; rc:TRect;
  1598.   text:String;Alignment:word=DT_CENTER);
  1599. const
  1600.   Alignments: array[TAlignment] of Word = (DT_LEFT,DT_RIGHT,DT_CENTER );
  1601. var
  1602.   r1: TRect;
  1603.   DrawStyle: Longint;
  1604.   s,s1:string;
  1605. begin
  1606.    DrawStyle := DT_EXPANDTABS or Alignment or dt_WordBreak;
  1607. {   if multiline then begin
  1608.       DrawStyle := DrawStyle or dt_WordBreak;
  1609.       s:=WideStringToStringEx(caption);
  1610.       s:=stringreplace(s,'||',#13#10,[rfReplaceAll]);
  1611.       caption := StrToWideStr(s);
  1612.    end;}
  1613.    s:= StrToWideStr('||');
  1614.    s1:= StrToWideStr(#13#10);
  1615.    caption := StringReplaceW(caption,s,s1);
  1616.    r1 := rc;
  1617.    inflaterect(r1,-2,-2);
  1618.    SetBkMode(aCanvas.Handle, TRANSPARENT);
  1619.    with ACanvas do begin
  1620.      Tnt_DrawTextW(ACanvas.Handle, caption,r1,DrawStyle or DT_CALCRECT or DT_NOCLIP);
  1621.      offsetrect(r1,-r1.Left,-r1.Top);
  1622.      drawstyle:=checkBiDi(drawStyle);
  1623.      //DrawText(ACanvas.Handle,PChar(Text),Length(Text),r1,DrawStyle or DT_CALCRECT or DT_NOCLIP);
  1624.      if Alignment=dt_center then
  1625.        OffsetRect(r1, ((rc.right - rc.left) - (r1.right - r1.left)) div 2,
  1626.         ((rc.Bottom - rc.Top) - (r1.Bottom - r1.Top)) div 2-1)
  1627.      else begin
  1628.        OffsetRect(r1, 0,((rc.Bottom - rc.Top) - (r1.Bottom - r1.Top)) div 2-1);
  1629.        r1.Left:=rc.left;r1.right:=rc.Right;
  1630.      end;
  1631. //     DrawText(ACanvas.Handle, PChar(Text),-1,r1,DrawStyle);
  1632.      Tnt_DrawTextW(ACanvas.Handle, caption,r1,DrawStyle);
  1633.      SetBkMode(aCanvas.Handle, OPAQUE);
  1634.      if focused and not (xoNoFocusRect in fsd.Options) then begin
  1635.         InflateRect(r1,2,2);
  1636.         DrawFocusRect(r1);
  1637.      end;
  1638.    end;
  1639. end;
  1640. function TSkinButton.GetFontColor(var acolor:Tcolor):boolean;
  1641. var
  1642.     font:Tfont;
  1643.     b:boolean;
  1644.     PropInfo:PPropInfo;
  1645. begin
  1646.     b:=false;
  1647.     font := Tfont(GetObjProp(control,'Font',Tfont));
  1648.     if font<>nil then begin
  1649.       PropInfo:=GetPropInfo(font,'Color');
  1650.       if (PropInfo<>nil) and
  1651.          (propinfo^.PropType^.Kind = tkInteger) then begin
  1652.            acolor :=GetOrdProp(control,PropInfo);
  1653.            b:=true;
  1654.       end;
  1655.    end;
  1656.    result:=b;
  1657. end;
  1658. procedure TSkinButton.DrawControl( dc:HDC; rc:TRect);
  1659. var i:integer;
  1660.     r1:Trect;
  1661.     acolor,color0:Tcolor;
  1662.     bfont,cfont:Hfont;
  1663.     style:dword;
  1664.     isdefault:boolean;
  1665.     font:Tfont;
  1666.     s:string;
  1667. begin
  1668.     if fsd.button=nil then exit;
  1669.     if fsd.Button.map.empty then exit;
  1670.     i:=1;
  1671.     style:=GetWindowLong(hWnd,GWL_STYLE);
  1672.     Focused := (GetFocus= hWnd);
  1673.     enabled := ( style and WS_DISABLED )=0;
  1674. //    dw:= ( style and $0f );
  1675. //    isdefault := (( style and $0f ) = BS_DEFPUSHBUTTON );
  1676.     s := lowercase(GetEnumProperty(control,'Default'));
  1677.     isdefault := (s = 'true');
  1678.     multiline := false;
  1679.     if (control<>nil) then begin
  1680.       caption := GetStringProp(control,'Caption');
  1681.       s := lowercase(GetEnumProperty(control,'MultiLine'));
  1682.       if s='true' then multiline := true;
  1683.     end else
  1684.       caption:=getformcaption(hwnd);
  1685.     if focused then i:=5;
  1686.     if isdefault then i:=5;
  1687.     if (scDown in state)  then i:=2
  1688.     else if (scMouseIn in state) then i:=4;
  1689.     if not enabled then i:=3;
  1690.     r1:=rc;
  1691.     offsetrect(r1,-r1.left,-r1.top);
  1692.     btemp.width:=r1.right;
  1693.     btemp.height:=r1.bottom;
  1694.     if trans then
  1695.       DrawParentImage(control,btemp.canvas.handle,true)
  1696.     else
  1697.      fillBG(btemp.canvas.handle,r1);
  1698. {   if (not  (xoTransparent in fsd.options)) or (control=nil) then begin
  1699.      fillBG(btemp.canvas.handle,r1);
  1700.    end
  1701.    else if control<>nil then
  1702.       DrawParentImage(control,btemp.canvas.handle,true);}
  1703.    //else FillBG(btemp.canvas.handle,r1);     }
  1704.     DrawSkinMap( btemp.canvas.handle,r1,fsd.button,I,fsd.Button.frame);
  1705.     if control<>nil then begin
  1706.       font := Tfont(GetObjProp(control,'Font',Tfont));
  1707.       if font<>nil then btemp.canvas.font.assign(font);
  1708. //      if (i=1) and (fsd.button.newnormal) then
  1709.       if (fsd.button.newnormal) then
  1710.           btemp.canvas.Font.Color:= fsd.button.normalcolor2;
  1711.       if (i=4)  and (fsd.button.newover) then
  1712.           btemp.canvas.Font.Color:= fsd.button.overcolor2;
  1713.       if (i=2) and (fsd.Button.newdown) then
  1714.           btemp.canvas.Font.Color:= fsd.button.downcolor2;
  1715.       if not enabled then
  1716.          btemp.canvas.Font.Color := clBtnShadow;
  1717. //      getfontcolor(color0);
  1718.     end else begin
  1719.     bfont:=sendmessage(hwnd,wm_getfont,0,0);
  1720.     cfont:=selectobject(btemp.canvas.handle,bfont);
  1721.     SetTextColor(btemp.canvas.handle,ColorToRGB(fsd.colors[csButtonText]));
  1722. //    if (i=1) and (fsd.button.newnormal) then
  1723.     if (fsd.button.newnormal) then
  1724.        SetTextColor(btemp.canvas.handle,ColorToRGB(fsd.button.normalcolor2));
  1725. //    if ((i=4) or (i=5)) and (fsd.button.newover) then
  1726.     if (i=4) and (fsd.button.newover) then
  1727.        SetTextColor(btemp.canvas.handle,ColorToRGB(fsd.button.overcolor2));
  1728.     if (i=2) and (fsd.Button.newdown) then
  1729.        SetTextColor(btemp.canvas.handle,ColorToRGB(fsd.button.downcolor2));
  1730.     if not enabled then
  1731.       SetTextColor(btemp.canvas.handle,ColorToRGB(clBtnShadow));
  1732.     end;
  1733.     DrawBtnText(btemp.canvas,r1,caption);
  1734. //    Bitmapdraw(dc,rc,btemp);
  1735.     BitBlt(dc,rc.left ,rc.top,rc.right-rc.left,rc.bottom-rc.Top,
  1736.                  btemp.Canvas.Handle ,0 ,0 ,Srccopy);
  1737.     selectobject(btemp.canvas.handle,cfont);
  1738.   {$IFDEF buttontest}
  1739.       skinaddlog(format('Button Draw %s %1x %1x',[caption,hwnd,dc]));
  1740.   {$ENDIF}
  1741. end;
  1742. {procedure TSkinButton.DrawControl( dc:HDC; rc:TRect);
  1743. var i:integer;
  1744.     r1:Trect;
  1745.     acolor:Tcolor;
  1746.     bfont,cfont:Hfont;
  1747. begin
  1748.     if fsd.button=nil then exit;
  1749.     if fsd.Button.map.empty then exit;
  1750.     i:=1;
  1751.     Focused := (GetFocus= hWnd);
  1752.     enabled := (GetWindowLong(hWnd,GWL_STYLE) and WS_DISABLED)=0;
  1753.     caption:=getformcaption(hwnd);
  1754.     if (caption='') and (control<>nil) then
  1755.       caption:=Taccontrol(control).caption;
  1756.     if focused then i:=4;
  1757.     if (scDown in state)  then i:=2
  1758.     else if (scMouseIn in state) then i:=4;
  1759.     if not enabled then i:=3;
  1760.     r1:=rc;
  1761.     offsetrect(r1,-r1.left,-r1.top);
  1762.     bg.width:=r1.right;
  1763.     bg.height:=r1.bottom;
  1764.     DrawSkin(r1,fsd.button,i,5,fsd.button.Trans);
  1765. //    DrawSkinMap( dc:HDC; rc:TRect;aObject:TdataSkinObject;I,N:integer)
  1766.     bfont:=sendmessage(hwnd,wm_getfont,0,0);
  1767.     cfont:=selectobject(bg.canvas.handle,bfont);
  1768.     SetTextColor(bg.canvas.handle,fsd.colors[csButtonText]);
  1769.     if (i=1) then
  1770.        SetTextColor(bg.canvas.handle,fsd.button.normalcolor2);
  1771.     if (i=4) then
  1772.        SetTextColor(bg.canvas.handle,fsd.button.overcolor2);
  1773.     if (i=2) then
  1774.        SetTextColor(bg.canvas.handle,fsd.button.downcolor2);
  1775.     if not enabled then
  1776.       SetTextColor(bg.canvas.handle,COLORREF(clBtnShadow));
  1777.     DrawCaption(bg.canvas,r1,caption,enabled,false);
  1778.     SetBkMode(bg.canvas.handle,OPAQUE);
  1779.     DrawBuf( dc,rc);
  1780.     selectobject(bg.canvas.handle,cfont);
  1781. end;}
  1782. {procedure TButtonGlyph.CalcButtonLayout(Canvas: TCanvas; const Client: TRect;
  1783.   const Offset: TPoint; const Caption: string; Layout: TButtonLayout; Margin,
  1784.   Spacing: Integer; var GlyphPos: TPoint; var TextBounds: TRect;
  1785.   BiDiFlags: LongInt);}
  1786. {procedure TSkinBitButton.DrawControl( dc:HDC; rc:TRect);
  1787. var btn:TBitBtn;
  1788.     acolor:Tcolor;
  1789.     i,n,j:integer;
  1790.     spacing,margin:integer;
  1791.     r1,TextBounds:Trect;
  1792.     Layout: TButtonLayout;
  1793.     TextPos: TPoint;
  1794.     GlyphPos, ClientSize, GlyphSize, TextSize: TPoint;
  1795.     TotalSize: TPoint;
  1796.     DrawStyle: Longint;
  1797.     cfont,bfont:Hfont;
  1798. begin
  1799.     if fsd.button=nil then exit;
  1800.     if fsd.Button.map.empty then exit;
  1801.     DrawStyle:=DT_LEFT;}
  1802. function StringReplaceW(s,s1,s2:widestring):widestring;
  1803. var i,p,l:integer;
  1804. begin
  1805.    result:=s;
  1806.    l:=length(s);
  1807.    p:=pos(s1,s);
  1808.    if p>0 then begin
  1809.       result:=copy(s,1,p-1)+s2+copy(s,p+length(s1),l);
  1810.    end;
  1811. end;
  1812. procedure TSkinBitButton.DrawControl( dc:HDC; rc:TRect);
  1813. var acolor:Tcolor;
  1814.     i,j:integer;
  1815.     r1,TextBounds:Trect;
  1816.     Layout: TButtonLayout;
  1817.     NumGlyphs,margin,spacing :integer;
  1818.     TextPos: TPoint;
  1819.     GlyphPos, ClientSize, GlyphSize, TextSize: TPoint;
  1820.     TotalSize: TPoint;
  1821.     DrawStyle: Longint;
  1822.     cfont,bfont:Hfont;
  1823.     font:Tfont;
  1824.     style : dword;
  1825.     s,s1:widestring;
  1826.     bglyph:Tbitmap;
  1827.     bglist:Timagelist;
  1828.     imageindex,disabledindex:integer;
  1829.     isdefault:boolean;
  1830.     s2,bname:string;
  1831. begin
  1832.     if fsd.button=nil then exit;
  1833.     if fsd.Button.map.empty then exit;
  1834.     s:=lowercase(GetEnumProperty(gcontrol,'Visible'));
  1835.     if s = 'false' then exit;
  1836.     if Length(PicField)>0 then begin
  1837.         drawPicControl(dc,rc);
  1838.         exit;
  1839.     end;
  1840. //    DrawStyle:=DT_LEFT;
  1841.     Focused := (GetFocus= hWnd);
  1842.     style := GetWindowLong(hWnd,GWL_STYLE);
  1843.     enabled := ( style and WS_DISABLED )=0;
  1844. //    caption:=getformcaption(hwnd);
  1845.     //dw :=  ( style and $0f );
  1846.     //isdefault := (dw = BS_DEFPUSHBUTTON );
  1847.     s2 := lowercase(GetEnumProperty(control,'Default'));
  1848.     isdefault := (s2 = 'true');
  1849.     if control<>nil then
  1850.        caption := GetStringProp(control,'Caption')
  1851. //       caption := GetControlCaption(TACControl(control))
  1852.     else
  1853.        caption:=getformcaption(hwnd);
  1854. //    btn:=TBitBtn(control);
  1855. //    if btn.default then i:=5;
  1856. //    s:=lowercase(GetEnumProperty(control,'Default'));
  1857.     i:=1;
  1858.     if Focused then i:=5;
  1859.     if isdefault then i:=5;
  1860.     if (scDown in state)  then i:=2
  1861.     else if (scMouseIn in state) then i:=4;
  1862.     if not enabled then i:=3;
  1863.     case i of
  1864.       1: j:=1;
  1865.       2: j:=3;
  1866.       3: j:=2;
  1867.       4: j:=1;
  1868.       else j:=1;
  1869.     end;
  1870.     r1:=rc;
  1871.     offsetrect(r1,-r1.left,-r1.top);
  1872.     btemp.width:=r1.right;
  1873.     btemp.height:=r1.bottom;
  1874.     bfont:=sendmessage(hwnd,wm_getfont,0,0);
  1875.     cfont:=selectobject(btemp.canvas.handle,bfont);
  1876.     if trans then
  1877.       DrawParentImage(control,btemp.canvas.handle,true)
  1878.     else
  1879.      fillBG(btemp.canvas.handle,r1);
  1880.     DrawSkinMap( btemp.canvas.handle,r1,fsd.button,I,fsd.button.frame);
  1881.    ClientSize := Point(rc.Right - rc.Left,rc.Bottom - rc.Top);
  1882.    font := Tfont(GetObjProp(control,'Font',Tfont));
  1883.    bglyph := Tbitmap(GetObjProp(control,'Glyph',Tbitmap));
  1884.    bglist := Timagelist(GetObjProp(control,'Images',Timagelist));
  1885.    NumGlyphs := GetIntProperty(control,'NumGlyphs') ;
  1886.    imageindex := GetIntProperty(control,'ImageIndex') ;
  1887.    disabledindex := GetIntProperty(control,'DisabledIndex') ;
  1888.    if NumGlyphs<0 then NumGlyphs:=1;
  1889.    Margin := GetIntProperty(control,'Margin') ;
  1890.    Spacing := GetIntProperty(control,'Spacing') ;
  1891.    s := lowercase(GetEnumProperty(control,'Layout'));
  1892.    if s='blglyphleft' then layout:=blGlyphLeft
  1893.    else if s='blglyphright' then layout:=blGlyphRight
  1894.    else if s='blglyphtop' then layout:=blGlyphTop
  1895.    else if s='blglyphbottom' then layout:=blGlyphbottom;
  1896.   if (bGlyph <> nil) and (not bglyph.Empty) then
  1897.     GlyphSize := Point(bGlyph.Width div NumGlyphs, bglyph.Height)
  1898.   else if (bglist<>nil) and (imageindex<>-1) then
  1899.     GlyphSize := Point(bglist.Width, bglist.Height)
  1900.   else GlyphSize := Point(0, 0);
  1901.   btemp.canvas.font.assign(font);
  1902.   DrawStyle := dt_WordBreak;
  1903.   s:= StrToWideStr('||');
  1904.   s1:= StrToWideStr(#13#10);
  1905.   caption := StringReplaceW(caption,s,s1);
  1906.   TextBounds := r1;//Rect(0, 0, r1.right-GlyphSize.x, 0);
  1907.   inflaterect(TextBounds,-2,-2);
  1908.   case Layout of
  1909.     blGlyphLeft,blGlyphRight: Dec(TextBounds.Right,GlyphSize.X+2);
  1910.     blGlyphTop,blGlyphBottom: Dec(TextBounds.Bottom,GlyphSize.y+2)
  1911.   end;
  1912.   if Length(Caption) > 0 then  begin
  1913. //    TextBounds := r1;//Rect(0, 0, r1.right-GlyphSize.x, 0);
  1914. //    DrawText(btemp.canvas.handle, PChar(Caption),-1, TextBounds,DT_CALCRECT or dt_left);
  1915.     Tnt_DrawTextW(btemp.canvas.handle,caption,TextBounds,DT_CALCRECT or dt_left or dt_WordBreak);
  1916.     TextSize := Point(TextBounds.Right - TextBounds.Left, TextBounds.Bottom -
  1917.       TextBounds.Top);
  1918.   end  else  begin
  1919.     TextBounds := Rect(0, 0, 0, 0);
  1920.     TextSize := Point(0,0);
  1921.   end;
  1922.   if Layout in [blGlyphLeft, blGlyphRight] then  begin
  1923.     GlyphPos.Y := (ClientSize.y - GlyphSize.Y + 1) div 2;
  1924.     TextPos.Y := (ClientSize.y - TextSize.Y + 1) div 2;
  1925.   end  else   begin
  1926.     GlyphPos.X := (ClientSize.x - GlyphSize.X + 1) div 2;
  1927.     TextPos.X := (ClientSize.x - TextSize.X + 1) div 2;
  1928.   end;
  1929. //  margin:=btn.margin;
  1930. //  spacing:=btn.spacing;
  1931.   if (TextSize.X = 0) or (GlyphSize.X = 0) then
  1932.     Spacing := 0;
  1933.   s := lowercase(GetEnumProperty(control,'Alignment'));
  1934.   if (Margin = -1) or (s='tacenter') then  begin
  1935.     if Spacing = -1 then  begin
  1936.       TotalSize := Point(GlyphSize.X + TextSize.X, GlyphSize.Y + TextSize.Y);
  1937.       if Layout in [blGlyphLeft, blGlyphRight] then
  1938.         Margin := (ClientSize.x - TotalSize.X) div 3
  1939.       else
  1940.         Margin := (ClientSize.y - TotalSize.Y) div 3;
  1941.       Spacing := Margin;
  1942.     end else begin
  1943.       TotalSize := Point(GlyphSize.X+Spacing+TextSize.X, GlyphSize.Y+
  1944.         Spacing + TextSize.Y);
  1945.       if Layout in [blGlyphLeft, blGlyphRight] then
  1946.         Margin := (ClientSize.x - TotalSize.X ) div 2
  1947.       else
  1948.         Margin := (ClientSize.y - TotalSize.Y ) div 2;
  1949.     end;
  1950.   end  else   begin
  1951.     if Spacing = -1 then   begin
  1952.       TotalSize := Point(ClientSize.x - (Margin + GlyphSize.X), ClientSize.y -
  1953.         (Margin + GlyphSize.Y));
  1954.       if Layout in [blGlyphLeft, blGlyphRight] then
  1955.         Spacing := (TotalSize.X - TextSize.X) div 2
  1956.       else
  1957.         Spacing := (TotalSize.Y - TextSize.Y) div 2;
  1958.     end;
  1959.   end;
  1960.   case Layout of
  1961.     blGlyphLeft:
  1962.       begin
  1963.         GlyphPos.X := Margin;
  1964.         TextPos.X := GlyphPos.X + GlyphSize.X + Spacing;
  1965.         DrawStyle:=DT_left or DrawStyle;
  1966.       end;
  1967.     blGlyphRight:
  1968.       begin
  1969.         GlyphPos.X := ClientSize.x - Margin - GlyphSize.X;
  1970.         TextPos.X := GlyphPos.X - Spacing - TextSize.X;
  1971.         DrawStyle:=DT_RIGHT or DrawStyle;
  1972.       end;
  1973.     blGlyphTop:
  1974.       begin
  1975.         GlyphPos.Y := Margin;
  1976.         TextPos.Y := GlyphPos.Y + GlyphSize.Y + Spacing;
  1977.         DrawStyle:=DT_center or DrawStyle;
  1978.       end;
  1979.     blGlyphBottom:
  1980.       begin
  1981.         GlyphPos.Y := ClientSize.y - Margin - GlyphSize.Y;
  1982.         TextPos.Y := GlyphPos.Y - Spacing - TextSize.Y;
  1983.         DrawStyle:=DT_center or DrawStyle;
  1984.       end;
  1985.   end;
  1986.   r1:=rect(glyphpos.x,glyphpos.y,0,0);
  1987.   if (bglyph<>nil) and (not bglyph.Empty) then
  1988.      DrawGlyph(btemp.canvas,r1,bglyph,j,NumGlyphs)
  1989.   else if (bglist<>nil) then begin
  1990.       if enabled then begin
  1991.         if (imageindex<>-1) then
  1992.           bglist.Draw(btemp.canvas, r1.Left, r1.Top, ImageIndex,Enabled);
  1993.       end else begin
  1994.         if (disabledindex<>-1) then
  1995.           bglist.Draw(btemp.canvas, r1.Left, r1.Top, disabledIndex,enabled)
  1996.         else if (imageindex<>-1) then
  1997.           bglist.Draw(btemp.canvas, r1.Left, r1.Top, ImageIndex,Enabled);
  1998.       end;
  1999.   end;
  2000.   TextBounds:= rect(textpos.x,textpos.y,textpos.x+TextSize.x,textpos.y+TextSize.y);
  2001.   SetBkMode(btemp.Canvas.Handle, TRANSPARENT);
  2002. //  if (i=1) and (fsd.button.newnormal) then
  2003.   if (fsd.button.newnormal) then
  2004.        btemp.canvas.Font.Color:= fsd.button.normalcolor2;
  2005.   if (i=4) and (fsd.button.newover) then
  2006.        btemp.canvas.Font.Color:= fsd.button.overcolor2;
  2007.   if (i=2) and (fsd.Button.newdown) then
  2008.        btemp.canvas.Font.Color:= fsd.button.downcolor2;
  2009.   if not enabled then
  2010.          btemp.canvas.Font.Color := clBtnShadow;
  2011.       //    btemp.canvas.Font.Assign(btn.Font);
  2012.      // DrawText(btemp.canvas.Handle, PChar(btn.caption),Length(btn.caption),TextBounds,DrawStyle);
  2013.    if length(caption)>0 then begin
  2014.     drawstyle:=checkbidi(drawstyle);
  2015.     Tnt_DrawTextW(btemp.canvas.Handle,caption,TextBounds,DrawStyle);
  2016.     SetBkMode(btemp.canvas.Handle, OPAQUE);
  2017.     if focused and not (xoNoFocusRect in fsd.Options) then begin
  2018.         InflateRect(TextBounds,2,2);
  2019.         DrawFocusRect(btemp.canvas.Handle,TextBounds);
  2020.      end;
  2021.     end;
  2022.     
  2023.     BitBlt(dc,rc.left ,rc.top,rc.right-rc.left,rc.bottom-rc.Top,
  2024.                  btemp.Canvas.Handle ,0 ,0 ,Srccopy);
  2025.     selectobject(btemp.canvas.handle,cfont);
  2026. end;
  2027. procedure TSkinBitButton.DrawPicControl( dc:HDC; rc:TRect);
  2028. var acolor:Tcolor;
  2029.     i,j:integer;
  2030.     r1,TextBounds:Trect;
  2031.     Layout: TButtonLayout;
  2032.     NumGlyphs,margin,spacing :integer;
  2033.     TextPos: TPoint;
  2034.     GlyphPos, ClientSize, GlyphSize, TextSize: TPoint;
  2035.     TotalSize: TPoint;
  2036.     DrawStyle: Longint;
  2037.     cfont,bfont:Hfont;
  2038.     font:Tfont;
  2039.     style : dword;
  2040.     s,s1:widestring;
  2041.     isdefault:boolean;
  2042.     GlyphObj : TObject ;
  2043.     bGlyph : TGraphic;
  2044. begin
  2045.     Focused := (GetFocus= hWnd);
  2046.     style := GetWindowLong(hWnd,GWL_STYLE);
  2047.     enabled := ( style and WS_DISABLED )=0;
  2048.     //isdefault := (dw = BS_DEFPUSHBUTTON );
  2049.     if control<>nil then
  2050.        caption := GetStringProp(control,'Caption')
  2051.     else
  2052.        caption:=getformcaption(hwnd);
  2053.     i:=1;
  2054.     if Focused then i:=5;
  2055. //    if isdefault then i:=5;
  2056.     if (scDown in state)  then i:=2
  2057.     else if (scMouseIn in state) then i:=4;
  2058.     if not enabled then i:=3;
  2059.     case i of
  2060.       1: j:=1;
  2061.       2: j:=3;
  2062.       3: j:=2;
  2063.       4: j:=1;
  2064.       else j:=1;
  2065.     end;
  2066.     r1:=rc;
  2067.     offsetrect(r1,-r1.left,-r1.top);
  2068.     btemp.width:=r1.right;
  2069.     btemp.height:=r1.bottom;
  2070.     bfont:=sendmessage(hwnd,wm_getfont,0,0);
  2071.     cfont:=selectobject(btemp.canvas.handle,bfont);
  2072.     if trans then
  2073.       DrawParentImage(control,btemp.canvas.handle,true)
  2074.     else
  2075.      fillBG(btemp.canvas.handle,r1);
  2076.     DrawSkinMap( btemp.canvas.handle,r1,fsd.button,I,fsd.button.frame);
  2077.    ClientSize := Point(rc.Right - rc.Left,rc.Bottom - rc.Top);
  2078.    NumGlyphs:=1;
  2079.    
  2080.    GlyphObj := TObject(GetObjectProp(control,PicField,TObject));
  2081.    if (GlyphObj<>nil) then begin
  2082.        bGlyph := TGraphic(GetObjectProp(control,PicField,TGraphic));
  2083.    end else bGlyph:=nil;
  2084.   if (bGlyph <> nil) {and Assigned(bglyph.Graphic)} then
  2085.     GlyphSize := Point(bGlyph.Width div NumGlyphs, bglyph.Height)
  2086.   else GlyphSize := Point(0, 0);
  2087.    font := Tfont(GetObjProp(control,'Font',Tfont));
  2088.    NumGlyphs := GetIntProperty(control,'NumGlyphs') ;
  2089.    if NumGlyphs<0 then NumGlyphs:=1;
  2090.    Margin := GetIntProperty(control,'Margin') ;
  2091.    Spacing := GetIntProperty(control,'Spacing') ;
  2092.    s := lowercase(GetEnumProperty(control,'Layout'));
  2093.    if s='blglyphleft' then layout:=blGlyphLeft
  2094.    else if s='blglyphright' then layout:=blGlyphRight
  2095.    else if s='blglyphtop' then layout:=blGlyphTop
  2096.    else if s='blglyphbottom' then layout:=blGlyphbottom;
  2097.   btemp.canvas.font.assign(font);
  2098.   DrawStyle := dt_WordBreak;
  2099.   s:= StrToWideStr('||');
  2100.   s1:= StrToWideStr(#13#10);
  2101.   caption := StringReplaceW(caption,s,s1);
  2102.   TextBounds := r1;//Rect(0, 0, r1.right-GlyphSize.x, 0);
  2103.   inflaterect(TextBounds,-2,-2);
  2104.   case Layout of
  2105.     blGlyphLeft,blGlyphRight: Dec(TextBounds.Right,GlyphSize.X+2);
  2106.     blGlyphTop,blGlyphBottom: Dec(TextBounds.Bottom,GlyphSize.y+2)
  2107.   end;
  2108.   if Length(Caption) > 0 then  begin
  2109. //    TextBounds := r1;//Rect(0, 0, r1.right-GlyphSize.x, 0);
  2110. //    DrawText(btemp.canvas.handle, PChar(Caption),-1, TextBounds,DT_CALCRECT or dt_left);
  2111.     Tnt_DrawTextW(btemp.canvas.handle,caption,TextBounds,DT_CALCRECT or dt_left or dt_WordBreak);
  2112.     TextSize := Point(TextBounds.Right - TextBounds.Left, TextBounds.Bottom -
  2113.       TextBounds.Top);
  2114.   end  else  begin
  2115.     TextBounds := Rect(0, 0, 0, 0);
  2116.     TextSize := Point(0,0);
  2117.   end;
  2118.   if Layout in [blGlyphLeft, blGlyphRight] then  begin
  2119.     GlyphPos.Y := (ClientSize.y - GlyphSize.Y + 1) div 2;
  2120.     TextPos.Y := (ClientSize.y - TextSize.Y + 1) div 2;
  2121.   end  else   begin
  2122.     GlyphPos.X := (ClientSize.x - GlyphSize.X + 1) div 2;
  2123.     TextPos.X := (ClientSize.x - TextSize.X + 1) div 2;
  2124.   end;
  2125. //  margin:=btn.margin;
  2126. //  spacing:=btn.spacing;
  2127.   if (TextSize.X = 0) or (GlyphSize.X = 0) then
  2128.     Spacing := 0;
  2129.   s := lowercase(GetEnumProperty(control,'Alignment'));
  2130.   if (Margin = -1) or (s='tacenter') then  begin
  2131.     if Spacing = -1 then  begin
  2132.       TotalSize := Point(GlyphSize.X + TextSize.X, GlyphSize.Y + TextSize.Y);
  2133.       if Layout in [blGlyphLeft, blGlyphRight] then
  2134.         Margin := (ClientSize.x - TotalSize.X) div 3
  2135.       else
  2136.         Margin := (ClientSize.y - TotalSize.Y) div 3;
  2137.       Spacing := Margin;
  2138.     end else begin
  2139.       TotalSize := Point(GlyphSize.X+Spacing+TextSize.X, GlyphSize.Y+
  2140.         Spacing + TextSize.Y);
  2141.       if Layout in [blGlyphLeft, blGlyphRight] then
  2142.         Margin := (ClientSize.x - TotalSize.X ) div 2
  2143.       else
  2144.         Margin := (ClientSize.y - TotalSize.Y ) div 2;
  2145.     end;
  2146.   end  else   begin
  2147.     if Spacing = -1 then   begin
  2148.       TotalSize := Point(ClientSize.x - (Margin + GlyphSize.X), ClientSize.y -
  2149.         (Margin + GlyphSize.Y));
  2150.       if Layout in [blGlyphLeft, blGlyphRight] then
  2151.         Spacing := (TotalSize.X - TextSize.X) div 2
  2152.       else
  2153.         Spacing := (TotalSize.Y - TextSize.Y) div 2;
  2154.     end;
  2155.   end;
  2156.   case Layout of
  2157.     blGlyphLeft:
  2158.       begin
  2159.         GlyphPos.X := Margin;
  2160.         TextPos.X := GlyphPos.X + GlyphSize.X + Spacing;
  2161.         DrawStyle:=DT_left or DrawStyle;
  2162.       end;
  2163.     blGlyphRight:
  2164.       begin
  2165.         GlyphPos.X := ClientSize.x - Margin - GlyphSize.X;
  2166.         TextPos.X := GlyphPos.X - Spacing - TextSize.X;
  2167.         DrawStyle:=DT_RIGHT or DrawStyle;
  2168.       end;
  2169.     blGlyphTop:
  2170.       begin
  2171.         GlyphPos.Y := Margin;
  2172.         TextPos.Y := GlyphPos.Y + GlyphSize.Y + Spacing;
  2173.         DrawStyle:=DT_center or DrawStyle;
  2174.       end;
  2175.     blGlyphBottom:
  2176.       begin
  2177.         GlyphPos.Y := ClientSize.y - Margin - GlyphSize.Y;
  2178.         TextPos.Y := GlyphPos.Y - Spacing - TextSize.Y;
  2179.         DrawStyle:=DT_center or DrawStyle;
  2180.       end;
  2181.   end;
  2182.   r1:=rect(glyphpos.x,glyphpos.y,0,0);
  2183.   if (bglyph<>nil) {and Assigned(bglyph.Graphic)} then
  2184.     btemp.Canvas.Draw(r1.left ,r1.top,bglyph);
  2185.   TextBounds:= rect(textpos.x,textpos.y,textpos.x+TextSize.x,textpos.y+TextSize.y);
  2186.   SetBkMode(btemp.Canvas.Handle, TRANSPARENT);
  2187.   if (i=1) and (fsd.button.newnormal) then
  2188.        btemp.canvas.Font.Color:= fsd.button.normalcolor2;
  2189.   if (i=4) and (fsd.button.newover) then
  2190.        btemp.canvas.Font.Color:= fsd.button.overcolor2;
  2191.   if (i=2) and (fsd.Button.newdown) then
  2192.        btemp.canvas.Font.Color:= fsd.button.downcolor2;
  2193.   if not enabled then
  2194.          btemp.canvas.Font.Color := clBtnShadow;
  2195.       //    btemp.canvas.Font.Assign(btn.Font);
  2196.      // DrawText(btemp.canvas.Handle, PChar(btn.caption),Length(btn.caption),TextBounds,DrawStyle);
  2197.    if length(caption)>0 then begin
  2198.     Tnt_DrawTextW(btemp.canvas.Handle,caption,TextBounds,DrawStyle);
  2199.     SetBkMode(btemp.canvas.Handle, OPAQUE);
  2200.     if focused and not (xoNoFocusRect in fsd.Options) then begin
  2201.         InflateRect(TextBounds,2,2);
  2202.         DrawFocusRect(btemp.canvas.Handle,TextBounds);
  2203.      end;
  2204.     end;
  2205.     
  2206.     BitBlt(dc,rc.left ,rc.top,rc.right-rc.left,rc.bottom-rc.Top,
  2207.                  btemp.Canvas.Handle ,0 ,0 ,Srccopy);
  2208.     selectobject(btemp.canvas.handle,cfont);
  2209. end;
  2210. procedure TSkinBitButton.DrawGlyph( acanvas:Tcanvas; rc:TRect;
  2211.        bmp:Tbitmap;I,N:integer);
  2212. var atemp:Tbitmap;
  2213.     w,h,x,j:integer;
  2214. begin
  2215.     atemp:=Tbitmap.create;
  2216.     j:=i;
  2217. //    if n<>4 then i:=1;
  2218.     if j>n then i:=1;
  2219.     w:=bmp.width div n;
  2220.     h:=bmp.height;
  2221.     atemp.height:=h;
  2222.     atemp.width:=w;
  2223.     x:=(i-1)*w;
  2224.     if (j=2) and (n=1) then begin
  2225.        atemp.Free;
  2226.        atemp := GetDisableImg(bmp);
  2227.     end else begin
  2228.        atemp.canvas.copyrect( rect(0,0,w,h),bmp.canvas,rect(x,0,x+w,h));
  2229.     end;
  2230. //    atemp.canvas.copyrect( rect(0,0,w,h),bmp.canvas,rect(x,0,x+w,h));
  2231. //    if (j=2) then
  2232. //       ConvertBitmapToGrayscale (atemp);
  2233.     atemp.Transparent := true;
  2234.     atemp.TransparentMode := tmAuto;
  2235. //      atemp.Transparent:=true;
  2236. //    temp.Transparentcolor:=clFuchsia;
  2237. //    atemp.Transparentcolor:=atemp.Canvas.Pixels[0, h-1];
  2238. //      atemp.Transparentcolor:=atemp.Canvas.Pixels[0, 0];
  2239.     acanvas.draw(rc.left,rc.top,atemp);
  2240.     atemp.free;
  2241. end;
  2242. constructor TWMediaPlayer.Create(AOwner: TComponent);
  2243. begin
  2244.    inherited create(aowner);
  2245.    LoadBitmaps;
  2246. end;
  2247. destructor TWMediaPlayer.Destroy;
  2248. begin
  2249.    inherited destroy;
  2250.    DestroyBitmaps;
  2251. end;
  2252. procedure TWMediaPlayer.attach(askin:TSkinControl;aObj:Twincontrol);
  2253. var s:string;
  2254.     parenthwnd:Thandle;
  2255.     dw:Dword;
  2256. begin
  2257.    obj:=aobj;
  2258.    skincontrol:=askin;
  2259.    fsd:=askin.fsd;
  2260.    tag:=fsd.DisableTag;
  2261.    setposition(obj);
  2262.    parent := obj.Parent;
  2263. end;
  2264. procedure TWMediaPlayer.SetPosition(aObj:Twincontrol);
  2265. begin
  2266.    obj:=aobj;
  2267.    width:=obj.Width;
  2268.    height:= obj.Height ;//div 2;
  2269.    left:= obj.Left;
  2270.    top:=obj.Top;
  2271. end;
  2272. procedure TWMediaPlayer.LoadBitmaps;
  2273. const
  2274.   BtnStateName: array[TMPGlyph] of PChar = ('EN', 'DI', 'CL');
  2275.   BtnTypeName: array[TMPBtnType] of PChar = ('MPPLAY', 'MPPAUSE', 'MPSTOP',
  2276.     'MPNEXT', 'MPPREV', 'MPSTEP', 'MPBACK', 'MPRECORD', 'MPEJECT');
  2277. var
  2278.   I: TMPBtnType;
  2279.   J: TMPGlyph;
  2280.   ResName: array[0..40] of Char;
  2281. begin
  2282.   for I := Low(Buttons) to High(Buttons) do
  2283.   begin
  2284.     for J := Low(TMPGlyph) to High(TMPGlyph) do
  2285.     begin
  2286.       Buttons[I].Bitmaps[J] := TBitmap.Create;
  2287.       Buttons[I].Bitmaps[J].Handle := LoadBitmap(HInstance,
  2288.         StrFmt(ResName, '%s_%s', [BtnStateName[J], BtnTypeName[I]]));
  2289.     end;
  2290.   end;
  2291. end;
  2292. procedure TWMediaPlayer.DestroyBitmaps;
  2293. var
  2294.   I: TMPBtnType;
  2295.   J: TMPGlyph;
  2296. begin
  2297.   for I := Low(Buttons) to High(Buttons) do begin
  2298.     for J := Low(TMPGlyph) to High(TMPGlyph) do
  2299.       Buttons[I].Bitmaps[J].Free;
  2300.   end;
  2301. end;
  2302. procedure TWMediaPlayer.WMLButtonDown(Var aMsg: TMessage);
  2303. begin
  2304.     IsDown:=true;
  2305.     inherited;
  2306.     obj.Perform(amsg.Msg,amsg.WParam,amsg.LParam);
  2307.     ReleaseCapture;
  2308.     Findbutton(amsg.LParamLo,amsg.LParamHi);
  2309.     BtnClick:=BtnFocuse;
  2310.     invalidate;
  2311. end;
  2312. procedure TWMediaPlayer.WMLButtonUp(Var aMsg: TMessage);
  2313. begin
  2314.     IsDown:=false;
  2315.     inherited;
  2316.     Findbutton(amsg.LParamLo,amsg.LParamHi);
  2317.     if btnfocuse=btnclick then
  2318.       obj.Perform(amsg.Msg,amsg.WParam,amsg.LParam);
  2319.     btnclick:=btnfocuse;
  2320.     invalidate;
  2321. end;
  2322. procedure TWMediaPlayer.CheckButtons;
  2323. var  I: TMPBtnType;
  2324.      svisible:string;
  2325.      senable:string;
  2326.      s:string;
  2327. begin
  2328.     svisible:=GetSetProp(obj,'VisibleButtons',true);
  2329.     count:=0;
  2330.     for I := Low(Buttons) to High(Buttons) do begin
  2331.        s:=GetEnumName(TypeInfo(TMPBtnType), Ord(i));
  2332.        buttons[i].Visible:= pos(s,svisible)>0;
  2333.        if buttons[i].Visible then inc(count);
  2334.     end;
  2335. end;
  2336. procedure TWMediaPlayer.FindButton(XPos, YPos: Integer);
  2337. var
  2338.   I: TMPBtnType;
  2339.   X: Integer;
  2340. begin
  2341.   {which button was clicked}
  2342.   X := 0;
  2343.   for I := Low(Buttons) to High(Buttons) do
  2344.   begin
  2345.     if Buttons[I].Visible then
  2346.     begin
  2347.       if (XPos >= X) and (XPos <= X + BtnWidth) then begin
  2348.           Break;
  2349.       end;
  2350.       Inc(X, BtnWidth);
  2351.     end;
  2352.   end;
  2353.   BtnFocuse := I;
  2354. end;
  2355. procedure TWMediaPlayer.Paint;
  2356. var  I: TMPBtnType;
  2357.      svisible:string;
  2358.      senable:string;
  2359.      scolor:string;
  2360.      s:string;
  2361.      temp:Tbitmap;
  2362.      r1,rc:Trect;
  2363.      w,h,x,j:integer;
  2364. begin
  2365.  //   inherited Paint;
  2366.     svisible:=GetSetProp(obj,'VisibleButtons',true);
  2367.     senable:=GetSetProp(obj,'EnabledButtons',true);
  2368.     scolor:=GetSetProp(obj,'ColoredButtons',true);
  2369.     count:=0;
  2370.     for I := Low(Buttons) to High(Buttons) do begin
  2371.        s:=GetEnumName(TypeInfo(TMPBtnType), Ord(i));
  2372.        buttons[i].Visible:= pos(s,svisible)>0;
  2373.        if buttons[i].Visible then inc(count);
  2374.        buttons[i].Enabled:= pos(s,senable)>0;
  2375.        buttons[i].Colored:= pos(s,scolor)>0;
  2376.     end;
  2377.     rc:=rect(0,0,width,height);
  2378.     if count=0 then begin
  2379.       fillcolor(canvas.Handle,rc,fsd.colors[csButtonFace]);
  2380.       exit;
  2381.     end;
  2382. //    rc:=rect(0,0,obj.width,obj.height);
  2383.     w:= rc.right div count;
  2384.     h:= rc.Bottom;
  2385.     btnwidth:=w;
  2386.     temp:=Tbitmap.create;
  2387.     temp.width:= rc.Right;
  2388.     temp.Height:= h;
  2389.     temp.Canvas.brush.Color:= fsd.colors[csButtonFace];
  2390.     temp.Canvas.FillRect(rc);
  2391.     x:=0;
  2392.     for I := Low(Buttons) to High(Buttons) do begin
  2393.         r1:=rect(x,0,x+w,h);
  2394.         j:=1;
  2395.         if buttons[i].Visible then begin
  2396.            DrawButton(temp.canvas,i,r1);
  2397.            inc(x,w);
  2398.         end;
  2399.     end;
  2400.     BitBlt(canvas.Handle,rc.left ,rc.top,rc.right,rc.bottom,
  2401.                  temp.Canvas.Handle ,0 ,0 ,Srccopy);
  2402.     temp.free;
  2403. end;
  2404. procedure TWMediaPlayer.DrawButton(acanvas:Tcanvas;Btn:TMPBtnType;R:TRect);
  2405. var j:integer;
  2406.   TheGlyph: TMPGlyph;
  2407.   Bitmap: TBitmap;
  2408.   x,y:integer;
  2409. begin
  2410.    if Buttons[Btn].Enabled then begin
  2411.       TheGlyph := mgEnabled;
  2412.      if Buttons[Btn].Colored then
  2413.         TheGlyph := mgColored;
  2414.    end else TheGlyph := mgDisabled;
  2415.    j:=1;
  2416.    if IsDown and (btn=BtnClick) then j:=2;
  2417.    if TheGlyph = mgDisabled then j:=3;
  2418.     DrawRect2(acanvas.handle,r,fsd.button.map,
  2419.              fsd.button.r,j,fsd.button.frame,fsd.button.trans,fsd.button.tile);
  2420.     Bitmap := Buttons[Btn].Bitmaps[TheGlyph];
  2421.     X := (r.Right-r.Left-Bitmap.Width) div 2;
  2422.     Y := (r.Bottom - r.Top - Bitmap.Height) div 2;
  2423.     if j=2 then begin
  2424.       Inc(X);
  2425.       Inc(Y);
  2426.     end;
  2427.     acanvas.BrushCopy(Bounds(r.Left + X, Y, Bitmap.Width, Bitmap.Height),
  2428.       Bitmap, Rect(0, 0, Bitmap.Width, Bitmap.Height), clOlive);
  2429. end;
  2430. Procedure TSkinMP.Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);
  2431. var s:string;
  2432. begin
  2433.     inherited init(sf,sd,acanvas,acolor);
  2434.     mp:=TWMediaPlayer.create(sf);
  2435.     mp.attach(self,control);
  2436.     mp.Visible:=control.Visible;
  2437. {    mp.fsd := sd;
  2438.     mp.obj:=control;
  2439.     mp.Width:= control.Width ;
  2440.     mp.Height:= control.Height div 2;
  2441.     mp.left:=0;
  2442.     mp.top:=0;
  2443.     mp.Parent := control;}
  2444. end;
  2445. procedure TSkinMP.AfterProc(var Message: TMessage);
  2446. begin
  2447.     case message.msg of
  2448.       CM_VISIBLECHANGED : begin
  2449.             mp.Visible:=control.Visible;
  2450.          end;
  2451.       WM_WINDOWPOSCHANGED: begin
  2452.            if mp<>nil then mp.SetPosition(control);
  2453.          end;
  2454.     else inherited Afterproc(message);
  2455.     end;
  2456. end;
  2457. procedure TSkinMP.Unsubclass;
  2458. begin
  2459.    inherited unsubclass;
  2460.    if skinstate<>skin_deleted then begin
  2461.      if mp<>nil then mp.free;
  2462.      mp:=nil;
  2463.    end else begin
  2464.    end;
  2465. end;
  2466. procedure TSkinMenuButton.DrawGlyph( acanvas:Tcanvas; rc:TRect;
  2467.        bmp:Tbitmap;I,N:integer);
  2468. var atemp:Tbitmap;
  2469.     w,h,x,j:integer;
  2470. begin
  2471.     atemp:=Tbitmap.create;
  2472.     j:=i;
  2473. //    if n<>4 then i:=1;
  2474.     if j>n then i:=1;
  2475.     w:=bmp.width div n;
  2476.     h:=bmp.height;
  2477.     atemp.height:=h;
  2478.     atemp.width:=w;
  2479.     x:=(i-1)*w;
  2480.     if (j=2) and (n=1) then begin
  2481.        atemp.Free;
  2482.        atemp := GetDisableImg(bmp);
  2483.     end else begin
  2484.        atemp.canvas.copyrect( rect(0,0,w,h),bmp.canvas,rect(x,0,x+w,h));
  2485.     end;
  2486. //    atemp.canvas.copyrect( rect(0,0,w,h),bmp.canvas,rect(x,0,x+w,h));
  2487. //    if (j=2) then
  2488. //       ConvertBitmapToGrayscale (atemp);
  2489.     atemp.Transparent := true;
  2490.     atemp.TransparentMode := tmAuto;
  2491. //      atemp.Transparent:=true;
  2492. //    temp.Transparentcolor:=clFuchsia;
  2493. //    atemp.Transparentcolor:=atemp.Canvas.Pixels[0, h-1];
  2494. //      atemp.Transparentcolor:=atemp.Canvas.Pixels[0, 0];
  2495.     acanvas.draw(rc.left,rc.top,atemp);
  2496.     atemp.free;
  2497. end;
  2498. procedure TSkinMenuButton.DrawControl( dc:HDC; rc:TRect);
  2499. var acolor:Tcolor;
  2500.     i:integer;
  2501.     r1,r2,TextBounds:Trect;
  2502.     TextPos: TPoint;
  2503.     ClientSize, GlyphSize, TextSize: TPoint;
  2504.     arrowsize,GlyphPos,arrowpos: TPoint;
  2505.     TotalSize: TPoint;
  2506.     x,y:integer;
  2507.     DrawStyle: Longint;
  2508.     cfont,bfont:Hfont;
  2509.     font:Tfont;
  2510.     style : dword;
  2511.     s,s1:widestring;
  2512.     isdefault:boolean;
  2513.     bglyph:Tbitmap;
  2514.     Margin,Spacing :integer;
  2515.     Layout: TButtonLayout;
  2516. begin
  2517.     if fsd.button=nil then exit;
  2518.     if fsd.Button.map.empty then exit;
  2519. //    DrawStyle:=DT_LEFT;
  2520.     Focused := (GetFocus= hWnd);
  2521.     style := GetWindowLong(hWnd,GWL_STYLE);
  2522.     enabled := ( style and WS_DISABLED )=0;
  2523.     //isdefault := (dw = BS_DEFPUSHBUTTON );
  2524.     if control<>nil then
  2525.        caption := GetStringProp(control,'Caption')
  2526. //       caption := GetControlCaption(TACControl(control))
  2527.     else
  2528.        caption:=getformcaption(hwnd);
  2529.     i:=1;
  2530.     if Focused then i:=4;
  2531. //    if isdefault then i:=5;
  2532.     if (scDown in state)  then i:=2
  2533.     else if (scMouseIn in state) then i:=4;
  2534.     if not enabled then i:=3;
  2535.     r1:=rc;
  2536.     offsetrect(r1,-r1.left,-r1.top);
  2537.     btemp.width:=r1.right;
  2538.     btemp.height:=r1.bottom;
  2539.     bfont:=sendmessage(hwnd,wm_getfont,0,0);
  2540.     cfont:=selectobject(btemp.canvas.handle,bfont);
  2541.     bglyph := Tbitmap(GetObjProp(control,'Glyph',Tbitmap));
  2542.    Margin := GetIntProperty(control,'Margin') ;
  2543.    Spacing := GetIntProperty(control,'Spacing') ;
  2544.    Layout := blGlyphLeft;
  2545.   if (bGlyph <> nil) and (not bglyph.Empty) then
  2546.     GlyphSize := Point(bGlyph.Width, bglyph.Height)
  2547.   else GlyphSize := Point(0, 0);
  2548.     if trans then
  2549.       DrawParentImage(control,btemp.canvas.handle,true)
  2550.     else
  2551.      fillBG(btemp.canvas.handle,r1);
  2552.     DrawSkinMap( btemp.canvas.handle,r1,fsd.button,I,fsd.button.frame);
  2553.    ClientSize := Point(rc.Right - rc.Left,rc.Bottom - rc.Top);
  2554.    font := Tfont(GetObjProp(control,'Font',Tfont));
  2555.    arrowsize := Point(8,3);
  2556.   btemp.canvas.font.assign(font);
  2557.   DrawStyle := dt_WordBreak;
  2558.   s:= StrToWideStr('||');
  2559.   s1:= StrToWideStr(#13#10);
  2560.   caption := StringReplaceW(caption,s,s1);
  2561.   TextBounds := Rect(0, 0, r1.right-GlyphSize.x-arrowsize.X, r1.Bottom);
  2562.   inflaterect(TextBounds,-2,-2);
  2563.   if Length(Caption) > 0 then  begin
  2564. //    TextBounds := r1;//Rect(0, 0, r1.right-GlyphSize.x, 0);
  2565. //    DrawText(btemp.canvas.handle, PChar(Caption),-1, TextBounds,DT_CALCRECT or dt_left);
  2566.     Tnt_DrawTextW(btemp.canvas.handle,caption,TextBounds,DT_CALCRECT or dt_left or dt_WordBreak);
  2567.     TextSize := Point(TextBounds.Right - TextBounds.Left, TextBounds.Bottom -
  2568.       TextBounds.Top);
  2569.   end  else  begin
  2570.     TextBounds := Rect(0, 0, 0, 0);
  2571.     TextSize := Point(0,0);
  2572.   end;
  2573.   if (Margin = -1) then  begin
  2574.     if Spacing = -1 then  begin
  2575.       TotalSize := Point(GlyphSize.X + TextSize.X+arrowsize.X, GlyphSize.Y + TextSize.Y+arrowsize.Y);
  2576.       if Layout in [blGlyphLeft, blGlyphRight] then
  2577.         Margin := (ClientSize.x - TotalSize.X) div 4
  2578.       else
  2579.         Margin := (ClientSize.y - TotalSize.Y) div 4;
  2580.       Spacing := Margin;
  2581.     end else begin
  2582.       TotalSize := Point(GlyphSize.X+Spacing+TextSize.X+spacing+arrowsize.X, GlyphSize.Y+
  2583.         Spacing*2 + TextSize.Y+arrowsize.Y);
  2584.       if Layout in [blGlyphLeft, blGlyphRight] then
  2585.         Margin := (ClientSize.x - TotalSize.X ) div 2
  2586.       else
  2587.         Margin := (ClientSize.y - TotalSize.Y ) div 2;
  2588.     end;
  2589.   end  else   begin
  2590.     if Spacing = -1 then   begin
  2591.       TotalSize := Point(ClientSize.x - (Margin*2 + GlyphSize.X-arrowsize.X), ClientSize.y -
  2592.         (Margin*2 + GlyphSize.Y-arrowsize.Y));
  2593.       if Layout in [blGlyphLeft, blGlyphRight] then
  2594.         Spacing := (TotalSize.X - TextSize.X) div 2
  2595.       else
  2596.         Spacing := (TotalSize.Y - TextSize.Y) div 2;
  2597.     end;
  2598.   end;
  2599.   GlyphPos.X := Margin;
  2600.   GlyphPos.Y:= (ClientSize.y - GlyphSize.Y) div 2;
  2601.   TextPos.Y := (ClientSize.y - TextSize.Y + 1) div 2;
  2602.   textpos.x := GlyphPos.x+ GlyphSize.X+ Spacing;
  2603.   arrowpos.X := TextPos.x+ Spacing*2+TextSize.x;
  2604.   arrowpos.Y := (ClientSize.y - arrowsize.Y) div 2;
  2605.   r2:=rect(glyphpos.x,glyphpos.y,0,0);
  2606.   if (bglyph<>nil) and (not bglyph.Empty) then
  2607.      DrawGlyph(btemp.canvas,r2,bglyph,1,1)  ;
  2608.   TextBounds:= rect(textpos.x,textpos.y,textpos.x+TextSize.x,textpos.y+TextSize.y);
  2609.   if (i=1) and (fsd.button.newnormal) then
  2610.        btemp.canvas.Font.Color:= fsd.button.normalcolor2;
  2611.   if (i=4) and (fsd.button.newover) then
  2612.        btemp.canvas.Font.Color:= fsd.button.overcolor2;
  2613.   if (i=2) and (fsd.Button.newdown) then
  2614.        btemp.canvas.Font.Color:= fsd.button.downcolor2;
  2615.   btemp.Canvas.Brush.Color := clWindowText;
  2616.   btemp.Canvas.Pen.Color := clWindowText;
  2617.   if not enabled then begin
  2618.       btemp.canvas.Font.Color := clBtnShadow;
  2619.       btemp.Canvas.Brush.Color := clBtnShadow;
  2620.       btemp.Canvas.Pen.Color := clBtnShadow;
  2621.   end;
  2622.   X := arrowpos.X;
  2623.   Y := arrowpos.y + 2;
  2624.   btemp.Canvas.Polygon( [ Point( X, Y ), Point( X - 3, Y - 3 ), Point( X + 3, Y - 3 ) ] );
  2625.   SetBkMode(btemp.Canvas.Handle, TRANSPARENT);
  2626.     Tnt_DrawTextW(btemp.canvas.Handle,caption,TextBounds,DrawStyle);
  2627.     SetBkMode(btemp.canvas.Handle, OPAQUE);
  2628.     if focused and not (xoNoFocusRect in fsd.Options) then begin
  2629.         InflateRect(TextBounds,2,2);
  2630.         DrawFocusRect(btemp.canvas.Handle,TextBounds);
  2631.      end;
  2632.     BitBlt(dc,rc.left ,rc.top,rc.right-rc.left,rc.bottom-rc.Top,
  2633.                  btemp.Canvas.Handle ,0 ,0 ,Srccopy);
  2634.     selectobject(btemp.canvas.handle,cfont);
  2635. end;
  2636. Procedure TSkinSpeedButton.InitGraphicControl(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas);
  2637. begin
  2638.    fsd:=sd;
  2639.    fCanvas:=acanvas;
  2640.    gcontrol:=TGraphicControl(owner);
  2641.    skinform:=sf;
  2642.    OldWndProc:= gControl.WindowProc;
  2643.    gControl.WindowProc := NewWndProc;
  2644.    Twinskinform(skinform).addcontrollist(self);
  2645.    skinstate:=skin_active;
  2646.    if (gcontrol.Tag=5555) or (xoTransparent in fsd.options) then
  2647.        trans:=true;
  2648. end;
  2649. constructor TSkinSpeedButton.Create(AOwner: TComponent);
  2650. begin
  2651.    inherited create(aowner);
  2652.    fReentr := False;
  2653.    picfield := '';
  2654. //   gcanvas:=Tcanvas.create;
  2655. end;
  2656. destructor TSkinSpeedButton.Destroy;
  2657. begin
  2658. //   gcanvas.free;
  2659.    if assigned(oldwndproc) then begin
  2660.        if gcontrol<>nil then gControl.WindowProc := OldWndProc;
  2661.        oldwndproc:=nil;
  2662.    end;
  2663.    inherited destroy;
  2664. end;
  2665. function TSkinSpeedButton.BeforeProc(var Message: TMessage):boolean;
  2666. var rc:Trect;
  2667.     C :TCanvas;
  2668. begin
  2669.     result:=true;
  2670.     case message.msg of
  2671.     WM_LBUTTONDOWN, WM_LBUTTONDBLCLK:
  2672.       begin
  2673.        default(message);
  2674.        state:=state+[scDown];
  2675.        PaintControl;
  2676.        result:=false;
  2677.       end;
  2678.     WM_LBUTTONUP:
  2679.       begin
  2680.        result:=true;
  2681.       end;
  2682.     WM_Paint: begin
  2683.         WMPaintSpeed(message);
  2684.         result:=false;
  2685. //        message.result:=1;
  2686.     end;
  2687.     else result:=inherited beforeProc(message);
  2688.     end;
  2689. end;
  2690. {procedure TSkinSpeedButton.WMPaintSpeed(var Message:Tmessage);
  2691. var  C : TControlCanvas;
  2692.      rc:TREct;
  2693. begin
  2694.    rc:=gcontrol.ClientRect;
  2695.    OffsetRect( rc, -rc.left, -rc.top );
  2696.    C := TControlCanvas.Create;
  2697.    C.handle :=  TWMPaint(Message).DC;
  2698.    try
  2699.      C.Control := gControl;
  2700.      DrawSpeedbtn( c,rc);
  2701. //    DrawSpeedbtn(TAcGraphicControl(gcontrol).Canvas,rc);
  2702.    finally
  2703.      C.Free;
  2704.    end;
  2705.     message.result:=1;
  2706. end;     }
  2707. procedure TSkinSpeedButton.WMPaintSpeed(var Message:Tmessage);
  2708. var  C : TControlCanvas;
  2709.      rc:TREct;
  2710. begin
  2711.    rc:=gcontrol.ClientRect;
  2712.    OffsetRect( rc, -rc.left, -rc.top );
  2713.    if TWMPaint(Message).DC<>0 then begin
  2714.        TAcGraphicControl(gcontrol).Canvas.Lock;
  2715.        try
  2716.           TAcGraphicControl(gcontrol).Canvas.Handle := TWMPaint(Message).DC;
  2717.           try
  2718.             DrawSpeedbtn(TAcGraphicControl(gcontrol).Canvas,rc);
  2719.          finally
  2720.             TAcGraphicControl(gcontrol).Canvas.Handle := 0;
  2721.          end;
  2722.        finally
  2723.          TAcGraphicControl(gcontrol).Canvas.Unlock;
  2724.       end;
  2725.    end;
  2726.    message.result:=1;
  2727. end; 
  2728. procedure TSkinSpeedButton.AfterProc(var Message: TMessage);
  2729. begin
  2730.     case message.msg of
  2731.     CM_MOUSEENTER:
  2732.       begin
  2733.         state:=state+[scMouseIn];
  2734. //        if gcontrol.Visible then
  2735. //           gcontrol.Invalidate;
  2736.         PaintControl;
  2737.       end;
  2738.     CM_MOUSELEAVE:
  2739.       begin
  2740.         state:=state-[scMouseIn];
  2741.         state:=state-[scDown];
  2742. //        if gcontrol.Visible then
  2743. //           gcontrol.Invalidate ;
  2744.         if gcontrol.Visible then
  2745.         PaintControl;
  2746.       end;
  2747.     WM_LBUTTONUP:
  2748.       begin
  2749.        state:=state-[scDown];
  2750.        PaintControl;
  2751. //       TSpeedButton(gcontrol).click;
  2752.       end;
  2753.     WM_KEYDOWN:
  2754.       if Message.WParam = VK_SPACE then begin
  2755.        state:=state+[scDown];
  2756.        PaintControl;
  2757.       end;
  2758.     WM_KEYUP:
  2759.       if Message.WParam = VK_SPACE then begin
  2760.         state:=state-[scDown];
  2761.         PaintControl;
  2762.       end;
  2763.     WM_NCDESTROY,CM_RELEASE:begin
  2764.          if assigned(oldwndproc) then begin
  2765.              gControl.WindowProc := OldWndProc;
  2766.              oldwndproc:=nil;
  2767.          end;
  2768.        end;
  2769.     CM_FOCUSCHANGED : begin
  2770.        end;
  2771.     wm_enable,CM_ENABLEDCHANGED:;
  2772.     else inherited AfterProc(Message);
  2773.     end;
  2774. end;
  2775. {procedure TSkinSpeedButton.PaintControl(adc:HDC=0);
  2776. var rc:TRect;
  2777.     C : TControlCanvas;
  2778. begin
  2779.    rc:=gcontrol.ClientRect;
  2780.    OffsetRect( rc, -rc.left, -rc.top );
  2781.    C := TControlCanvas.Create;
  2782.    try
  2783. //    C.Control := gControl;
  2784. //   if TAcGraphicControl(gcontrol).Canvas.handle<>0 then
  2785. //     DrawSpeedbtn(TAcGraphicControl(gcontrol).Canvas,rc);
  2786. //   Application.ProcessMessages;
  2787.     DrawSpeedbtn(TAcGraphicControl(gcontrol).Canvas,rc);
  2788. //    DrawSpeedbtn(gcontrol.c,rc);
  2789.    finally
  2790.     C.Free;
  2791.    end;
  2792. end;}
  2793. procedure TSkinSpeedButton.PaintControl(adc:HDC=0);
  2794. var rc:TRect;
  2795.     C : TControlCanvas;
  2796. begin
  2797.    rc:=gcontrol.ClientRect;
  2798.    OffsetRect( rc, -rc.left, -rc.top );
  2799.    if TAcGraphicControl(gcontrol).Canvas.Handle<>0 then begin
  2800.        TAcGraphicControl(gcontrol).Canvas.Lock;
  2801.        try
  2802.             DrawSpeedbtn(TAcGraphicControl(gcontrol).Canvas,rc);
  2803.        finally
  2804.          TAcGraphicControl(gcontrol).Canvas.Unlock;
  2805.       end;
  2806.    end;
  2807. end;
  2808. procedure TSkinSpeedButton.DrawSpeedbtn( acanvas:Tcanvas; rc:TRect);
  2809. var acolor:Tcolor;
  2810.     i,n,j:integer;
  2811.     r1,TextBounds:Trect;
  2812.     TextPos: TPoint;
  2813.     GlyphPos, ClientSize, GlyphSize, TextSize: TPoint;
  2814.     TotalSize: TPoint;
  2815.     DrawStyle: Longint;
  2816.     Layout: TButtonLayout;
  2817.     NumGlyphs,margin,spacing :integer;
  2818.     bglyph:Tbitmap;
  2819.     s:string;
  2820.     font:Tfont;
  2821.     flat:boolean;
  2822.     enable:boolean;
  2823. begin
  2824.     if fsd.button=nil then exit;
  2825.     if fsd.Button.map.empty then exit;
  2826.     s:=lowercase(GetEnumProperty(gcontrol,'Visible'));
  2827.     if s = 'false' then exit;
  2828.     if length(Picfield)>0 then begin
  2829.        drawpicbtn(acanvas,rc);
  2830.        exit;
  2831.     end;
  2832.  // RF: flag for reentrancy
  2833.  if fReentr then Exit;
  2834.  fReentr := True;
  2835. // acanvas.Lock;
  2836. try
  2837.     DrawStyle:=DT_LEFT or dt_WordBreak;
  2838.     i:=1;
  2839.     if (scDown in state) then i:=2
  2840.     else if (scMouseIn in state) then i:=4;
  2841.     s:=lowercase(GetEnumProperty(gcontrol,'Enabled'));
  2842.     if s='true' then enable:=true
  2843.     else enable:=false;
  2844.     if not enable then i:=3;
  2845.     s:=lowercase(GetEnumProperty(gcontrol,'Down'));
  2846.     if s='true' then  i:=2 ;
  2847.     j:=1;
  2848.     case i of
  2849.        1: j:=1;
  2850.        2: j:=3;
  2851.        3: j:=2;
  2852.        4: j:=1;
  2853.     end;
  2854.     if s='true' then  j:=4 ;
  2855.    caption := GetStringProp(gcontrol,'Caption');
  2856.    font := Tfont(GetObjProp(gcontrol,'Font',Tfont));
  2857.    bglyph := Tbitmap(GetObjProp(gcontrol,'Glyph',Tbitmap));
  2858.    NumGlyphs := GetIntProperty(gcontrol,'NumGlyphs') ;
  2859.    if NumGlyphs<0 then NumGlyphs:=1;
  2860. //   bglist := Timagelist(GetObjProp(gcontrol,'Images',Timagelist));
  2861. //   imageindex := GetIntProperty(gcontrol,'ImageIndex') ;
  2862. //   disabledindex := GetIntProperty(gcontrol,'DisabledIndex') ;
  2863.    s:=lowercase(GetEnumProperty(gcontrol,'Flat'));
  2864.    if s='true' then flat:=true
  2865.    else flat:=false;
  2866.    Margin := GetIntProperty(gcontrol,'Margin') ;
  2867.    Spacing := GetIntProperty(gcontrol,'Spacing') ;
  2868.    s := lowercase(GetEnumProperty(gcontrol,'Layout'));
  2869.    if s='blglyphleft' then layout:=blGlyphLeft
  2870.    else if s='blglyphright' then layout:=blGlyphRight
  2871.    else if s='blglyphtop' then layout:=blGlyphTop
  2872.    else if s='blglyphbottom' then layout:=blGlyphbottom;