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

Delphi控件源码

开发平台:

Delphi

  1. Unit WinSkinForm;
  2. {$I Compilers.Inc}
  3. {$IFDEF demo}
  4. {.$define test}
  5. {$ELSE}
  6. {.$define test}
  7. {$ENDIF}
  8. {$WARNINGS OFF}
  9. {$HINTS OFF}
  10. {$RANGECHECKS OFF}
  11. interface
  12. uses
  13.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  14.   ExtCtrls,StdCtrls,ComCtrls,Menus,Buttons,ImgList,grids,commctrl,
  15.   WinSkinData,winsubclass,Consts,typinfo;
  16. const
  17.   CN_FormUPdate = WM_USER + $3102;
  18.   CN_NewForm = WM_USER + $3103;
  19.   CN_IsSkined = WM_USER + $3123;
  20.   CN_NewMDIChild = WM_USER + $3116;
  21.   CN_ReCreateWnd = WM_USER + $3117;
  22.   CN_MenuSelect = WM_USER + $3118;
  23.   cKey1 = 27969;
  24.   cKey2 = 380323;
  25.   MAX_CLASSNAME =100;
  26.   MAX_MENUITEM_TEXT =64;
  27.   Max_MenuitemID=$1000;
  28.   c_demo : Array[0..12] of char =
  29.        (#$0ca, #$33, #$70, #$30, #$0f1, #$9a,
  30. #$01, #$65, #$0e9, #$32, #$0dc, #$82,#$4f);
  31. type
  32.   TWinSkinForm = class;
  33.   TWinSkinSpy = class;
  34.   NMCSBCUSTOMDRAW = record
  35. hdr : NMHDR;
  36. dwDrawStage :DWORD;
  37. hdc : HDC ;
  38. rc  : TRect;
  39. uItem :UINT ;
  40. uState :UINT ;
  41. nBar : UINT ;
  42.   end;
  43.   pNMCSBCUSTOMDRAW=^NMCSBCUSTOMDRAW;
  44.   TNCObject = class(Tobject)
  45.   private
  46.   public
  47.      SF: TWinSkinForm;
  48.      fsd  : TSkinData;
  49.      bounds : Trect;
  50.      visible:boolean;
  51.      state : integer;
  52.      enabled : boolean;
  53.      procedure MouseDown; virtual;
  54.      procedure MouseUp; virtual;
  55.      procedure MouseEnter; virtual;
  56.      procedure MouseLeave; virtual;
  57.      procedure Draw;virtual;
  58.   end;
  59.   TMenuBtn = class(TNCObject)
  60.   private
  61.   public
  62.      menuitem: Tmenuitem;
  63.      FSD  : TSkinData;
  64.      index: integer;
  65.      caption :widestring;
  66.      enabled:boolean;
  67.      hsubmenu:Hmenu;
  68.      mid: integer;
  69.      procedure draw;override;
  70.   end;
  71.   TWinSysButton = class(TNCObject)
  72.   private
  73.   public
  74.      data : TDataSkinSysButton;
  75.      procedure draw;override;
  76.   end;
  77.   TWinSkinMenu = class(TComponent)
  78.   private
  79.      procedure Copymenu(source,dst:Hmenu);
  80.   public
  81.      Buttons: array of TMenuBtn;
  82.      menu: Tmainmenu;
  83.      Bar : Trect;
  84.      FSD : TSkinData;
  85.      SF  : TWinSkinForm;
  86.      bkmap : Tbitmap;
  87.      count:integer;
  88.      topmenu:boolean;
  89.      hmenu:HMenu;
  90.      constructor Create(AOwner: TComponent); override;
  91.      destructor Destroy; override;
  92.      procedure UpdataBtn;
  93.      procedure UpdataBtn1;
  94.      procedure UpdataBtn2(newmenu:Thandle);
  95.      procedure UpdataBtn3;
  96.      procedure DrawMenu(dc:HDC;rc:TRect);
  97.      function FindBtn(p:Tpoint):TNcobject;
  98.      procedure MouseMove(p:Tpoint);
  99.      procedure SetMenuRect;
  100.   end;
  101.   TSkinFormStyle = (sfsNormal,sfsMDIform,sfsMDIChild,sfsChild);
  102.   TSkinFormBorder = (sbsSizeable,sbsSingle,sbsNone,sbsDialog);
  103.   TSkinWindowState = (swsNormal,swsMax,swsMin);
  104.   TSkinFormIcon = (sbiMax,sbiMin,sbiHelp,sbisystem,sbicaption);
  105.   TSkinFormIcons = set of TSkinFormIcon;
  106.   TWinSkinForm = class(TComponent)
  107.   private
  108.     done,done2 : boolean;
  109.     OldWndProc: TWndMethod;
  110.     FPrevWndProc: Pointer;
  111.     FObjectInst: Pointer;
  112.     FMDIWndProc: Pointer;
  113.     FMDIObjectInst: Pointer;
  114.     CaptionFont: Tfont;
  115.     FActive: boolean;
  116.     BorderIcons:TBorderIcons;
  117.     FOverrideOwnerDraw: boolean;
  118.     timer:TTimer;
  119.     bstr,astr:widestring;
  120.     classname:string;
  121.     hassysbtn,menuauto,sMainMenu:boolean;
  122.     fClientRect:TRect;
  123.     msglock:integer;
  124.     poptime : dword;
  125.     DoubleTime : integer;
  126.     charwidth:integer;
  127.     parenthwnd:Thandle;
  128.     DefIcon: HIcon;
  129.     Iconx : integer;
  130.     procedure GetIcon(var bmp:Tbitmap);
  131.     procedure DeleteControls;
  132.     procedure SetActive(const Value: boolean);
  133.     procedure WinWndProc(var aMsg: TMessage);
  134.     procedure NewWndProc(var aMsg: TMessage);
  135.     procedure Default(Var Msg: TMessage);
  136.     procedure WMActive(Var Msg: TMessage);
  137.     procedure WMNCCalcSize(Var Msg: TMessage);
  138.     procedure WMNCActive(Var Msg: TMessage);
  139.     procedure WMNCPaint(Var Msg: TMessage);
  140.     procedure WMNCMouseMove(Var Msg: TMessage);
  141.     procedure WMNCLButtonDown(var Msg:TMessage);
  142.     procedure WMNCLBUTTONDBLCLK(Var Msg: TMessage);
  143.     procedure WMNCLButtonUp(var Msg:TMessage);
  144.     procedure WMNCRButtonUp(var Msg:TMessage);
  145.     procedure WMMouseMove(Var Msg: TMessage);
  146.     procedure WMNCHitTest(Var Msg: TMessage);
  147.     procedure WMSysCommand(var Msg: Tmessage);
  148.     procedure WMCommand(var Msg: Tmessage);
  149.     procedure WMINITMENU(hm:Hmenu);
  150.     procedure WMMEASUREITEM(var Msg: Tmessage);
  151.     procedure WMMEASUREITEMH(var Msg: Tmessage);
  152.     procedure WMDRAWITEM(var Msg: Tmessage);
  153. //    procedure WMPaint(var Msg: Tmessage);
  154.     procedure WMERASEBKGND(var Msg: TMessage);
  155.     procedure WMSize(Var Msg: TMessage);
  156.     procedure WMGetMinMaxInfo(Var Msg: TMessage);
  157.     procedure CMDialogChar(var Message: TMessage);
  158.     procedure WMCtlcolor(Var Msg: TMessage);
  159.     procedure WMWINDOWPOSCHANGED(Var Msg: TMessage);
  160.     procedure WMWindowPosChanging(Var Msg: TMessage);
  161.     procedure WMMDIACTIVATE(var aMsg: TMessage);
  162.     procedure WMMDIACTIVATE2(Var Msg: TMessage);
  163.     procedure WMMDITile(var aMsg: TMessage);
  164.     procedure WMReCreateWnd(var Msg: Tmessage);
  165.     procedure DrawLine(acanvas:Tcanvas;rc:TRect);
  166.     procedure CreateCaptionFont;
  167.     procedure Drawborder(n:integer;Rc:Trect;dc:HDC);
  168.     procedure SetSysbtnRect;
  169.     procedure DrawAllSysbtn(acanvas:Tcanvas;rc:TRect);
  170.     procedure DrawMin(dc:HDC);
  171.     function SysBtnVisible(i:integer):boolean;
  172.     function FindBtn(Point: TPoint): TNcobject;
  173.     function GetWinXY(x,y:Smallint):Tpoint;
  174.     procedure SysBtnAction(x,y:smallint);
  175. //    procedure UpdateNc;
  176. //    procedure UpdateNc(Rgn: HRgn=1);
  177.     procedure UpdateNc(adc:HDC=0);
  178.     procedure DrawFLine(dc:HDC);
  179.     procedure ToolBarDrawButton(Sender: TToolBar;
  180.          Button: TToolButton; State: TCustomDrawState; var DefaultDraw: Boolean);
  181.     procedure ToolBarDrawBackground(Sender: TToolBar; const ARect: TRect; var DefaultDraw: Boolean);
  182.     procedure MeasureItemPop(Sender: TObject; ACanvas: TCanvas;
  183.               var Width, Height: Integer);
  184.     function GetMenuBG:Tbitmap;
  185.     procedure DrawMenuCaption(ACanvas: TCanvas; ARect: TRect);
  186.     procedure WMDrawMenuitem(var Msg: Tmessage);
  187.     procedure WMDrawMenuitemH(var Msg: Tmessage);
  188.     procedure DrawHMenuItem2(Amenu:Hmenu;Sender:TObject; ACanvas: TCanvas; ARect: TRect;
  189.        Selected: Boolean);
  190.     function  CreateMenuItem(amenu:Hmenu;aid:integer):Tmenuitem;
  191.     procedure DefaultMenuItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect;
  192.          Selected: Boolean);
  193.     procedure DrawItemText(Item:TMenuitem;ACanvas: TCanvas;
  194.                  ARect: TRect;Selected:boolean);
  195.     procedure DoDrawText(item:Tmenuitem;ACanvas: TCanvas; const ACaption: widestring;
  196.        var Rect: TRect; Selected: Boolean; Flags: Longint);
  197.     procedure OnTimer(Sender: TObject);
  198. //    procedure ClearTempMenu;
  199.     procedure CancelMenu;
  200.     function FindButtonFromAccel(Accel: Word): TMenuBtn;
  201.     procedure CreateSysmenu;
  202.     procedure CreateSysmenu2;
  203.     procedure DoSysMenu(Sender: TObject);
  204.     procedure DoSysMenu2(Sender: TObject);
  205.     function IsScrollControl(acontrol:TComponent):boolean;
  206.     procedure KeepClient;
  207.     procedure SelectMDIform(Sender: TObject);
  208.     procedure ChangeMDIStyle;
  209.     function Lookupcontrol(ahwnd:Thandle):Tskincontrol;
  210.     procedure GetWindowstate;
  211.     procedure GetFormstyle;
  212.     procedure PopSysmenu(p:Tpoint);
  213.     procedure MDIChildAction(const action:Integer);
  214.     procedure UnSubclassMDI;
  215.     procedure SubclassMDI;
  216.     procedure WinMDIProc(var aMsg: TMessage);
  217.     procedure DefaultMDI(Var Msg: TMessage);
  218.     procedure DeleteSkinDeleted;
  219.     procedure InitToolbarMenu(Item: TMenuItem;enable:boolean);
  220.     procedure DrawIcon(dc:HDC;rc:Trect);
  221.     procedure AfterSkin;
  222.     procedure DoSkinEdit(aEdit: Twincontrol);
  223.     procedure GetBorderSize;
  224.     procedure UpdateStyle(b:boolean);
  225.     procedure DisableControl(Comp: TControl);
  226.     function  CheckSysmenu:boolean;
  227.     procedure MenuSelect(var Msg:TMessage);
  228.     procedure BeginUpdate;
  229.     procedure StopUpdate;
  230.     procedure InitSkin(afsd:Tskindata);
  231.     function GetSysBtnHint(i:integer):string;
  232.   protected
  233.     caption : widestring;
  234.     bw,wTr,ctr,oldsize : TRect;
  235.     MenuHeight,BtnCount : integer;
  236.     fInMenu,Creating,bidileft :boolean;
  237.     fSizeable,fMaxable,fminable:boolean;
  238.     isunicode,ismessagebox:boolean;
  239.     ischildform:boolean;
  240. //    FTempMenu :Tpopupmenu;
  241. //    FButtonMenu : Tmenuitem;
  242.     backstr:string;
  243.     sysmenu:TPopupmenu;
  244.     ClientHwnd,NewChildHwnd : Thandle;
  245.     hmenu,hsysmenu,tempmenu,activemenu:hmenu;
  246.     formcolor:Tcolor;
  247.     dwstyle:dword;
  248.     RightBtn:integer;
  249.     procedure Notification(AComponent: TComponent;
  250.       Operation: TOperation); override;
  251.     procedure DrawSysbtn(btn:TWinsysButton;i:integer);
  252.     procedure ResizeForm(i:integer);
  253.     function FindSkinComp(acomp:Tcontrol):boolean;
  254.     function FindSkinComp2(ctrl:Twincontrol):boolean;
  255.     procedure InitControlA(wForm: TWinControl);
  256.     procedure InitChildCtrl(wForm: TWinControl);
  257.     function Find3rdControl(aname:string;comp:Twincontrol):boolean;
  258.     procedure HintReset();
  259.   public
  260.     ActiveBtn : TNCObject;
  261.     crop: boolean;
  262.     WinRgn : THandle;
  263.     FForm: TForm;
  264.     Hwnd : Thandle;
  265.     fCanvas,fcanvas2: TCanvas;
  266.     fsd : TSkinData;
  267.     menu :TWinSkinMenu;
  268.     SysBtn : array of TWinSysButton;
  269.     IconBmp:Tbitmap;
  270.     CaptionBuf:Tbitmap;
  271.     Controllist:Tlist;
  272.     fwidth,fheight:integer;
  273.     crwidth,crheight:integer;
  274.     FWindowActive : boolean;
  275.     FormStyle: TSkinFormStyle;
  276.     FormBorder: TSkinFormBorder ;
  277.     FormIcons:  TSkinFormIcons;
  278.     Windowstate: TSkinWindowState;
  279.     Skinstate:integer;
  280.     Activeskincontrol:Tskincontrol;
  281.     mode:integer;
  282.     formclass:string;
  283.     constructor Create(AOwner: TComponent); override;
  284.     destructor Destroy; override;
  285.     procedure Refresh;
  286.     procedure Minimize;
  287.     procedure Maximize;
  288.     procedure Restore;
  289.     procedure RestoreMDI;
  290. //    property Form: TForm read FForm write fform;
  291.     procedure UnSubclass;
  292.     procedure UnSubclass2;
  293.     procedure UnSubclass3;
  294.     function CheckMenu(Button: TMenuBtn): Boolean;
  295.     function MDIChildMax:boolean;
  296.     procedure ClickButton(Button: TMenuBtn);
  297.     procedure getClipMap(fbmp:Tbitmap);
  298.     procedure doLog(msg:string);
  299.     procedure InitPopMenu(wForm: TWinControl; Enable, Update: boolean );
  300.     procedure InitMainMenu(wForm: TWinControl; Enable, Update: boolean );
  301.     property Active: boolean read FActive write setactive;
  302.     procedure SkinChange;
  303.     procedure AddSysMenuitem(acaption:string;action:integer);
  304.     procedure EnableSysbtn(b:boolean);
  305.     procedure Uncropwindow;
  306.     procedure Cropwindow;
  307.     procedure InitTform(afsd:Tskindata;aform:Tform);
  308.     procedure InitControls(wForm: TWinControl);
  309.     procedure AddComp(Comp: TControl;wForm: TWinControl);
  310.     procedure InitNestform(wForm: Twincontrol);
  311.     procedure RePaint(ahwnd:Thandle);
  312.     procedure InitSkinData;
  313.     procedure UpdateMainMenu;
  314.     procedure DeleteSysbtn;
  315.     function AddControlList(acontrol:TSkinControl):boolean;
  316.     procedure AddControlh(ahwnd :HWND);
  317.     procedure InitHwndControls(ahwnd:Thandle);
  318.     procedure DeleteControl(c:TSkinControl);
  319.     procedure DrawMenuItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect;
  320.       Selected: Boolean);
  321.     procedure MeasureItem(Sender: TObject; ACanvas: TCanvas;
  322.               var Width, Height: Integer);
  323.     procedure InitDlg(afsd:Tskindata);
  324.   published
  325.   end;
  326.   TWinSkinSpy = class(TComponent)
  327.   protected
  328.     procedure Notification(AComponent: TComponent;
  329.       Operation: TOperation); override;
  330.   public
  331.     sf:TWinskinform;
  332.     destructor Destroy; override;
  333.   end;
  334. procedure Bitmapdraw(DC:HDC;Dst:Trect;Bmp:TBitmap);
  335. procedure DrawBGbmp(acanvas:Tcanvas;Dst:Trect;Bitmap:TBitmap;SrcRect: TRect);
  336. function BitmapToRegion(bmp: TBitmap; xx,yy:integer;TransparentColor: TColor=clFuchsia;
  337.     RedTol: Byte=1; GreenTol: Byte=1; BlueTol: Byte=1): HRGN;
  338. procedure DrawRect1(DC:HDC;Dst:Trect;Bmp:TBitmap;I,N:integer;Trans:integer=0);
  339. procedure DrawRect2(DC:HDC;Dst:Trect;Bmp:TBitmap;Src: TRect;I,N:integer;
  340.         Trans:integer=0;Tile:integer=0;Spliter:integer=0);
  341. procedure DrawRect3(DC:HDC;Dst:Trect;Bmp:TBitmap;I,N:integer;Trans:integer=0);
  342. //procedure DrawRectTile(DC:HDC;Dst:Trect;Bmp:TBitmap;Src: TRect;I,N:integer;
  343. //        Trans:integer=0;Spliter:integer=1);
  344. procedure DrawRectTile(acanvas:Tcanvas;Dst:Trect;Bmp:TBitmap;Src: TRect;I,N:integer;
  345.         Trans:integer=0;Spliter:integer=1);
  346. //procedure DrawTranmap(DC:HDC;Dst:Trect;temp:TBitmap);
  347. procedure DrawTranmap(DC:HDC;Dst:Trect;temp:TBitmap;transcolor:Tcolor=clFuchsia);
  348. {function TransparentStretchBlt(DstDC: HDC; DstX, DstY, DstW, DstH: Integer;
  349.   SrcDC: HDC; SrcX, SrcY, SrcW, SrcH: Integer; MaskDC: HDC; MaskX,
  350.   MaskY: Integer): Boolean;}
  351. function GetHMap(Dst:Trect;Bmp:TBitmap;Src:TRect;I,N:integer;
  352.          Tile:integer=0;Spliter:integer=0):Tbitmap;
  353. function GetThumbMap(Dst:Trect;Bmp:TBitmap;Src:TRect;I,N:integer;
  354.          Tile:integer=0;Spliter:integer=0):Tbitmap;
  355. procedure DrawBorder(Dc:HDC;Dst:Trect;Bmp:TBitmap;Src:TRect;I,N:integer;
  356.          Tile:integer=0;Spliter:integer=0);
  357. procedure DrawRectH(DC:HDC;Dst:Trect;Bmp:TBitmap;Src:TRect;I,N:integer;
  358.          Tile:integer=0;Spliter:integer=0);
  359. procedure DrawRectV(DC:HDC;Dst:Trect;Bmp:TBitmap;Src:TRect;I,N:integer;
  360.          Tile:integer=0;Spliter:integer=0);
  361. function Max(const A, B: Integer): Integer;
  362. function Min(const A, B: Integer): Integer;
  363. function MsgtoStr(aMsg: TMessage):string;
  364. procedure SkinAddLog(msg:string);
  365. function GetWindowClassname(ahwnd:Thandle):string;
  366. function CopyHMenu(amenu:Hmenu):Hmenu;
  367. procedure DeleteHMenu(amenu:Hmenu);
  368. function EnumControl(ahwnd :HWND;lParam: LPARAM):boolean;stdcall;
  369. procedure DrawParentImage( Control: TControl; DC: HDC; InvalidateParent: Boolean = False );
  370. function GetFormCaptionA(ahwnd:Thandle):string;
  371. function GetFormCaption(ahwnd:Thandle):widestring;
  372. function GetFormText(ahwnd:Thandle):string;
  373. //function SBCustomDraw(sb:Tskinscrollbar;PDraw:pNMCSBCUSTOMDRAW):integer;
  374. //procedure  SetProperty(control: TObject;aprop,value:string);
  375. var WinVersion : Cardinal;
  376.     BG : TBitmap;
  377.     Logstring :Tstringlist;
  378.     SkinCanLog:boolean;
  379. implementation
  380. //uses winsubclass;
  381. uses WinSkinDlg,winskinmenu;
  382. {$R vclskin.res}
  383. procedure TNCObject.MouseDown;
  384. begin
  385.    if (sf.activebtn<>nil) and (sf.activebtn<>self) then
  386.    sf.activebtn.mouseleave;
  387.    if visible then begin
  388.      sf.activebtn:=self;
  389.      state:=2;
  390.      draw;
  391.    end;
  392. end;
  393. procedure TNCObject.MouseUp;
  394. begin
  395.    if visible then begin
  396.      state:=3;
  397.      draw;
  398.    end;
  399. end;
  400. procedure TNCObject.MouseEnter;
  401. var b:boolean;
  402. begin
  403. //   if not sf.timer.enabled then sf.timer.enabled:=true;
  404.    b:=false;
  405.    if (sf.activebtn<>nil) then begin
  406.      if (sf.activebtn<>self) then begin
  407.         sf.activebtn.mouseleave;
  408.         b:=true;
  409.      end;
  410.    end else b:=true;
  411.    if b and visible then begin
  412.       sf.activebtn:=self;
  413.       state:=3;
  414.       draw;
  415.    end;
  416. end;
  417. procedure TNCObject.MouseLeave;
  418. begin
  419.    if visible then begin
  420.       sf.activebtn:=nil;
  421.       state:=1;
  422.       draw;
  423.       sf.HintReset();
  424.    end;
  425. end;
  426. procedure TNCObject.Draw;
  427. begin
  428. end;
  429. procedure TWinSysButton.Draw;
  430. begin
  431.     sf.drawsysbtn(self,state);
  432. end;
  433. procedure TWinSkinMenu.UpdataBtn1;
  434. var i,n:integer;
  435.     mi:TMenuItemInfo;
  436.     Buffer: array[0..79] of Char;
  437.     item:Tmenuitem;
  438.     newmenu:Thandle;
  439. begin
  440.   newmenu := getmenu(sf.hwnd);
  441.   if newmenu<>0 then hmenu := newmenu;
  442.   if hmenu = 0 then exit;
  443.   if sf.FForm<>nil then begin
  444.      if sf.FForm.Menu=nil then exit;
  445.      menu:=sf.FForm.Menu;
  446.   end;
  447.   for i:= 0 to high(Buttons) do Buttons[i].free;
  448.   setlength(buttons,menu.Items.Count);
  449.   count:=menu.Items.count;
  450.   for i:= 0 to menu.Items.Count-1 do begin
  451.        item := menu.Items[i];
  452.        buttons[i]:=TMenuBtn.create;
  453.        buttons[i].fsd:=fsd;
  454.        buttons[i].sf:=sf;
  455.        buttons[i].index:= i;
  456.        buttons[i].visible:= item.visible;
  457.        buttons[i].enabled:= item.Enabled;
  458.        buttons[i].mid:= item.Command;
  459. //       buttons[i].caption:= item.Caption;
  460.        buttons[i].caption:=GetStringProp(item,'Caption');
  461.        buttons[i].menuitem:= item;
  462.        if item.count>0 then
  463.               buttons[i].hsubmenu:=item.Handle
  464.        else
  465.               buttons[i].hsubmenu:=0;
  466.        inc(n);
  467.   end;
  468.   SetMenu(sf.hwnd, 0);
  469. end;
  470. procedure TWinSkinMenu.UpdataBtn;
  471. var i,n,j:integer;
  472.     mi:TMenuItemInfo;
  473.     Buffer: array[0..79] of Char;
  474.     item:Tmenuitem;
  475.     newmenu:Thandle;
  476.     b:boolean;
  477. begin
  478.   b:=  (Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion <5);
  479. //  b:= b or (winversion >= $80000000);
  480.   b:=b or ((Win32MajorVersion=4) and (Win32MinorVersion=0));
  481.   if b then begin
  482.      updatabtn1;
  483.      exit;
  484.   end;
  485.   newmenu := getmenu(sf.hwnd);
  486.   if newmenu<>0 then hmenu := newmenu;
  487.   if hmenu = 0 then exit;
  488.   if sf.FForm<>nil then begin
  489.      if sf.FForm.Menu=nil then exit;
  490.      menu:=sf.FForm.Menu;
  491.   end;
  492. //  fsd.DoDebug('UpdataBtn');
  493.   for i:= 0 to high(Buttons) do Buttons[i].free;
  494.   count:= GetMenuItemCount(hmenu);
  495.   if count<=0 then exit;
  496.   setlength(buttons,count);
  497.   for i:= 0 to count-1 do begin
  498.        mi.cbSize:= sizeof(TMENUITEMINFO);
  499.        mi.fMask := MIIM_ID or MIIM_TYPE or MIIM_STATE or MIIM_SUBMENU;
  500.        fillchar(buffer,sizeof(buffer),#0);
  501.        mi.dwTypeData := Buffer;
  502.        Mi.cch := SizeOf(Buffer);
  503.        GetMenuItemInfo(hmenu, i, TRUE, mi);
  504.        buttons[i]:=TMenuBtn.create;
  505.        buttons[i].fsd:=fsd;
  506.        buttons[i].sf:=sf;
  507.        buttons[i].index:= i;
  508.        buttons[i].hsubmenu:=mi.hSubMenu;
  509.        buttons[i].enabled:= (mi.fState and MFS_DISABLED)=0;
  510.        buttons[i].visible:= true;
  511.        buttons[i].mid:=mi.wid;
  512.        buttons[i].caption:= buffer;
  513.        inc(n);
  514.        //fsd.DoDebug(inttostr(mi.wid));
  515.        //if (buttons[i].caption='') then begin
  516.              Item := menu.FindItem(mi.wID,fkCommand);
  517.              if item<>nil then begin
  518.                 if Assigned(item.Action) then item.Action.Update;
  519.                 buttons[i].caption:=GetStringProp(item,'Caption');
  520.                 buttons[i].enabled:= item.Enabled;
  521.                 buttons[i].menuitem:=item;
  522.                 if item.count>0 then
  523.                   buttons[i].hsubmenu:=item.Handle
  524.                 else
  525.                   buttons[i].hsubmenu:=0;
  526.              end;
  527.        //end;
  528.   end;
  529.   SetMenu(sf.hwnd, 0);
  530. end;
  531. {procedure TWinSkinMenu.UpdataBtn1;
  532. var i,n:integer;
  533.     mi:TMenuItemInfo;
  534.     Buffer: array[0..79] of Char;
  535.     item:Tmenuitem;
  536.     newmenu:Thandle;
  537. begin
  538.   newmenu := getmenu(sf.hwnd);
  539.   if newmenu<>0 then hmenu := newmenu;
  540.   if hmenu = 0 then exit;
  541.   for i:= 0 to high(Buttons) do Buttons[i].free;
  542.   count:= GetMenuItemCount(hmenu);
  543.   if count<=0 then exit;
  544.   setlength(buttons,count);
  545.   for i:= 0 to count-1 do begin
  546.        mi.cbSize:= sizeof(TMENUITEMINFO);
  547.        mi.fMask := MIIM_ID or MIIM_TYPE or MIIM_STATE or MIIM_SUBMENU;
  548.        fillchar(buffer,sizeof(buffer),#0);
  549.        mi.dwTypeData := Buffer;
  550.        Mi.cch := SizeOf(Buffer);
  551.        GetMenuItemInfo(hmenu, i, TRUE, mi);
  552.        buttons[i]:=TMenuBtn.create;
  553.        buttons[i].fsd:=fsd;
  554.        buttons[i].sf:=sf;
  555.        buttons[i].index:= i;
  556.        buttons[i].hsubmenu:=mi.hSubMenu;
  557.        buttons[i].enabled:= (mi.fState and MFS_DISABLED)=0;
  558.        buttons[i].visible:= true;
  559.        buttons[i].mid:=mi.wid;
  560.        buttons[i].caption:= buffer;
  561.        inc(n);
  562.        if (buttons[i].caption='') and (menu<>nil)
  563.            and (i<menu.items.Count) then begin
  564.           Item := menu.items[i];
  565.           if item<>nil then begin
  566.             if Assigned(item.Action) then item.Action.Update;
  567.             buttons[i].caption:= item.caption;
  568.             buttons[i].enabled:= item.Enabled;
  569.             buttons[i].mid:=GetMenuItemID(hmenu,i);
  570.             if item.count>0 then
  571.               buttons[i].hsubmenu:=item.Handle
  572.             else
  573.               buttons[i].hsubmenu:=0;
  574.           end;
  575.        end;
  576.   end;
  577.   SetMenu(sf.hwnd, 0);
  578. end;}
  579. procedure TWinSkinMenu.UpdataBtn3;
  580. var i,n:integer;
  581.     item:Tmenuitem;
  582.     newmenu:Thandle;
  583. begin
  584.   newmenu := getmenu(sf.hwnd);
  585.   if newmenu<>0 then hmenu := newmenu;
  586.   for i:= 0 to high(Buttons) do Buttons[i].free;
  587.   count:= menu.items.Count;
  588.   if count<=0 then exit;
  589.   setlength(buttons,count);
  590.   for i:= 0 to count-1 do begin
  591.        buttons[i]:=TMenuBtn.create;
  592.        inc(n);
  593.        Item := menu.items[i];
  594.        if Assigned(item.Action) then item.Action.Update;
  595.        buttons[i].caption:= item.caption;
  596.        buttons[i].enabled:= item.Enabled;
  597.        buttons[i].visible:= item.visible;
  598.        buttons[i].mid:=item.Command;
  599.        buttons[i].fsd:=fsd;
  600.        buttons[i].sf:=sf;
  601.        buttons[i].index:= i;
  602.        if item.count>0 then
  603.              buttons[i].hsubmenu:=item.Handle
  604.        else
  605.              buttons[i].hsubmenu:=0;
  606.   end;
  607.   SetMenu(sf.hwnd, 0);
  608.   sf.activebtn:=nil;
  609. end;
  610. procedure TWinSkinMenu.UpdataBtn2(newmenu:Thandle);
  611. var i,n,j:integer;
  612.     mi:TMenuItemInfo;
  613.     Buffer: array[0..79] of Char;
  614.     item:Tmenuitem;
  615. begin
  616.   newmenu := getmenu(sf.hwnd);
  617.   if newmenu<>0 then hmenu := newmenu;
  618.   if hmenu = 0 then exit;
  619.   if sf.FForm<>nil then begin
  620.      if sf.FForm.Menu=nil then exit;
  621.      menu:=sf.FForm.Menu;
  622.   end;
  623. //  fsd.DoDebug('UpdataBtn2');
  624.   for i:= 0 to high(Buttons) do Buttons[i].free;
  625.   count:= GetMenuItemCount(hmenu);
  626.   if count<=0 then exit;
  627.   setlength(buttons,count);
  628.   for i:= 0 to count-1 do begin
  629.        mi.cbSize:= sizeof(TMENUITEMINFO);
  630.        mi.fMask := MIIM_ID or MIIM_TYPE or MIIM_STATE or MIIM_SUBMENU;
  631.        fillchar(buffer,sizeof(buffer),#0);
  632.        mi.dwTypeData := Buffer;
  633.        Mi.cch := SizeOf(Buffer);
  634.        GetMenuItemInfo(hmenu, i, TRUE, mi);
  635.        buttons[i]:=TMenuBtn.create;
  636.        buttons[i].fsd:=fsd;
  637.        buttons[i].sf:=sf;
  638.        buttons[i].index:= i;
  639.        buttons[i].hsubmenu:=mi.hSubMenu;
  640.        buttons[i].enabled:= (mi.fState and MFS_DISABLED)=0;
  641.        buttons[i].visible:= true;
  642.        buttons[i].mid:=mi.wid;
  643.        buttons[i].caption:= buffer;
  644.        inc(n);
  645.        if (buttons[i].caption='') then begin
  646.              Item := menu.FindItem(mi.wID,fkCommand);
  647.              if item<>nil then begin
  648.                 if Assigned(item.Action) then item.Action.Update;
  649.                 buttons[i].caption:= item.caption;
  650.                 buttons[i].enabled:= item.Enabled;
  651.                 buttons[i].mid:=item.Command;
  652.                 if item.count>0 then
  653.                   buttons[i].hsubmenu:=item.Handle
  654.                 else
  655.                   buttons[i].hsubmenu:=0;
  656.              end;
  657.        end;
  658.   end;
  659.   SetMenu(sf.hwnd, 0);
  660.   SetMenuRect();
  661. end;
  662. {procedure TWinSkinMenu.UpdataBtn;
  663. var i:integer;
  664.     mi:TMenuItemInfo;
  665.     Buffer: array[0..79] of Char;
  666. begin
  667.   hmenu:= getmenu(sf.hwnd);
  668.   for i:= 0 to high(Buttons) do Buttons[i].free;
  669.   count:= GetMenuItemCount(hmenu);
  670.   if count=0 then exit;
  671.   setlength(buttons,count);
  672.   for i:= 0 to count-1 do begin
  673.        buttons[i]:=TMenuBtn.create;
  674.        buttons[i].fsd:=fsd;
  675.        buttons[i].sf:=sf;
  676.        buttons[i].index:= i;
  677.        GetMenuString(hmenu,i,buffer,sizeof(buffer),MF_BYPOSITION);
  678.        buttons[i].caption:= buffer;
  679.        mi.cbSize:= sizeof(TMENUITEMINFO);
  680. //       mi.fMask := MIIM_TYPE;
  681.        mi.fMask := MIIM_TYPE or MIIM_STATE or MIIM_SUBMENU;
  682.        mi.fType := MFT_STRING;
  683.        fillchar(buffer,sizeof(buffer),#0);
  684.        mi.dwTypeData := Buffer;
  685.        Mi.cch := SizeOf(Buffer);
  686.        GetMenuItemInfo(hmenu, i, TRUE, mi);
  687. //       if mi.ftype=MFT_STRING then begin
  688.           buttons[i].caption:= buffer;
  689.           buttons[i].hsubmenu:=mi.hSubMenu;
  690.           buttons[i].enabled:= (mi.fState and MFS_DISABLED)=0;
  691.           buttons[i].visible:= true;
  692. //       end;
  693.   end;
  694.   SetMenu(sf.hwnd, 0);
  695. end;}
  696. procedure TWinSkinMenu.Copymenu(source,dst:Hmenu);
  697. var i,n,aid:integer;
  698. begin
  699.   n:= GetMenuItemCount(source);
  700.   for i:=0 to n-1 do begin
  701.      aid:=GetMenuItemID(source, i);
  702.   end;
  703. end;
  704. constructor TWinSkinMenu.Create(AOwner: TComponent);
  705. begin
  706.    inherited create(AOwner);
  707.    bkmap:=Tbitmap.create;
  708. end;
  709. destructor TWinSkinMenu.Destroy;
  710. var i:integer;
  711. begin
  712.   bkmap.free;
  713.   for i:= 0 to length(Buttons)-1 do Buttons[i].free;
  714.   setlength(Buttons,0);
  715.   inherited destroy;
  716. end;
  717. type
  718.   TMenuItemAccess = class(TMenuItem);
  719.   TACControl = class(TControl);
  720.   TACWinControl = class(TWinControl);
  721.   TACGrid = class(TCustomGrid);
  722.   TACBitmap = class(TBitmap);
  723. procedure TWinSkinMenu.DrawMenu(dc:HDC;rc:TRect);
  724. var i,w,h,x: integer;
  725.     r,r1:Trect;
  726.     item:Tmenuitem;
  727.     btn:Tmenubtn;
  728.     rightmargin:integer;
  729. begin
  730. //   fsd.DoDebug('DrawMenu');
  731.    r1:=rc;
  732.    offsetrect(rc,-rc.left,-rc.top);
  733.    bg.width:=rc.right;
  734.    bg.height:=rc.bottom;
  735.    if fsd.menubar=nil then begin
  736.       bg.canvas.brush.color:=fsd.colors[csMenuBar];
  737.       bg.canvas.fillrect(rc);
  738.       x:=6;
  739.    end else begin
  740.       if sf.FWindowActive then i:=1
  741.       else i:=2;
  742. //      DrawRect2(acanvas.handle,rc,fsd.menubar.map,fsd.menubar.r,1,2,0,0,1);
  743.       if fsd.menubar.tile=1 then
  744.         DrawRect2(bg.canvas.handle,rc,fsd.menubar.map,fsd.menubar.r,i,2,0,0,1)
  745.       else
  746.         DrawRectTile(bg.canvas,rc,fsd.menubar.map,fsd.menubar.r,i,2);
  747.       if Menu.IsRightToLeft then
  748.          x:=8+fsd.menubar.r.right
  749.       else
  750.          x:=4+fsd.menubar.r.left;
  751.       if x>rc.right then  x:=12;
  752.    end;
  753.    //save bar map;
  754.    bar:=r1;
  755.    bkmap.assign(bg);
  756.    bg.canvas.Font := Screen.MenuFont;
  757.    bg.canvas.Font.color:= fsd.colors[csMenuBarText];
  758.    bg.canvas.brush.style:= bsclear;
  759.    SetBkMode(bg.Canvas.Handle, TRANSPARENT);
  760.    topmenu:=true;
  761.    if Menu.IsRightToLeft then begin
  762.    //bidi righttoleft
  763.    x:= rc.Right-x;
  764.    if (sf.FormStyle=sfsMDIForm) and sf.MDIChildMax then begin
  765.         for i:= 0 to high(sf.sysbtn) do
  766.           if (sf.sysbtn[i].data.Visibility=100) and
  767.              (not sf.sysbtn[i].data.map.empty) then begin
  768.                r:= sf.sysbtn[i].bounds;
  769.                if x>(r.Left-5) then x:=(r.Left-5);
  770.           end;
  771.    end;
  772.    for i:= 0 to high(buttons) do begin
  773.      btn:=buttons[i];
  774.      if not btn.visible then begin
  775.         btn.bounds:=rect(0,0,0,0);
  776.         continue;
  777.      end;
  778.      r := r1;
  779.      Tnt_DrawTextW(bg.Canvas.Handle, btn.caption,r,DT_Left or DT_CALCRECT or DT_NOCLIP);
  780.      w:= r.Right-r.left;
  781. //     w:= bg.canvas.TextWidth(btn.caption);
  782.      if w>0 then w:=w+10;
  783.      r:= rect(x-w,0,x,rc.bottom-1);
  784.     if btn.enabled then
  785.        bg.canvas.Font.color:= fsd.colors[csMenuBarText]
  786.     else
  787.        bg.canvas.Font.color:= fsd.colors[csbuttonshadow];
  788.      MyDrawCaption(bg.canvas,r,btn.caption,btn.enabled,false);
  789.      r:= rect(r1.left+x-w,r1.top,r1.left+x,r1.bottom-1);
  790.      btn.bounds:=r;
  791.      x:=x-w;
  792.    end;
  793.    end else begin
  794.    //bidi lefttoright
  795.    for i:= 0 to high(buttons) do begin
  796.      btn:=buttons[i];
  797.      if not btn.visible then begin
  798.         btn.bounds:=rect(0,0,0,0);
  799.         continue;
  800.      end;
  801.      r := r1;
  802.      Tnt_DrawTextW(bg.Canvas.Handle, btn.caption,r,DT_Left or DT_CALCRECT or DT_NOCLIP);
  803.      w:= r.Right-r.left;
  804.      //w:= bg.canvas.TextWidth(btn.caption);
  805.      if w>0 then w:=w+10;
  806.      r:= rect(x,0,x+w,rc.bottom-1);
  807.     if btn.enabled then
  808.        bg.canvas.Font.color:= fsd.colors[csMenuBarText]
  809.     else
  810.        bg.canvas.Font.color:= fsd.colors[csbuttonshadow];
  811. {     if (item.imageindex<>-1) and (menu.images<>nil) then
  812.        MyDrawImgCaption(bg.canvas,r,menu.images,item.imageindex,
  813.                        item.caption,item.enabled,false)
  814.      else}
  815.      MyDrawCaption(bg.canvas,r,btn.caption,btn.enabled,false);
  816.      r:= rect(r1.left+x,r1.top,r1.left+x+w,r1.bottom-1);
  817.      btn.bounds:=r;
  818.      x:=x+w;
  819.    end;
  820.    end;
  821.    topmenu:=false;
  822.    if (sf.FormStyle=sfsMDIForm) and sf.MDIChildMax then begin
  823.         for i:= 0 to high(sf.sysbtn) do
  824.           if (sf.sysbtn[i].data.Visibility=100) and
  825.              (not sf.sysbtn[i].data.map.empty) then begin
  826.                r:= sf.sysbtn[i].bounds;
  827.                offsetrect(r,-sf.bw.left,-sf.bw.top);
  828.                DrawRect1(bg.canvas.handle,r,
  829.                sf.sysbtn[i].data.map,1,sf.sysbtn[i].data.frame,1);
  830.           end;
  831.         if not skinmanager.mdimax then skinmanager.setmdimax(true);
  832.    end;
  833.    BitBlt(dc,r1.left,r1.top,rc.right,rc.bottom,
  834.                  bg.Canvas.Handle ,0 ,0 ,SrcCopy);
  835. end;
  836. procedure TWinSkinMenu.SetMenuRect;
  837. var i,w,h,x: integer;
  838.     r,r1:Trect;
  839.     item:Tmenuitem;
  840.     btn:Tmenubtn;
  841.     rc:Trect;
  842. begin
  843.   rc:=rect(sf.bw.left,sf.bw.top,
  844.            sf.fwidth-sf.bw.right,sf.bw.top+sf.menuheight) ;
  845.    r1:=rc;
  846.    offsetrect(rc,-rc.left,-rc.top);
  847.    if (rc.Right<=0) or (rc.Bottom<=0) then exit; 
  848.    bg.width:=rc.right;
  849.    bg.height:=rc.bottom;
  850.    if fsd.menubar=nil then begin
  851.       x:=6;
  852.    end else begin
  853.       if Menu.IsRightToLeft then
  854.          x:=8+fsd.menubar.r.right
  855.       else
  856.          x:=4+fsd.menubar.r.left;
  857.       if x>rc.right then  x:=12;
  858.    end;
  859.    bg.canvas.Font := Screen.MenuFont;
  860.    if Menu.IsRightToLeft then begin
  861.    //bidi righttoleft
  862.    x:= rc.Right-x;
  863.    for i:= 0 to high(buttons) do begin
  864.      btn:=buttons[i];
  865.      if not btn.visible then begin
  866.         btn.bounds:=rect(0,0,0,0);
  867.         continue;
  868.      end;
  869.      r := r1;
  870.      Tnt_DrawTextW(bg.Canvas.Handle, btn.caption,r,DT_Left or DT_CALCRECT or DT_NOCLIP);
  871.      w:= r.Right-r.Left;
  872.      if w>0 then w:=w+10;
  873.      r:= rect(r1.left+x-w,r1.top,r1.left+x,r1.bottom-1);
  874.      btn.bounds:=r;
  875.      x:=x-w;
  876.    end;
  877.    end else begin
  878.    //bidi lefttoright
  879.    for i:= 0 to high(buttons) do begin
  880.      btn:=buttons[i];
  881.      if not btn.visible then begin
  882.         btn.bounds:=rect(0,0,0,0);
  883.         continue;
  884.      end;
  885.      r := r1;
  886.      Tnt_DrawTextW(bg.Canvas.Handle, btn.caption,r,DT_Left or DT_CALCRECT or DT_NOCLIP);
  887.      w:= r.Right-r.Left;
  888.      //w:= bg.canvas.TextWidth(btn.caption);
  889.      if w>0 then w:=w+10;
  890.      r:= rect(r1.left+x,r1.top,r1.left+x+w,r1.bottom-1);
  891.      btn.bounds:=r;
  892.      x:=x+w;
  893.    end;
  894.    end;
  895. end;
  896. procedure TMenuBtn.Draw;
  897. var DC: HDC;
  898.     r,r2:Trect;
  899. begin
  900.     DC := GetWindowDC(sf.hwnd);
  901.     sf.fcanvas.handle:=DC;
  902. //    menuitem.OnDrawItem:=nil;
  903.     r:=rect(bounds.left,sf.menu.bar.top,bounds.right,sf.menu.bar.bottom);
  904.     r2:=r;
  905.     offsetrect(r2,-sf.menu.bar.left,-sf.menu.bar.top);
  906.     sf.fcanvas.copyrect(r,sf.menu.bkmap.canvas,r2);
  907.     if (state=3) or (state=2) then begin
  908.        sf.fcanvas.brush.color:=fsd.colors[csButtonHilight];
  909.        sf.fcanvas.FrameRect(bounds);
  910.     end;
  911.     sf.fcanvas.Font := Screen.MenuFont;
  912.     sf.fcanvas.Font.style := [];
  913.     if enabled then
  914.        sf.fcanvas.Font.color:= fsd.colors[csMenuBarText]
  915.     else
  916.        sf.fcanvas.Font.color:= fsd.colors[csbuttonshadow];
  917. //    sf.fcanvas.brush.style:= bsclear;
  918. //    SetBkMode(sf.fCanvas.Handle, TRANSPARENT);
  919.     r:=bounds;
  920. {    if (menuitem.imageindex<>-1) and (sf.menu.menu.images<>nil) then
  921.        MyDrawImgCaption(sf.fcanvas,r,sf.menu.menu.images,menuitem.imageindex,
  922.                        menuitem.caption,menuitem.enabled,false)
  923.     else }
  924.        MyDrawCaption(sf.fcanvas,r,caption,enabled,false);
  925.     sf.fCanvas.Handle:=0;
  926.     ReleaseDC(sf.hwnd, DC);
  927. end;
  928. function TWinSkinMenu.FindBtn(p:Tpoint):TNcobject;
  929. var i:integer;
  930. begin
  931.    result:=nil;
  932.    for i:=0 to high(Buttons) do begin
  933.      if PtInRect(buttons[i].bounds, p) and (buttons[i].caption<>'') then begin
  934.         Result := buttons[i];
  935.         break;
  936.      end;
  937.    end;
  938. end;
  939. procedure TWinSkinMenu.MouseMove(p:Tpoint);
  940. var i: integer;
  941. begin
  942. {  i := findbtn(p);
  943.   if i<>-1 then begin
  944.        buttons[i].mouseenter;
  945.        sf.done:=true;
  946.   end else
  947.      if sf.activebtn<>nil then begin
  948.        sf.activebtn.mouseleave;
  949.      end;}
  950. end;
  951. //menu hook
  952.  var
  953.   MenuHook: HHOOK;
  954.   InitDone: Boolean = False;
  955.   MenuBar : TWinSkinMenu;
  956.   Skinform : TWinSkinForm;
  957.   MenuButtonIndex: Integer;
  958.   LastMenuItem: TMenuItem;
  959.   LastMenuItemID: integer;
  960.   LastMousePos: TPoint;
  961.   StillModal: Boolean;
  962.   lastselect:boolean = false;
  963. function ToolMenuGetMsgHook(Code: Integer; WParam: Longint; var Msg: TMsg): Longint; stdcall;
  964. const
  965.   RightArrowKey: array[Boolean] of Word = (VK_LEFT, VK_RIGHT);
  966.   LeftArrowKey: array[Boolean] of Word = (VK_RIGHT, VK_LEFT);
  967. var
  968.   P: TPoint;
  969.   Target: TMenuBtn;
  970.   Item: Integer;
  971.   FindKind: TFindItemKind;
  972.   ParentMenu: TMenu;
  973.   function FindButton(Forward: Boolean): TMenuBtn;
  974.   var
  975.     Bar: TWinSkinMenu;
  976.     I, J, Count: Integer;
  977.   begin
  978.     Bar := Skinform.menu; //MenuToolBar;
  979.     if Bar <> nil then begin
  980.       J := MenuButtonIndex;
  981.       I := J;
  982. //      Count := Bar.Count;
  983.       Count := high(Bar.buttons)+1;
  984.       if Forward then begin
  985.           if I = Count - 1 then
  986.             I := 0
  987.           else
  988.             Inc(I);
  989.           Result := Bar.Buttons[I];
  990.       end else begin
  991.           if I = 0 then
  992.             I := Count - 1
  993.           else
  994.             Dec(I);
  995.           Result := Bar.Buttons[I];
  996.       end;
  997.     end else Result := nil;
  998.   end;
  999. begin
  1000.   if LastMenuItem <> nil then  begin
  1001.     ParentMenu := LastMenuItem.GetParentMenu;
  1002.     if ParentMenu <> nil then  begin
  1003.       if ParentMenu.IsRightToLeft then
  1004.         if Msg.WParam = VK_LEFT then
  1005.           Msg.WParam := VK_RIGHT
  1006.         else if Msg.WParam = VK_RIGHT then
  1007.           Msg.WParam := VK_LEFT;
  1008.     end;
  1009.   end;
  1010.   Result := CallNextHookEx(MenuHook, Code, WParam, Longint(@Msg));
  1011.   if Result <> 0 then Exit;
  1012.   if (Code = MSGF_MENU) then begin
  1013.     Target := nil;
  1014.     if not InitDone then begin
  1015.       InitDone := True;
  1016.       PostMessage(Msg.Hwnd, WM_KEYDOWN, VK_DOWN, 0);
  1017.     end;
  1018.     case Msg.Message of
  1019.       WM_MENUSELECT:
  1020.         begin
  1021.           if (HiWord(Msg.WParam) = $FFFF) and (Msg.LParam = 0) then  begin
  1022.             if not StillModal then Skinform.CancelMenu;
  1023.             Exit;
  1024.           end else  StillModal := False;
  1025.           FindKind := fkCommand;
  1026.           if HiWord(Msg.WParam) and MF_POPUP <> 0 then FindKind := fkHandle;
  1027.           if FindKind = fkHandle then
  1028.               Item := GetSubMenu(Msg.LParam, LoWord(Msg.WParam))
  1029.           else
  1030.               Item := LoWord(Msg.WParam);
  1031.           if skinform.menu.menu<>nil then
  1032.             LastMenuItem := Skinform.menu.menu.FindItem(Item, FindKind);
  1033.         end;
  1034.       WM_SYSKEYDOWN:
  1035.         if Msg.WParam = VK_MENU then begin
  1036.           SkinForm.CancelMenu;
  1037.           Exit;
  1038.         end;
  1039.       WM_KEYDOWN:begin
  1040.         if Msg.WParam = VK_RETURN then
  1041. //          Skinform.FMenuResult := True
  1042.           StillModal := false
  1043.         else if Msg.WParam = VK_ESCAPE then
  1044.           StillModal := false
  1045.         else if (Msg.WParam = VK_RIGHT) then begin
  1046.           if (LastMenuItem = nil) or (LastMenuItem.Count = 0) then
  1047.                Target := FindButton(True);
  1048.         end else if (Msg.WParam = VK_LEFT) then begin
  1049.           if (LastMenuItem = nil) then
  1050.             Target := FindButton(False)
  1051.           else if ((LastMenuItem.Parent.handle=skinform.activemenu)
  1052.               or (LastMenuItem.handle=skinform.activemenu)) then
  1053.                  Target := FindButton(False);
  1054.         end else Target := nil;
  1055.         if Target <> nil then
  1056.             P := Point(Target.Bounds.left+1,Target.Bounds.top+1);
  1057.         end;
  1058.       WM_MOUSEMOVE:
  1059.         begin
  1060.           P := Msg.pt;
  1061.           if (P.X <> LastMousePos.X) or (P.Y <> LastMousePos.Y) then          begin
  1062.             p:= SkinForm.GetWinxy(p.x,p.y);
  1063.             Target := Tmenubtn(SKinForm.Menu.findbtn(P));
  1064.             LastMousePos := P;
  1065.           end;
  1066.         end;
  1067.     end;
  1068.     if (Target <> nil) and (Target is TMenuBtn) and
  1069.         (Target.Index <> MenuButtonIndex) then  begin
  1070.           StillModal := True;
  1071. //          SkinForm.FCaptureChangeCancels := False;
  1072. //          SkinForm.ClickButton(Target);
  1073.           SkinForm.ClickButton(Target);
  1074.           lastselect:=true;
  1075. //          skinform.fsd.DoDebug('do click true '+TMenuBtn(Target).caption)
  1076.     end;
  1077.     end;
  1078. end;
  1079. procedure InitMenuHooks;
  1080. begin
  1081.   StillModal := False;
  1082.   InitDone := False;
  1083.   GetCursorPos(LastMousePos);
  1084.   if MenuHook = 0 then
  1085.     MenuHook := SetWindowsHookEx(WH_MSGFILTER, @ToolMenuGetMsgHook, 0,
  1086.       GetCurrentThreadID);
  1087. end;
  1088. procedure ReleaseMenuHooks;
  1089. begin
  1090.   if MenuHook <> 0 then UnhookWindowsHookEx(MenuHook);
  1091.   MenuHook := 0;
  1092.   LastMenuItem := nil;
  1093.   MenuBar := nil;
  1094.   MenuButtonIndex := -1;
  1095.   InitDone := False;
  1096. end;
  1097. {procedure TWinSkinForm.ClearTempMenu;
  1098. var
  1099.   I: Integer;
  1100.   Item: TMenuItem;
  1101. begin
  1102.   if (FTempMenu <> nil) and (FButtonMenu<>nil) then begin
  1103.     for I := FTempMenu.Items.Count - 1 downto 0 do
  1104.     begin
  1105.       Item := FTempMenu.Items[I];
  1106.       FTempMenu.Items.Delete(I);
  1107.       if item.tag<>c_windowid then
  1108.          FButtonMenu.Insert(0, Item);
  1109.     end;
  1110.     FTempMenu.Free;
  1111.     FTempMenu := nil;
  1112.     FButtonMenu := nil;
  1113.   end;
  1114. end;}
  1115. procedure TWinSkinForm.ClickButton(Button: TMenuBtn);
  1116. var
  1117.   P: TPoint;
  1118. begin
  1119. //  FCaptureChangeCancels := False;
  1120.   GetWindowRect(hwnd, WTR);
  1121.   P := Point(Button.bounds.left+1+wtr.left,
  1122.              Button.bounds.top+1+wtr.top);
  1123. //  timer.enabled:=true;
  1124.   PostMessage(hwnd, WM_NCLBUTTONDOWN, MK_LBUTTON, Longint(PointToSmallPoint(P)));
  1125. //  PostMessage(hwnd, CN_MenuSelect, 0, Longint(PointToSmallPoint(P)));
  1126. end;
  1127. procedure TWinSkinForm.MenuSelect(var Msg:TMessage);
  1128. var P: TPoint;
  1129.     btn:TNCobject;
  1130.     b:boolean;
  1131. begin
  1132. //  if not fwindowactive then exit;
  1133.   P := GetWinXY(msg.LParamLo,msg.LParamhi);
  1134.   btn := findbtn(p);
  1135.   if (btn=nil) and (menu<>nil) then btn := menu.findbtn(p);
  1136.   b:=false;
  1137.   if (btn<>nil) and (btn is TMenuBtn) then begin
  1138.       CheckMenu(TMenuBtn(Btn));
  1139.   end;
  1140.   Msg.Result := 0;
  1141.   Msg.Msg := WM_NULL;
  1142. end;
  1143. function TWinSkinForm.FindButtonFromAccel(Accel: Word): TMenuBtn;
  1144. var
  1145.   I: Integer;
  1146. begin
  1147.   result:=nil;
  1148.   if menu=nil then exit;
  1149.   for I := 0 to high(menu.buttons) do begin
  1150.       Result :=Menu.Buttons[I];
  1151.       if Result.Enabled and Result.visible and
  1152.          IsAccel(Accel, Result.Caption) then
  1153.         Exit;
  1154.   end;
  1155.   Result := nil;
  1156. end;
  1157. procedure TWinSkinForm.CancelMenu;
  1158. begin
  1159.   if FInMenu then begin
  1160. //    ReleaseMenuKeyHooks;
  1161. //    MouseCapture := False;
  1162.   end;
  1163.   FInMenu := False;
  1164. //  FCaptureChangeCancels := False;
  1165. end;
  1166. procedure TWinSkinForm.SelectMDIform(Sender: TObject);
  1167. var s:string;
  1168.     j:integer;
  1169.     b:boolean;
  1170.     WS: TWindowState;
  1171. begin
  1172.     if not Assigned(Application.MainForm) then exit;
  1173.     s:= Tmenuitem(sender).caption;
  1174.     s:= StringReplace(s,'&','',[]);
  1175.     with Application.MainForm do
  1176.        if (FormStyle = fsMDIForm) and  (MDIChildCount>0) then begin
  1177.            for j:= 0 to MDIChildCount-1 do begin
  1178.               if MDIChildren[j].caption=s then begin
  1179.                 WS:=Application.MainForm.ActiveMDIChild.WindowState;
  1180. //                 b:=MDIChildren[j].windowstate=wsmaximized;
  1181. //                 MDIChildren[j].show;
  1182.                  SendMessage(ClientHandle,WM_MDIACTIVATE ,MDIChildren[j].handle,0);
  1183.                  MDIChildren[j].windowstate:=ws;
  1184.                  break;
  1185.               end;
  1186.            end;
  1187.        end;
  1188. end;
  1189. function CopyHMenu(amenu:Hmenu):Hmenu;
  1190. var hMenuOurs:Hmenu;
  1191.     nID: UINT;             // The ID of the menu.
  1192.     uMenuState :UINT ;        // The menu state.
  1193.     hSubMenu: HMENU ;        // A submenu.
  1194.     s:string;
  1195.     nmenu:integer;
  1196.     szBuf:array[0..127] of char;
  1197. begin
  1198.    hMenuOurs := CreatePopupMenu;
  1199.    nmenu :=0;
  1200.    uMenuState :=GetMenuState(aMenu,nMenu,MF_BYPOSITION);
  1201.    while uMenustate<>$FFFFFFFF do begin
  1202.        GetMenuString(aMenu,nMenu, szBuf,sizeof(szBuf),MF_BYPOSITION);
  1203.        if (LOBYTE(uMenuState) and MF_POPUP)>0 then begin
  1204.             hSubMenu := GetSubMenu(aMenu,nMenu);
  1205.             AppendMenu(hMenuOurs,uMenuState,hSubMenu,szBuf);
  1206.        end else begin
  1207.             nID := GetMenuItemID(aMenu,nMenu);
  1208.             AppendMenu(hMenuOurs,uMenuState,nID,szBuf);
  1209.        end;
  1210.        inc(nmenu);
  1211.        uMenuState :=GetMenuState(aMenu,nMenu,MF_BYPOSITION);
  1212.    end;
  1213.    result:=hmenuours;
  1214. end;
  1215. procedure DeleteHMenu(amenu:Hmenu);
  1216. var b:boolean;
  1217. begin
  1218.    b:=RemoveMenu(amenu,0,MF_BYPOSITION);
  1219.    while  b do
  1220.      b:=RemoveMenu(amenu,0,MF_BYPOSITION);
  1221.    DestroyMenu(amenu);
  1222. end;
  1223. procedure RethinkLines(aitem:Tmenuitem);
  1224. var
  1225.   I, LLastAt: Integer;
  1226.   LLastBar: TMenuItem;
  1227. begin
  1228. //    for i:= 0 to aitem.Count-1 do
  1229. //     aitem.Items[i].AutoHotkeys := maAutomatic;
  1230.      
  1231.     LLastAt := 0;
  1232.     LLastBar := nil;
  1233.  with aitem do begin
  1234.     for I := LLastAt to Count - 1 do
  1235.       if Items[I].Visible then
  1236.         if Items[I].IsLine then
  1237.         begin
  1238.           Items[I].Visible := False;
  1239.         end else begin
  1240.           LLastAt := I;
  1241.           System.Break;
  1242.         end;
  1243.     for I := LLastAt to Count - 1 do
  1244.       if Items[I].IsLine then
  1245.       begin
  1246.         if (LLastBar <> nil) and (LLastBar.Visible) then
  1247.         begin
  1248.           LLastBar.Visible := False;
  1249.         end;
  1250.         LLastBar := Items[I];
  1251.       end
  1252.       else if Items[I].Visible then
  1253.       begin
  1254.         if (LLastBar <> nil) and (not LLastBar.Visible) then
  1255.         begin
  1256.           LLastBar.Visible := True;
  1257.         end;
  1258.         LLastBar := nil;
  1259.         LLastAt := I;
  1260.       end;
  1261.     for I := Count - 1 downto LLastAt do
  1262.       if Items[I].Visible then
  1263.         if Items[I].IsLine then
  1264.         begin
  1265.           Items[I].Visible := False;
  1266.         end
  1267.         else
  1268.           System.Break;
  1269.   end;
  1270. end;
  1271. procedure ActionUpdate(item:Tmenuitem);
  1272. var
  1273.   i: Integer;
  1274.   a: TMenuItem;
  1275. begin
  1276. {   for i:= 0 to item.Count-1 do begin
  1277.      a:=item.Items[i];
  1278.      if a.Action<>nil then a.Action.Update;
  1279.    end;}
  1280. end;
  1281. function GetFormCaption(ahwnd:Thandle):widestring;
  1282. var  buf:array[0..1000] of char;
  1283. begin
  1284.   result:='';
  1285.   if Win32PlatformIsUnicode then begin
  1286.     SetLength(Result, GetWindowTextLengthW(ahwnd) + 1);
  1287.     GetWindowTextW(ahwnd, PWideChar(Result), Length(Result));
  1288.     SetLength(Result, Length(Result) - 1);
  1289.   end else begin
  1290.      sendmessage(ahwnd,WM_GETTEXT,1000,integer(@buf));
  1291.      result:=strpas(buf);
  1292.   end;
  1293. end;
  1294. function GetFormCaptionA(ahwnd:Thandle):string;
  1295. var  buf:array[0..1000] of char;
  1296. begin
  1297.   sendmessage(ahwnd,WM_GETTEXT,1000,integer(@buf));
  1298.   result:=strpas(buf);
  1299. end;
  1300. function GetFormText(ahwnd:Thandle):string;
  1301. var s:widestring;
  1302. begin
  1303.    s:= GetFormCaption(ahwnd);
  1304.   result:=WideStringToStringEx(s);
  1305. end;
  1306. function TWinSkinForm.CheckMenu(Button: TMenuBtn): Boolean;
  1307. var
  1308.   Hook: Boolean;
  1309.   I: Integer;
  1310.   APoint: TPoint;
  1311.   aflags:integer;
  1312.   mp:tagTPMPARAMS;
  1313. begin
  1314.     Result := False;
  1315.     lastselect:=false;
  1316.     mp.cbSize:=sizeof(mp);
  1317.     if (button=nil) then Exit;
  1318.     postmessage(hwnd,wm_command,button.mid,0);
  1319.     if (Button.hsubmenu=0) then Exit;
  1320.     if button.menuitem<>nil then  begin
  1321. //    error happen 2006.5.04
  1322. //       RethinkLines(button.menuitem);
  1323.        ActionUpdate(button.menuitem);
  1324.     end;
  1325.     MenuButtonIndex := Button.Index;
  1326.     SkinForm := Self;
  1327.     GetWindowRect(hwnd, WTR);
  1328.     mp.rcExclude := rect(wtr.Right-5,wtr.Top,GetSystemMetrics(SM_CXMAXIMIZED),wtr.Bottom);
  1329.     if not ((Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion = 4)) then
  1330.        wminitmenu(button.hsubmenu);
  1331. //    skincanlog:=true;
  1332.     finmenu:=true;
  1333.     APoint := Point(Button.bounds.left+wtr.left,Button.bounds.bottom+wtr.top);
  1334.     if bidileft then begin
  1335.        APoint := Point(Button.bounds.right+wtr.left,Button.bounds.bottom+wtr.top);
  1336.        Aflags:= TPM_RightALIGN or TPM_RIGHTBUTTON or TPM_NONOTIFY;
  1337.     end else begin
  1338.        APoint := Point(Button.bounds.left+wtr.left,Button.bounds.bottom+wtr.top);
  1339.        Aflags:= TPM_LEFTALIGN or TPM_RIGHTBUTTON or TPM_NONOTIFY;
  1340.     end;
  1341. //    SendMessage(hwnd,WM_INITMENUPOPUP,button.hsubmenu,0);
  1342.     skinmanager.menutype:=m_menuitem;
  1343.     skinmanager.menuactive:=true;
  1344.     activemenu:=button.hsubmenu;
  1345.     InitMenuHooks;
  1346.     if Button.enabled then begin
  1347. //       if bidileft then
  1348. //          TrackPopupMenuex(button.hsubmenu, aflags,APoint.X, APoint.Y,hwnd,@mp)
  1349. //       else
  1350.         TrackPopupMenu(button.hsubmenu, aflags,APoint.X, APoint.Y,0,hwnd,nil );
  1351.     end;
  1352.     ReleaseMenuHooks;
  1353.     finmenu:=false;
  1354.     Result := True;
  1355. end;
  1356. //fixed by Brian Lowe
  1357. procedure TWinSkinForm.CMDialogChar(var Message: TMessage); //TCMDialogChar
  1358. var
  1359.   Button: TMenubtn;
  1360.   ShiftState: TShiftState;
  1361.   KeyState: TKeyboardState;
  1362. begin
  1363.   OldWndProc(message);
  1364.   if message.result<>0 then exit;
  1365.     GetKeyboardState(KeyState);
  1366.     ShiftState := KeyboardStateToShiftState(KeyState);
  1367.     Button := FindButtonFromAccel(TWMKey(Message).CharCode);
  1368.     if (Button <> nil) and (ShiftState = [ssAlt]) then begin
  1369.         clickbutton(button);
  1370.         Message.Result := 1;
  1371.         done2:=true;
  1372.     end else begin
  1373.       //mdiform mainmenu shortcut
  1374.       if (formstyle=sfsmdichild) then begin
  1375.          if skinmanager.MDIForm.Perform(CM_DIALOGCHAR,
  1376.                 TWMKey(Message).CharCode,TWMKey(Message).KeyData)<>0 then exit;
  1377.       end else if (fform<>application.MainForm) and (not (fsModal in fform.FormState)) then begin //has problem
  1378.           application.MainForm.Perform(CM_DIALOGCHAR,TWMKey(Message).CharCode,TWMKey(Message).KeyData);
  1379.       end;
  1380.       message.Result:=0;
  1381. //      OldWndProc(message);
  1382.     end;  
  1383. end;
  1384. procedure SetAnimation(Value: Boolean);
  1385. var
  1386.   Info: TAnimationInfo;
  1387. begin
  1388.   Info.cbSize := SizeOf(TAnimationInfo);
  1389.   BOOL(Info.iMinAnimate) := Value;
  1390.   SystemParametersInfo(SPI_SETANIMATION, SizeOf(Info), @Info, 0);
  1391. end;
  1392. constructor TWinSkinForm.Create(AOwner: TComponent);
  1393. var i,l:integer;
  1394. begin
  1395.   inherited create(aowner);
  1396.   bstr:='  ';
  1397.   SkinCanLog:=true;
  1398.   poptime := 0;
  1399.   charwidth := 0;
  1400.   winrgn := 0;
  1401.   DoubleTime := GetDoubleClickTime;
  1402. //  SkinCanLog:=false;
  1403.   CreateCaptionFont;
  1404.   fCanvas:= TCanvas.create;
  1405.   fCanvas2:= TCanvas.create;
  1406. //  bg:=Tbitmap.create;
  1407.   controllist:=Tlist.create;
  1408.   IconBmp:=Tbitmap.create;
  1409.   CaptionBuf:=Tbitmap.create;
  1410.   MenuHeight := 0;
  1411.   msglock:=0;
  1412.   mode:=0;
  1413.   activebtn:=nil;
  1414.   creating:=false;
  1415.   bidileft:=false;
  1416.   NewChildHwnd:=0;
  1417.   fwindowactive:=true;
  1418.   ActiveBtn:= nil;
  1419.   skinstate:=skin_Creating;
  1420.   fform:=nil;
  1421.   astr:='  ';
  1422.  {$IFnDEF demo}
  1423.     astr:=' ';
  1424.  {$else}
  1425.     astr:=' Vclskin Demo';
  1426.  {$ENDIF}
  1427. end;
  1428. destructor TWinSkinForm.Destroy;
  1429. begin
  1430.   DeleteControls;
  1431.   DeleteSysbtn;
  1432.   if not IsBadReadPtr(CaptionBuf, InstanceSize) then CaptionBuf.free;
  1433.   if timer<>nil then timer.free;
  1434.   if menu<>nil then begin
  1435.      menu.free;
  1436.      menu:=nil;
  1437.   end;
  1438.   if  sysmenu<>nil then begin
  1439.     sysmenu.free;
  1440.     sysmenu:=nil;
  1441.   end;
  1442.   CaptionFont.free;
  1443.   controllist.free;
  1444.   controllist:=nil;
  1445.   Iconbmp.free;
  1446.   if skinmanager<>nil then skinmanager.DeleteForm2(hwnd);
  1447.   fCanvas.free;
  1448.   fCanvas2.free;
  1449. //  skinaddlog('Skinform DESTROY '+caption);
  1450.   inherited destroy;
  1451. end;
  1452.   //  TabSheet := TTabSheet.Create(PageControl1);
  1453.   // this event happen when owern is form, it is problem
  1454. procedure TWinSkinForm.Notification(AComponent: TComponent;Operation: TOperation);
  1455. var j:integer;
  1456.     sc:Tskincontrol;
  1457. begin
  1458.   inherited Notification(AComponent, Operation);
  1459.   
  1460. {  if (Operation = opInsert) and (AComponent <> nil) then begin
  1461.      skinaddlog(format('Notification Insert :%s,%s',[acomponent.classname,acomponent.name]));
  1462.   end;   }
  1463.   {  if (skinstate<>Skin_Active) or (acomponent.tag=c_skintag) then exit;
  1464.   if (Operation = opRemove) and (AComponent <> nil) then begin
  1465.      skinaddlog(format('Notification Remove :%s',[acomponent.classname]));
  1466.      if (AComponent is TGraphicControl) then begin
  1467.        for j:= 0 to controllist.count-1 do begin
  1468.             sc:= Tskincontrol(controllist.items[j]);
  1469.             if sc.GControl = AComponent then begin
  1470.                controllist.Delete(j);
  1471.                sc.free;
  1472.                break;
  1473.             end;
  1474.        end;
  1475.      end;//Tgraphiccontrol
  1476.   end else if (Operation = opInsert) and (AComponent <> nil) then begin
  1477. //     skinaddlog(format('Notification Insert :%s',[acomponent.classname]));
  1478.   end;}
  1479. end;
  1480. procedure TWinSkinForm.DeleteSysbtn;
  1481. var i:integer;
  1482. begin
  1483.   if high(sysbtn)=0 then exit;
  1484.   for i:= 0 to high(SysBtn) do
  1485.       SysBtn[i].free;
  1486.   setlength(sysbtn,0);
  1487. end;
  1488. procedure TWinSkinForm.DeleteControl(c:TSkinControl);
  1489. var i:integer;
  1490. begin
  1491.   if controllist=nil then exit;
  1492.   for i:= controllist.count-1 downto 0 do begin
  1493.      if Controllist.items[i]=c then begin
  1494.        controllist.delete(i);
  1495.        break;
  1496.      end;
  1497.   end;
  1498. end;
  1499. procedure TWinSkinForm.DeleteSkinDeleted;
  1500. var i:integer;
  1501.     c:TSkinControl;
  1502. begin
  1503.   for i:= controllist.count-1 downto 0 do begin
  1504.      c:=TSkinControl(Controllist.items[i]);
  1505.      if c.skinstate=skin_deleted then begin
  1506.         controllist.delete(i);
  1507.         c.free;
  1508.      end;
  1509.   end;
  1510. end;
  1511. procedure TWinSkinForm.DeleteControls;
  1512. var i:integer;
  1513.     c:TSkinControl;
  1514.     acontrol:Tcontrol;
  1515. begin
  1516. //  for i:= controllist.count-1 to 0 do begin
  1517. //  if (Skinstate=skin_Destory) then exit;
  1518.   while controllist.count>0 do begin
  1519.      c:=TSkinControl(Controllist.items[0]);
  1520.      if (c.control<>nil) and (c.control is TToolbar) then begin
  1521.         Ttoolbar(c.control).OnCustomDrawButton:=nil;
  1522.         Ttoolbar(c.control).OnCustomDraw:=nil;
  1523.      end;
  1524.      if (Skinstate<>skin_Destory) and (c.skinstate<>skin_deleted) then c.unsubclass;
  1525.      controllist.delete(0);
  1526.      c.free;
  1527.   end;
  1528.   controllist.clear;
  1529. end;
  1530. function TWinSkinForm.AddControlList(acontrol:TSkinControl):boolean;
  1531. var i:integer;
  1532.     c:TSkinControl;
  1533.     b:boolean;
  1534. begin
  1535.   b:=false;
  1536.   for i:= 0 to controllist.count-1 do begin
  1537.      c:=TSkinControl(Controllist.items[i]);
  1538.      if c=acontrol then begin
  1539.         b:=true;
  1540.         break;
  1541.      end;
  1542.   end;   
  1543.   if not b then controllist.add(acontrol);
  1544.   result:=b;
  1545. end;
  1546. procedure TWinSkinForm.CreateCaptionFont;
  1547. var
  1548.   NonClientMetrics: TNonClientMetrics;
  1549. begin
  1550.   If Assigned(CaptionFont) then FreeAndNIL(CaptionFont);
  1551.   CaptionFont := TFont.Create;
  1552.   NonClientMetrics.cbSize := SizeOf(NonClientMetrics);
  1553.   if SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @NonClientMetrics, 0) then
  1554.     CaptionFont.Handle := CreateFontIndirect(NonClientMetrics.lfCaptionFont);
  1555. end;
  1556. procedure TWinSkinForm.changemdistyle;
  1557. var Style: Longint;
  1558. begin
  1559.     if fform.clienthandle<>0 then begin
  1560.       Style := GetWindowLong(fform.ClientHandle, GWL_STYLE);
  1561.       Style := Style and not WS_VSCROLL and not WS_HSCROLL;
  1562.       SetWindowLong(fform.ClientHandle, GWL_STYLE, Style);
  1563.       Style := GetWindowLong(fform.ClientHandle, GWL_EXSTYLE);
  1564.       Style := Style and not WS_EX_CLIENTEDGE;
  1565.       SetWindowLong(fform.ClientHandle, GWL_EXSTYLE, Style);
  1566.       SetWindowPos(fform.ClientHandle, 0, 0,0,0,0, SWP_FRAMECHANGED or SWP_NOACTIVATE or
  1567.       SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER);
  1568.     end;
  1569. end;
  1570. procedure TWinSkinForm.SetActive(const Value: boolean);
  1571. begin
  1572. end;
  1573. procedure TWinSkinForm.InitTform(afsd:Tskindata;aform:Tform);
  1574. begin
  1575.    fform:=aform;
  1576.    if assigned(afsd.OnBeforeSkinForm) then
  1577.      afsd.OnBeforeSkinForm(fform,hwnd,formclass);
  1578. //   fform.autoscroll:=false;
  1579.    if (xcMenuitem in afsd.SkinControls) then
  1580.       setproperty(fform,'AutoScroll','False');
  1581.    InitSkin(afsd);
  1582. //   if (xcMainMenu in afsd.SkinControls) then begin
  1583.    if sMainMenu then begin   //for midchild border
  1584.       OldWndProc:= fform.WindowProc;
  1585.       fform.WindowProc := NewWndProc;
  1586.    end;
  1587.    formcolor:=aform.color;
  1588.    aform.color:= afsd.colors[csButtonFace];
  1589. //   if (xcPopupMenu in afsd.SkinControls) then
  1590. //     InitPopMenu(aForm,true,false);
  1591.    if (xcMenuitem in afsd.SkinControls) then  begin
  1592.      InitMainMenu(aForm,true,false);
  1593.    end;
  1594. end;
  1595. procedure TWinSkinForm.GetBorderSize;
  1596. var r1,r2:Trect;
  1597. begin
  1598.     GetClientRect(hwnd,fClientRect);
  1599.     getwindowrect(hwnd,r1);
  1600.     GetClientRect(hwnd,r2);
  1601.     oldsize:=rect(0,0,r1.right-r1.left-(r2.right-r2.left),
  1602.                      r1.bottom-r1.top-(r2.bottom-r2.top));
  1603. end;
  1604. procedure TWinSkinForm.InitSkin(afsd:Tskindata);
  1605. var Exdwstyle:Dword;
  1606.     r1,r2:Trect;
  1607.     cw:integer;
  1608. begin
  1609.   if (FObjectInst=nil) Then begin
  1610.     skinmanager.state:=skin_Active;
  1611.     fsd:=afsd;
  1612.     timer:=TTimer.create(self);
  1613.     timer.Interval:=250;
  1614.     timer.Ontimer:=Ontimer;
  1615.     timer.enabled:=false;
  1616. //    CreateCaptionFont;
  1617.     sMainMenu := xcMainMenu in fsd.SkinControls;
  1618.     dwstyle := GetWindowLong( hwnd, GWL_STYLE );
  1619.     ExdwStyle := GetWindowLong(hwnd, GWL_EXSTYLE);
  1620.     bidileft := (exdwstyle and WS_EX_LEFTSCROLLBAR)>0;
  1621.     ischildform :=   (dwstyle and ws_child)>0;
  1622. //    hsysmenu:=GetSystemMenu(hWnd, FALSE);
  1623. //    geticon(iconbmp);
  1624.     classname:=getwindowclassname(hwnd);
  1625.     parenthwnd:=GetWindow(hWnd, GW_OWNER);
  1626. //    GetBorderSize;
  1627. {    GetClientRect(hwnd,fClientRect);
  1628.     getwindowrect(hwnd,r1);
  1629.     GetClientRect(hwnd,r2);
  1630.     oldsize:=rect(0,0,r1.right-r1.left-(r2.right-r2.left),
  1631.                      r1.bottom-r1.top-(r2.bottom-r2.top));}
  1632.     formicons:=[];
  1633.     if ((dwstyle and WS_SYSMENU)>0) or (hsysmenu>0) then
  1634.       formicons:=formicons+[sbisystem];
  1635.     if (dwstyle and WS_MINIMIZEBOX)>0 then
  1636.       formicons:=formicons+[sbimin];
  1637.     if (dwstyle and WS_MAXIMIZEBOX)>0 then
  1638.       formicons:=formicons+[sbimax];
  1639.     if (ExdwStyle and WS_EX_CONTEXTHELP)>0 then
  1640.       formicons:=formicons+[sbihelp];
  1641. //    createsysmenu2;
  1642.     getwindowstate;
  1643.     fsizeable := (dwstyle and WS_SIZEBOX)>0;
  1644.     GetFormstyle;
  1645.     if (Exdwstyle and ws_ex_mdichild)>0 then begin
  1646.       formstyle:=sfsMDIChild;
  1647.       if (xoMDIChildBorder in fsd.Options) then
  1648.          sMainMenu := false;
  1649.     end ;//{ else ShowWindow(hwnd,SW_HIDE)};
  1650. //MDIchild window menu has problem
  1651.     formborder := sbsSingle;
  1652.     if {((dwstyle and WS_popup)>0) and}
  1653.        ((dwstyle and WS_Caption)<>WS_Caption) then
  1654.        formborder:=sbsnone
  1655.     else if ((dwstyle and WS_THICKFRAME)>0) or
  1656. //       ((ExdwStyle and WS_EX_WINDOWEDGE)>0) or
  1657.        //( formstyle=sfsMDIChild ) or
  1658.        ((dwstyle and WS_SIZEBOX)>0) then
  1659.        formborder:=sbsSizeable
  1660.     else if ((dwstyle and DS_MODALFRAME)>0) then
  1661.        formborder := sbsDialog;
  1662.     if (ExdwStyle and ws_EX_dlgmodalframe)>0 then
  1663.        formborder := sbsDialog ;
  1664.     if ((ExdwStyle and WS_EX_APPWINDOW)>0)
  1665.        and (Win32Platform = VER_PLATFORM_WIN32_NT)
  1666.        and (Win32MajorVersion>=5) and (Win32MinorVersion =0) then
  1667.           formicons := formicons + [sbicaption];
  1668.     if ((parenthwnd=0) and (formstyle<>sfsmdichild))
  1669.        and (Win32MajorVersion>=5) and (Win32MinorVersion =0) then
  1670.           formicons := formicons + [sbicaption];
  1671.     isunicode:=IsWindowUnicode(hwnd);
  1672.     ismessagebox:=false;
  1673.     if (classname='#32770') or (classname='TMessageForm') then begin
  1674.        formborder := sbsDialog;
  1675.        ismessagebox:=true;
  1676.     end;
  1677.     //    lockwindowupdate(hwnd);
  1678.     StopUpdate;
  1679.  {$IFDEF demo}
  1680. //    setproperty(fform,'Caption',' ');
  1681.  {$endif}
  1682.  
  1683.    if (winversion >= $80000000) then
  1684.         fsd.skincontrols:=fsd.skincontrols-[xcSystemMenu];
  1685.     if formstyle=sfsmdiform then begin
  1686.        menuauto:=fsd.menuUpdate;
  1687.        subclassMDI;
  1688.     end;
  1689.     FObjectInst := MakeObjectInstance(WinWndProc);
  1690.     if isunicode then begin
  1691.        FPrevWndProc := Pointer(GetWindowLongw(hwnd,GWL_WNDPROC));
  1692.        SetWindowLongw(hwnd, GWL_WNDPROC,LongInt(FObjectInst));
  1693.     end else begin
  1694.        FPrevWndProc := Pointer(GetWindowLong(hwnd,GWL_WNDPROC));
  1695.        SetWindowLong(hwnd, GWL_WNDPROC,LongInt(FObjectInst));
  1696.     end;
  1697.   if sMainMenu then begin
  1698.     hmenu:=GetMenu(hWnd);
  1699.     if (hmenu<>0) and (formstyle<>sfsMDIChild) then begin
  1700.        menu:=TWinSkinMenu.create(self);
  1701.        menu.fsd:=fsd;
  1702.        Menu.sf := self;
  1703.        MenuHeight := GetSystemMetrics(SM_CYMENU);
  1704. //***************
  1705.        if fform<>nil then menu.menu:= fform.menu;
  1706.        menu.UpdataBtn;
  1707.     end;
  1708.     if ((formstyle<>sfsmdichild) or (not skinmanager.mdimax)) and (windowstate<>swsmin) then
  1709.       EnableSysbtn(false);
  1710.     InitSkinData;
  1711.   end else skinstate := skin_active;
  1712.    cw:= GetSystemMetrics(SM_CYCAPTION)+GetSystemMetrics(SM_CXFRAME);
  1713. //   if (menuheight=0) and (cw>bw.top) then
  1714.    if (formstyle=sfsMDIChild) and (cw>bw.top) then
  1715.         menuheight := cw-bw.Top;
  1716. //  setmdimax if mainmenu is nil
  1717.     if (formstyle=sfsmdichild) and (windowstate=swsmax) and (not skinmanager.mdimax) then
  1718.        skinmanager.setmdimax(true);
  1719. {    if fform<>nil then
  1720.        InitControls(fform)
  1721.     else InitHwndControls(hwnd);}
  1722.     
  1723.   {$IFDEF test}
  1724.     SkinAddLog(format('%s skin active %1x',[caption,hwnd]));
  1725.   {$ENDIF}
  1726. //   InvalidateRect(hwnd, 0,true);
  1727.   end;
  1728. end;
  1729. {procedure TWinSkinForm.EnableSysbtn(b:boolean);
  1730. var exstyle:Dword;
  1731.     b2:boolean;
  1732. begin
  1733.     if sbicaption in formicons then begin
  1734.           dwstyle := GetWindowLong( hwnd, GWL_STYLE );
  1735.           if b then dwstyle := dwstyle or WS_CAPTION
  1736.           else dwstyle := dwstyle and (not WS_CAPTION);
  1737.           SetWindowLong( hwnd, GWL_STYLE, dwstyle );
  1738.     end;
  1739.     exit;
  1740.     //mdichildmax has all sysbtn
  1741.     if (formstyle=sfsmdichild) and (skinmanager.mdimax)
  1742.        and (not b) then exit;
  1743.     //embed form unskin, exit
  1744.     if b and (formstyle<>sfsmdichild) and (ischildform) then exit;
  1745.     hassysbtn:=b;
  1746.     dwstyle := GetWindowLong( hwnd, GWL_STYLE );
  1747.     ExStyle := GetWindowLong(hwnd, GWL_EXSTYLE);
  1748.     if b then begin
  1749.       if sbisystem in formicons then
  1750.        dwstyle := dwstyle or WS_SYSMENU;
  1751.       if sbimin in formicons then
  1752.        dwstyle := dwstyle or WS_MINIMIZEBOX;
  1753.       if sbimax in formicons then
  1754.        dwstyle := dwstyle or WS_MAXIMIZEBOX;
  1755.       if sbicaption in formicons then
  1756.           dwstyle := dwstyle or WS_CAPTION;
  1757.     end else begin
  1758.       if (parenthwnd=0) or (formstyle=sfsmdiform) then begin
  1759.           formicons := formicons + [sbicaption];
  1760.           dwstyle := dwstyle and ( not WS_CAPTION);
  1761.       end else begin
  1762.           dwstyle := dwstyle and (not WS_MINIMIZEBOX);
  1763.           dwstyle := dwstyle and (not WS_MAXIMIZEBOX);
  1764.           dwstyle := dwstyle and ( not WS_SYSMENU);
  1765.       end;
  1766.       b2:=false;
  1767.       if ((parenthwnd=0) and (formstyle<>sfsmdichild)) then b2:=true
  1768.       else if (exstyle and WS_EX_APPWINDOW>0) then b2:=true;
  1769.       if b2 and (Win32Platform = VER_PLATFORM_WIN32_NT)
  1770.          and (Win32MajorVersion>=5) and (Win32MinorVersion >= 1) then b2:=false;
  1771.       if b2 then begin
  1772.           formicons := formicons + [sbicaption];
  1773.           dwstyle := dwstyle and ( not WS_CAPTION);
  1774.       end else begin
  1775.           dwstyle := dwstyle and (not WS_MINIMIZEBOX);
  1776.           dwstyle := dwstyle and (not WS_MAXIMIZEBOX);
  1777.           dwstyle := dwstyle and ( not WS_SYSMENU);
  1778.       end;
  1779.     end;
  1780.     SetWindowLong( hwnd, GWL_STYLE, dwstyle );
  1781. end;}
  1782. procedure TWinSkinForm.EnableSysbtn(b:boolean);
  1783. var exstyle:Dword;
  1784.     b2:boolean;
  1785. begin
  1786.     exit;    
  1787.     if (formstyle<>sfsmdichild) then exit;
  1788.     //mdichildmax has all sysbtn
  1789.     if (skinmanager.mdimax) and (not b) then exit;
  1790.     hassysbtn:=b;
  1791.     dwstyle := GetWindowLong( hwnd, GWL_STYLE );
  1792.     ExStyle := GetWindowLong(hwnd, GWL_EXSTYLE);
  1793.     if b then begin
  1794.       if sbisystem in formicons then
  1795.        dwstyle := dwstyle or WS_SYSMENU;
  1796.       if sbimin in formicons then
  1797.        dwstyle := dwstyle or WS_MINIMIZEBOX;
  1798.       if sbimax in formicons then
  1799.        dwstyle := dwstyle or WS_MAXIMIZEBOX;
  1800.     end else begin
  1801.           dwstyle := dwstyle and (not WS_MINIMIZEBOX);
  1802.           dwstyle := dwstyle and (not WS_MAXIMIZEBOX);
  1803.           dwstyle := dwstyle and ( not WS_SYSMENU);
  1804.     end;
  1805.     SetWindowLong( hwnd, GWL_STYLE, dwstyle );
  1806. end;
  1807. procedure TWinSkinForm.SubclassMDI;
  1808. var  MDIunicode:boolean;
  1809. begin
  1810.     MDIunicode:=false;
  1811.     FMDIObjectInst := MakeObjectInstance(WinMDIProc);
  1812.     if MDIunicode then begin
  1813.        FMDIWndProc := Pointer(GetWindowLongw(Clienthwnd,GWL_WNDPROC));
  1814.        SetWindowLongw(Clienthwnd, GWL_WNDPROC,LongInt(FMDIObjectInst));
  1815.     end else begin
  1816.        FMDIWndProc := Pointer(GetWindowLong(Clienthwnd,GWL_WNDPROC));
  1817.        SetWindowLong(Clienthwnd, GWL_WNDPROC,LongInt(FMDIObjectInst));
  1818.     end;
  1819. end;
  1820. procedure TWinSkinForm.UnSubclassMDI;
  1821. var  MDIunicode:boolean;
  1822. begin
  1823.     if FMDIObjectInst<>nil then begin
  1824.        MDIunicode:=false;
  1825.        if MDIunicode then begin
  1826.           SetWindowLongw(Clienthwnd, GWL_WNDPROC,LongInt(FMDIWndProc));
  1827.        end else begin
  1828.           SetWindowLong(Clienthwnd, GWL_WNDPROC,LongInt(FMDIWndProc));
  1829.        end;
  1830.        FreeObjectInstance(FMDIObjectInst);
  1831.        FMDIObjectInst:=nil;
  1832.     end;
  1833. end;
  1834. procedure TWinSkinForm.DefaultMDI(Var Msg: TMessage);
  1835. begin
  1836.   msg.result:=CallWindowProc(FMDIWndProc,Clienthwnd,Msg.msg,msg.WParam,msg.LParam);
  1837. end;
  1838. procedure TWinSkinForm.AddSysMenuitem(acaption:string;action:integer);
  1839. var item:Tmenuitem;
  1840. begin
  1841.    Item := TMenuItem.Create(sysmenu);
  1842.    item.Caption := acaption;
  1843.    item.Tag:=action;
  1844.    item.onclick:=dosysmenu;
  1845.    item.OnDrawItem := DrawMenuItem;
  1846.    item.OnMeasureItem := MeasureItempop;
  1847.    item.ImageIndex :=action;
  1848.    if action=3 then
  1849.    item.ShortCut := TextToShortCut('ALT+F4');
  1850.    Sysmenu.Items.Add(item);
  1851. end;
  1852. procedure TWinSkinForm.CreateSysmenu2;
  1853. var i,n,j:integer;
  1854.     mi:TMenuItemInfo;
  1855.     Buffer: array[0..79] of Char;
  1856.     item:Tmenuitem;
  1857.     s:string;
  1858. begin
  1859.    if  sysmenu<>nil then begin
  1860.       sysmenu.free;
  1861.       sysmenu:=nil;
  1862.    end;
  1863.   if (Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion <5) then begin
  1864.      CreateSysmenu;
  1865.      exit;
  1866.   end;
  1867.   if hsysmenu = 0 then exit;
  1868.   n:= GetMenuItemCount(hsysmenu);
  1869.   sysmenu:=Tpopupmenu.create(self);
  1870.   sysmenu.Tag:=c_skintag;
  1871.   sysmenu.OwnerDraw := true;
  1872.   sysmenu.Images:=fsd.bmpmenu;
  1873.   for i:= 0 to n-1 do begin
  1874.        fillchar(mi,sizeof(mi),#0);
  1875.        mi.cbSize:= sizeof(TMENUITEMINFO);
  1876.        mi.fMask := MIIM_ID or  MIIM_STATE or MIIM_STRING;
  1877.        mi.fType := 0;
  1878.        mi.dwTypeData := Buffer;
  1879.        Mi.cch := SizeOf(Buffer);
  1880.        GetMenuItemInfo(hsysmenu, i, TRUE, mi);
  1881.        s:= buffer;
  1882.       Item := TMenuItem.Create(sysmenu);
  1883.       if s='' then item.Caption:= '-'
  1884.       else item.Caption := s;
  1885.       item.Tag:= mi.wID;
  1886.       case mi.wID of
  1887.         SC_MAXIMIZE: begin
  1888.             item.ImageIndex :=1;
  1889.             item.enabled:= (windowstate<>swsmax) and (sbimax in formicons);
  1890.           end;
  1891.         SC_MINIMIZE: begin
  1892.             item.ImageIndex :=2;
  1893.             item.enabled:= (windowstate<>swsmin) and (sbimin in formicons);
  1894.           end;
  1895.         Sc_Restore : begin
  1896.             item.ImageIndex :=0;
  1897.             item.enabled:= (windowstate<>swsnormal) ;
  1898.           end;
  1899.         SC_MOVE,SC_SIZE: begin
  1900.               item.enabled:= (windowstate<>swsmax) ;
  1901.           end;
  1902.         SC_CLOSE : item.ImageIndex :=3;
  1903.         else  item.ImageIndex :=-1;
  1904.       end;
  1905.       item.onclick:=dosysmenu2;
  1906.       if mi.fState=3 then item.Enabled:=false;
  1907.       if (mi.fState and MFS_CHECKED)>0 then item.Checked:=true;
  1908.       //item.Enabled :=  not ((mi.fState and $0ff) = MFS_DISABLED);
  1909.       item.OnDrawItem := DrawMenuItem;
  1910.       item.OnMeasureItem := MeasureItempop;
  1911.       Sysmenu.Items.Add(item);
  1912.   end;
  1913. end;
  1914. function  TWinSkinForm.CheckSysmenu:boolean;
  1915. var i,n,j:integer;
  1916.     mi:TMenuItemInfo;
  1917.     Buffer: array[0..79] of Char;
  1918. begin
  1919.   result:=true;
  1920.   if (Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion <5) then begin
  1921.      exit;
  1922.   end;
  1923.   if winversion >= $80000000 then
  1924.      exit;
  1925.  
  1926.   fillchar(mi,sizeof(mi),#0);
  1927.   mi.cbSize:= sizeof(TMENUITEMINFO);
  1928.   mi.fMask := MIIM_STATE ;
  1929.   mi.fType := 0;
  1930.   mi.dwTypeData := Buffer;
  1931.   Mi.cch := SizeOf(Buffer);
  1932.   result:=GetMenuItemInfo(hsysmenu, SC_CLOSE, false, mi);
  1933. end;
  1934. procedure TWinSkinForm.CreateSysmenu;
  1935. begin
  1936.    if  sysmenu<>nil then begin
  1937.       sysmenu.free;
  1938.       sysmenu:=nil;
  1939.    end;
  1940.    sysmenu:=Tpopupmenu.create(self);
  1941.    sysmenu.Tag:=c_skintag;
  1942.    sysmenu.OwnerDraw := true;
  1943.    sysmenu.Images:=fsd.bmpmenu;
  1944.    AddSysMenuitem(' Restore ',0);
  1945.    if sbimax in formicons then AddSysMenuitem(' Maximize ',1);
  1946.    if sbimin in formicons then AddSysMenuitem(' Minimize ',2);
  1947.    AddSysMenuitem('-',100);
  1948.    AddSysMenuitem(' Close ',3);
  1949. end;
  1950. procedure TWinSkinForm.ResizeForm(i:integer);
  1951. var w,h,minwidth,w2:integer;
  1952.     r1,r2,r3:Trect;
  1953.     fdc:HDC;
  1954.     acanvas:TCanvas;
  1955.     hctrl,temp : Thandle;
  1956.     p:Tpoint;
  1957.     dw:dword;
  1958. begin
  1959.    dw := SWP_NOMOVE or SWP_DRAWFRAME or SWP_NOZORDER ;
  1960.    {if SkinState=skin_change then} dw := dw or SWP_NOACTIVATE ;
  1961.    if windowstate<>swsmax then begin
  1962.      GetWindowRect(hwnd,r2);
  1963.      if (ismessagebox) or (SkinState=skin_change) then GetClientRect(hwnd,fClientRect);
  1964.      w:=fClientRect.right+bw.left+bw.right;
  1965.      if i=0 then begin
  1966.          if fform<>nil then begin
  1967.            //fClientRect.bottom:=r2.bottom-r2.top-menuheight-GetSystemMetrics(SM_CYFRAME)*2-GetSystemMetrics(SM_CYCAPTION);
  1968.            W := fform.clientWidth + Bw.Left + bw.right;
  1969.            fclientrect.Bottom := fform.ClientHeight-menuheight;
  1970.            //GetClientRect(hwnd,fClientRect);
  1971.            //fClientRect.bottom:=fform.ClientHeight;
  1972.            //fClientRect.right:=fform.ClientWidth;
  1973.            if  formstyle=sfsMDIChild then fclientrect.Bottom := fclientrect.Bottom+menuheight
  1974.          end;
  1975.          h:=fClientRect.bottom+bw.top+bw.bottom+menuheight;
  1976.      end else begin
  1977.         GetClientRect(hwnd,fClientRect);
  1978.         h:=fClientRect.bottom+bw.top+bw.bottom + menuheight;
  1979.      end;
  1980.   {$IFDEF VER170}         // Delphi 9
  1981.      //GetClientRect(hwnd,fClientRect);
  1982.      //h:=fClientRect.bottom+bw.top+bw.bottom+menuheight;
  1983.      //w:=fClientRect.right+bw.left+bw.right;
  1984.   {$endif}
  1985.      if (ismessagebox) and (i=0) then begin
  1986.         caption := getformcaption(hwnd);
  1987.         FDC := GetWindowDC(hwnd);
  1988.         acanvas:=Tcanvas.create;;
  1989.         acanvas.Handle := fdc;
  1990.         acanvas.font := CaptionFont;
  1991.         charwidth :=  acanvas.Textwidth(caption);
  1992.         acanvas.free;
  1993.         ReleaseDc(hwnd,fdc);
  1994. //        minwidth := (length(caption))*charwidth+bw.Left+bw.Right+
  1995. //                    fsd.title.r.left+fsd.title.r.right;
  1996. //                    +fsd.title.backleft+fsd.title.backright;
  1997.         minwidth := charwidth+fsd.title.r.left+fsd.title.r.right;
  1998.         if w<minwidth then begin
  1999.           w2:=(minwidth-w) div 2;
  2000.           hCtrl := GetTopWindow( hWnd );
  2001.           while ( hCtrl<>0 ) do begin
  2002.               temp := GetNextWindow( hCtrl, GW_HWNDNEXT );
  2003.               GetWindowRect(hCtrl,r3);
  2004.               p:=point(r3.Left,r3.Top);
  2005.               screentoclient(hwnd,p);
  2006.               SetWindowPos(hCtrl, 0, p.X+w2, p.y,
  2007.                            r3.right-r3.Left,r3.Bottom-r3.Top,
  2008.                            SWP_NOSENDCHANGING or SWP_NOOWNERZORDER );
  2009.               hCtrl := temp ;
  2010.           end;
  2011.           w:=minwidth;
  2012.         end;
  2013.      end;
  2014.      SetWindowPos(hwnd, 0, r2.left, r2.top, w, h,dw);
  2015.    end else begin
  2016.      SetWindowPos(hwnd, 0, 0, 0, 0, 0, dw or SWP_NOSIZE );
  2017.      //Refresh;
  2018.    end;
  2019. end;
  2020. procedure TWinSkinForm.RePaint(ahwnd:Thandle);
  2021. var w,h:integer;
  2022.     r,r2:Trect;
  2023. begin
  2024. //   GetWindowRect(ahwnd,r2);
  2025. //   SetWindowPos(ahwnd, 0, r2.left, r2.top, r2.right-r2.left, r2.bottom-r2.top,
  2026. //       SWP_DRAWFRAME or SWP_NOZORDER or SWP_NOACTIVATE);
  2027. //  getwindowrect(ahwnd,r);
  2028. //  offsetrect(r,-r.left,-r.top);
  2029. //  if phwnd<>0 then begin
  2030.   InvalidateRect(ahwnd, 0,true);
  2031.   UpdateWindow(ahwnd);
  2032. end;
  2033. function TWinSkinForm.IsScrollControl(acontrol:TComponent):boolean;
  2034. var hwnd:Thandle;
  2035.     Style:longword;
  2036. begin
  2037.     result:=false;
  2038.     if not (acontrol is Twincontrol) then exit;
  2039.     hwnd:=Twincontrol(acontrol).handle;
  2040.     Style := GetWindowLong( hWnd, GWL_STYLE );
  2041.     if ((Style and WS_HSCROLL)=0) and
  2042.        ((Style and WS_VSCROLL)=0) then begin
  2043.        if (acontrol is Tlistbox)
  2044.           or (acontrol is Tmemo)
  2045. //          or (acontrol.tag = 55)
  2046. //          or (acontrol is Tlistview)
  2047.           or (acontrol is TCustomListBox)
  2048.           or (acontrol is TCustomTreeView)
  2049. //          or (acontrol is TCustomGrid)
  2050.           or (acontrol is Tscrollbox) then
  2051.           result:=true;
  2052.     end else result:=true;
  2053. end;
  2054. procedure TWinSkinForm.InitToolbarMenu(Item: TMenuItem;enable:boolean);
  2055. var
  2056.     a: integer;
  2057.   procedure Activate(MenuItem: TMenuItem);
  2058.   begin
  2059.     if Enable then begin
  2060.           MenuItem.OnDrawItem := DrawMenuItem;
  2061.           MenuItem.OnMeasureItem := MeasureItem;
  2062.     end else MenuItem.OnDrawItem := nil;
  2063.   end;
  2064. begin
  2065.     Activate(Item);
  2066.     for a := 0 to Item.Count - 1 do
  2067.       InitToolbarMenu(Item.Items[a],enable);
  2068. end;
  2069. procedure TWinSkinForm.InitPopMenu(wForm: TWinControl; Enable, Update: boolean );
  2070. var
  2071.   i, x: integer;
  2072.   Comp: TComponent;
  2073.   s:string;
  2074.   procedure Activate(MenuItem: TMenuItem);
  2075.   begin
  2076.     if Enable then begin
  2077.         if (not assigned(MenuItem.OnDrawItem)) or (FOverrideOwnerDraw) then begin
  2078.           if sMainMenu then
  2079.              MenuItem.OnDrawItem := DrawMenuItem;
  2080.         end;
  2081.        if not assigned(MenuItem.OnMeasureItem) then
  2082.           MenuItem.OnMeasureItem := MeasureItem;
  2083.     end else MenuItem.OnDrawItem := nil;
  2084.   end;
  2085.   procedure Activatepop(MenuItem: TMenuItem);
  2086.   begin
  2087.     if Enable then begin
  2088. //        if (not assigned(MenuItem.OnDrawItem)) then begin//or (FOverrideOwnerDraw) then begin
  2089.           MenuItem.OnDrawItem := DrawMenuItem;
  2090.      if not assigned(MenuItem.OnMeasureItem) then
  2091.           MenuItem.OnMeasureItem := MeasureItempop;
  2092. //        end ;
  2093.     end else begin
  2094.        MenuItem.OnDrawItem := nil;
  2095. //       if MenuItem.OnMeasureItem = MeasureItempop then
  2096.        MenuItem.OnMeasureItem := nil;
  2097.     end;
  2098.   end;
  2099.   procedure ItrateMenu(MenuItem: TMenuItem);
  2100.   var
  2101.     a: integer;
  2102.   begin
  2103.     Activate(MenuItem);
  2104.     for a := 0 to MenuItem.Count - 1 do
  2105.       ItrateMenu(MenuItem.Items[a]);
  2106.   end;
  2107.   procedure ItrateMenupop(MenuItem: TMenuItem);
  2108.   var
  2109.     a: integer;
  2110.   begin
  2111.     Activatepop(MenuItem);
  2112.     for a := 0 to MenuItem.Count - 1 do
  2113.       ItrateMenupop(MenuItem.Items[a]);
  2114.   end;
  2115. begin
  2116.   s:=fform.ClassName;
  2117.   if s='TwwRichEditForm' then exit;
  2118.   for i := 0 to wForm.ComponentCount - 1 do begin
  2119.     Comp := wForm.Components[i];
  2120.     if (Comp is TCustomFrame) then InitPopMenu(Twincontrol(comp),Enable, Update);
  2121.     if (Comp is TCustomForm) then InitPopMenu(Twincontrol(comp),Enable, Update);
  2122.     if (Comp is TPopupMenu) and
  2123.        (xcPopupmenu in fsd.SkinControls) and (comp.Tag <> fsd.disabletag)then
  2124.     begin
  2125.       TPopupMenu(Comp).OwnerDraw := Enable;
  2126.       for x := 0 to TPopupMenu(Comp).Items.Count - 1 do
  2127.       begin
  2128.         Activatepop(TPopupMenu(Comp).Items[x]);
  2129.         ItrateMenupop(TPopupMenu(Comp).Items[x]);
  2130.       end;
  2131.     end;
  2132.   end;
  2133. end;
  2134. procedure TWinSkinForm.InitMainMenu(wForm: TWinControl; Enable, Update: boolean );
  2135. var
  2136.   i, x,j: integer;
  2137.   Comp: TComponent;
  2138.   procedure Activate(MenuItem: TMenuItem);
  2139.   begin
  2140.     if Enable then begin
  2141.         if (j>1) and (not assigned(MenuItem.OnDrawItem)) then begin
  2142.           MenuItem.OnDrawItem := DrawMenuItem;
  2143.           MenuItem.OnMeasureItem := MeasureItem;
  2144.         end;
  2145.     end else begin
  2146.        MenuItem.OnDrawItem := nil;
  2147.        MenuItem.OnMeasureItem := nil;
  2148.     end;
  2149.   end;
  2150.   procedure ItrateMenu(MenuItem: TMenuItem);
  2151.   var
  2152.     a: integer;
  2153.   begin
  2154.     inc(j);
  2155.     Activate(MenuItem);
  2156.     for a := 0 to MenuItem.Count - 1 do
  2157.       ItrateMenu(MenuItem.Items[a]);
  2158.     dec(j);
  2159.   end;
  2160. begin
  2161.   for i := 0 to wForm.ComponentCount - 1 do begin
  2162.     Comp := wForm.Components[i];
  2163.     if (Comp is TMainMenu) then //and (xcmainmenu in FSkinControls)
  2164. //       and ((Comp.Tag mod 100)<> fdisabletag)then
  2165.     begin
  2166.       TMainMenu(Comp).OwnerDraw := Enable;
  2167.       for x := 0 to TMainMenu(Comp).Items.Count - 1 do begin
  2168.         j:=0;
  2169. //        Activate(TMainMenu(Comp).Items[x]);
  2170.         ItrateMenu(TMainMenu(Comp).Items[x]);
  2171.       end;
  2172.     end;
  2173.   end;
  2174. end;
  2175. function TWinSkinForm.FindSkinComp(acomp:Tcontrol):boolean;
  2176. var isskin:integer;
  2177.     aname,name2:string;
  2178.     i:integer;
  2179.     sc:Tskincontrol;
  2180. begin
  2181.    if acomp=nil then exit;
  2182.    result:=true;
  2183. {   if acomp is Twincontrol then
  2184.      isskin:=sendmessage(Twincontrol(acomp).Handle,CN_IsSkined,0,0)
  2185.    else    }
  2186.    isskin:=acomp.Perform(CN_IsSkined,0,0);
  2187.    if isskin=1 then exit;
  2188.    for i:= 0 to controllist.count-1 do begin
  2189.        sc:= Tskincontrol(controllist.items[i]);
  2190.        if sc.control=acomp then begin
  2191.             exit;
  2192.        end;
  2193.    end;
  2194.    result:=false;
  2195. end;
  2196. {function TWinSkinForm.FindSkinComp(acomp:Tcomponent):boolean;
  2197. var i:integer;
  2198.     sc:Tskincontrol;
  2199.     aname,name2:string;
  2200. begin
  2201.    result:=false;
  2202.    aname := fform.Name;
  2203.    name2 := lowercase(aname);
  2204.    for i:= 0 to controllist.count-1 do begin
  2205.       sc:= Tskincontrol(controllist.items[i]);
  2206.       if sc.GControl <> nil then begin
  2207.         if sc.gcontrol=acomp then begin
  2208.           result:=true;
  2209.           break;
  2210.         end;
  2211.       end else if acomp is Twincontrol then begin
  2212.           if Twincontrol(acomp).HandleAllocated then begin
  2213.              if sc.hwnd=Twincontrol(acomp).handle then begin
  2214.                 result:=true;
  2215.                 break;
  2216.              end;
  2217.           end else begin
  2218.             if (pos('preview',name2)>0) or
  2219.                (aname='TQRStandardPreview') or
  2220.                (aname='TppPrintPreview') or
  2221.                (aname='TdxfmStdPreview') then begin
  2222.                result:=true;
  2223.             end;
  2224.             break;
  2225.           end;
  2226.       end;
  2227.    end;
  2228. end;}
  2229. procedure TWinSkinForm.DisableControl(Comp: TControl);
  2230. var s:string;
  2231.     ctrl:Twincontrol;
  2232.     i:integer;
  2233. begin
  2234.    if not(comp is Twincontrol) then exit;
  2235.    ctrl:=Twincontrol(comp);
  2236.    if ctrl.ControlCount=0 then exit;
  2237.    s:=lowercase(comp.ClassName);
  2238.    if (pos('radiogroup',s)=0) and (pos('checkgroup',s)=0) then exit;
  2239.    for i:= 0 to ctrl.controlcount-1 do
  2240.       ctrl.Controls[i].Tag:=fsd.DisableTag;
  2241. end;
  2242. procedure TWinSkinForm.AddComp(Comp: TControl;wForm: TWinControl);
  2243. var
  2244.   i, x,j,tag: integer;
  2245.   subcomp:Twincontrol;
  2246.   subcontrol:Tcontrol;
  2247.   skin:TSkinControl;
  2248.   buf:array[0..100] of char;
  2249.   s,cname:string;
  2250.   b:boolean;
  2251.   chwnd:Thandle;
  2252.   skincomp: TComponent;
  2253.   tag2:integer;
  2254. //  spy:TWinSkinspy;
  2255. begin
  2256.      //tag2:= comp.tag mod 100;
  2257.      if comp.tag=fsd.disabletag then begin
  2258.         DisableControl(comp);
  2259.         exit;
  2260.      end;
  2261.      if comp.Parent=nil then exit;
  2262.      if FindSkinComp(comp) then exit;
  2263.      cname:=Uppercase(comp.ClassName);
  2264. //     skinaddlog(format('Add control %s:%s:%1x',[comp.ClassName,comp.name,integer(comp)]));
  2265.      if (comp is Twincontrol) then begin
  2266.         chwnd:= TACWinControl(comp).WindowHandle;
  2267.         if chwnd=0 then
  2268.           try
  2269.             chwnd:=TACWinControl(comp).handle;
  2270.           except
  2271.             exit;
  2272.           end;
  2273.      end;
  2274.      if Assigned(fsd.OnSkinControl) then begin
  2275.          skincomp:= NIL;
  2276.          fsd.OnSkinControl(self, fsd, wForm, comp, cname, skincomp);
  2277.          if Assigned(skincomp) then begin
  2278.            if (skincomp is TSkinControl) then begin
  2279.              skin:= skincomp as TSkinControl;
  2280.              if skin.newcolor then b:=true
  2281.              else b:=false;
  2282.              if not addcontrollist(skin) then begin
  2283.                skin.init(self,self.fsd,self.fcanvas2,b);
  2284.                if (Comp is TCustomPanel) then
  2285.                 InitChildCtrl(Comp as TWinControl);
  2286.                 //self.InitControlA(Comp as TWinControl);
  2287.              end;
  2288.              ///skin.Inithwnd(TWinControl(Comp).Handle, Self.fsd, self.fcanvas2);
  2289.            end;
  2290.            exit;
  2291.          end;
  2292.      end;
  2293.      if (Find3rdControl(cname,TWinControl(comp))) then exit;
  2294.      if (cname='TDBCOMBOBOXEH') then exit;
  2295. //     if (cname='TQRPREVIEW') then exit;
  2296.      if (cname='TFRDESIGNERPAGE') then exit;
  2297.      if (cname='TFRPBOX') then exit;
  2298.      // not success
  2299.      if (Comp is TCustomTabControl) and (xcTab in Fsd.SkinControls)
  2300.         and (fsd.tab<>nil) then begin
  2301.        if (Comp is TPageControl) then begin
  2302. //           s:=GetStringProp(comp,'Style');
  2303.            if Tpagecontrol(comp).style=tsTabs then begin
  2304.               skin:=TSkinTab.create(comp);
  2305.               skin.Init(self,self.fsd,self.fcanvas2,false);
  2306.            end else begin
  2307.               skin:=TSkinTabBtn.create(comp);
  2308.               skin.Init(self,self.fsd,self.fcanvas2,false);
  2309.            end;
  2310.        end else begin
  2311.           skin:=TSkinTab.create(comp);
  2312.           skin.kind:=2;
  2313.           skin.Init(self,self.fsd,self.fcanvas2,false);
  2314.        end;
  2315.      end
  2316.      else if (Comp is TToolbutton) and sMainMenu then begin
  2317.         if TToolbutton(comp).MenuItem<>nil then
  2318.           inittoolbarmenu(TToolbutton(comp).MenuItem,true);
  2319.      end
  2320.      else if (Comp is TCoolBar) and (xcToolbar in Fsd.SkinControls) then begin
  2321.         for i:= 0 to Tcoolbar(comp).Bands.Count-1 do begin
  2322.               Tcoolbar(comp).Bands[i].Color:=fsd.colors[csButtonFace];
  2323.         end;
  2324.      end
  2325.      else if (cname='TTABSET') and (xcTab in Fsd.SkinControls)
  2326.         and (fsd.tab<>nil) then begin
  2327. //        with TSkinTab31.create(comp) do
  2328. //        init(self,self.fsd,self.fcanvas2);
  2329.           skin:=TSkinTab31.create(comp);
  2330.           skin.init(self,self.fsd,self.fcanvas2);
  2331.      end
  2332.      else if (Comp is TTabSheet) and (xcTab in Fsd.SkinControls)
  2333.         and (fsd.tab<>nil) then begin
  2334.       //    with TSkinBox.create(comp) do
  2335.       //      init(self,self.fsd,self.fcanvas2,true);
  2336.           skin:=TSkinTabSheet.create(comp);
  2337.           skin.init(self,self.fsd,self.fcanvas2,false);
  2338.      end
  2339.      else if (cname='TTABBEDNOTEBOOK') and (xcTab in Fsd.SkinControls)
  2340.         and (fsd.tab<>nil) then begin
  2341.           skin:=TSkinTab.create(comp);
  2342.           skin.Init(self,self.fsd,self.fcanvas2,false);
  2343. //          TSkinTab(skin).inithwnd(TWinControl(Comp).handle,self.fsd,self.fcanvas2,self);
  2344.      end
  2345.      else if (cname='TMVCPANEL') then
  2346.        InitChildCtrl(Comp as TWinControl)
  2347.      else if ((Comp is TPageControl) and (xcTab in Fsd.SkinControls))
  2348.             and (fsd.tab<>nil) then begin
  2349.        s:=GetStringProp(comp,'Style');
  2350.        if s='tsTabs' then begin
  2351.           skin:=TSkinTab.create(self);
  2352.           skin.Init(self,self.fsd,self.fcanvas2,false);
  2353. //          TSkinTab(skin).inithwnd(TWinControl(Comp).handle,self.fsd,self.fcanvas2,self);
  2354.        end else begin
  2355.           skin:=TSkinTabBtn.create(self);
  2356.           skin.Init(self,self.fsd,self.fcanvas2,false);
  2357.        end;
  2358.      end
  2359.      else if (comp is THeaderControl) and  (xcPanel in Fsd.SkinControls) then begin
  2360.        with TSkinHeader.create(comp) do
  2361.         init(self,self.fsd,self.fcanvas2,false);
  2362.      end
  2363.      else if ((Comp is TCustomCheckBox) and
  2364.           (xcCheckBox in Fsd.SkinControls)) then begin
  2365.        with TSkinCheckBox.create(comp) do
  2366.         init(self,self.fsd,self.fcanvas2,false);
  2367.      end
  2368.      else if ((comp is Ttrackbar) and
  2369.           (xctrackbar in Fsd.SkinControls)) then begin
  2370.        with TSkinTrackBar.create(comp) do
  2371.         init(self,self.fsd,self.fcanvas2);
  2372.      end
  2373.      else if (((cname='TUPDOWN') or (cname='TSPINBUTTON')) and
  2374.           (xcSpin in Fsd.SkinControls)) then begin
  2375.        with TSkinUpDown.create(comp) do
  2376.         init(self,self.fsd,self.fcanvas2);
  2377.      end
  2378.      else if ((cname='TMEDIAPLAYER') and (xcButton in Fsd.SkinControls)) then begin
  2379.        with TSkinMP.create(comp) do begin
  2380.           init(self,self.fsd,self.fcanvas2);
  2381.        end;
  2382.      end
  2383.      else if ((Comp is TCustomRadiogroup))
  2384.        and (xcRadioButton in Fsd.SkinControls) then begin
  2385.        for j:= 0 to TWincontrol(comp).ControlCount-1 do begin
  2386.          subcomp:=Twincontrol(Twincontrol(comp).Controls[j]);
  2387.          //TAccontrol(subcomp).ParentColor := false;
  2388.          with TSkinRadioButton.create(subcomp) do
  2389.          init(self,self.fsd,self.fcanvas2,false);
  2390.        end;
  2391.        with TSkinGroupBox.create(comp) do
  2392. //       with TSkinBox.create(comp) do
  2393.        init(self,self.fsd,self.fcanvas2,true);
  2394.      end
  2395.      else if (cname='TDBNAVIGATOR') and (xcPanel in Fsd.SkinControls) then begin
  2396.          //setproperty(Comp,'Flat','True');
  2397.         with TSkinBox.create(comp) do
  2398.            init(self,self.fsd,self.fcanvas2,true);
  2399.         for i := 0 to Twincontrol(comp).ControlCount-1 do begin
  2400.           subcontrol:= Twincontrol(comp).Controls[i];
  2401.           if subcontrol is Tcontrol then
  2402.             addcomp(subcontrol,nil);
  2403.         end;
  2404.      end
  2405.      else if ((cname='TRZDBCHECKBOX') or (cname='TRZCHECKBOX')) and
  2406.           (xccheckbox in Fsd.SkinControls) then begin
  2407.          with TSkinObjimage.create(comp) do begin
  2408.             kind:=1;
  2409.             init(self,self.fsd,self.fcanvas2,true);
  2410.          end;
  2411.      end
  2412.      else if ((cname='TRZRADIOBUTTON') or (cname='TRZDBRADIOBUTTON')) and
  2413.           (xcradiobutton in Fsd.SkinControls) then begin
  2414.          with TSkinObjimage.create(comp) do begin
  2415.             kind:=2;
  2416.             init(self,self.fsd,self.fcanvas2,true);
  2417.          end;
  2418.      end
  2419.      else if ((cname='TCXDBCHECKBOX') or (cname='TCXCHECKBOX')) and
  2420.           (xccheckbox in Fsd.SkinControls) then begin
  2421.          with TSkinObjimage.create(comp) do begin
  2422.             kind:=3;
  2423.             init(self,self.fsd,self.fcanvas2,true);
  2424.          end;
  2425.      end
  2426.      else if ((Comp is TcustomGroupbox))
  2427.        and (xcPanel in Fsd.SkinControls) then begin
  2428.        self.InitChildCtrl(Comp as TWinControl);
  2429.        with TSkinGroupbox.create(comp) do
  2430. //       with TSkinbox.create(comp) do
  2431.          init(self,self.fsd,self.fcanvas2,false);
  2432.      end
  2433.      else if ((Comp is TRadioButton))
  2434.         and (xcRadioButton in Fsd.SkinControls) then begin
  2435.        with TSkinRadioButton.create(comp) do  begin
  2436.         init(self,self.fsd,self.fcanvas2,false);
  2437.        end;
  2438.      end
  2439.      {else if (comp is TLabel) then begin
  2440.          setproperty(Comp,'Transparent','True');
  2441.      end}
  2442.      else if (Comp is TToolbar) and (xcToolbar in Fsd.SkinControls) then begin
  2443.          setproperty(Comp,'Flat','True');
  2444. //         setproperty(Comp,'Transparent','True');
  2445.          if (xcToolbar in Fsd.SkinControls) then begin
  2446.             if not assigned(Ttoolbar(comp).OnCustomDrawButton) then
  2447.                Ttoolbar(comp).OnCustomDrawButton:=ToolBarDrawButton;
  2448.             if not assigned(Ttoolbar(comp).OnCustomDraw) then
  2449.                Ttoolbar(comp).OnCustomDraw:=ToolBarDrawBackground;
  2450.             with TSkinbox.create(comp) do
  2451. //            with TSkinToolbar.create(comp) do
  2452.             init(self,self.fsd,self.fcanvas2,false);
  2453.   {$ifndef COMPILER_5}
  2454.             if Ttoolbar(comp).Menu<>nil then
  2455.               for j:=0 to Ttoolbar(comp).Menu.Items.count-1 do
  2456.                 inittoolbarmenu(TToolbar(comp).Menu.items[j],true);
  2457.   {$endif}
  2458.          end;
  2459.      end
  2460.   {$ifndef COMPILER_5}
  2461.      else if ((Comp is TCustomStatusBar) and
  2462.           (xcStatusBar in Fsd.SkinControls)) then begin
  2463.   {$else}
  2464.      else if ((Comp is TStatusBar) and
  2465.           (xcStatusBar in Fsd.SkinControls)) then begin
  2466.   {$endif}
  2467.        //Tstatusbar(comp).sizegrip:=false;
  2468.        with TSkinStatusBar.create(comp) do  begin
  2469.         init(self,self.fsd,self.fcanvas2,false);
  2470.        end;
  2471.      end
  2472.      else if ((Comp is TProgressBar) and
  2473.           (xcProgress in Fsd.SkinControls)) then begin
  2474.        with TSkinProgress.create(comp) do
  2475.         init(self,self.fsd,self.fcanvas2);
  2476.      end
  2477.      else if ((Comp is TScrollbar) and (xcScrollbar in Fsd.SkinControls)) then begin
  2478.        with TSkinScControl.create(comp) do
  2479.         initScrollbar(TWinControl(Comp),self.fsd,self.fcanvas2,self);
  2480.      end
  2481.      else if (cname='TTNTCOMBOBOX') and (xcCombo in Fsd.SkinControls) then begin
  2482.        with TSkinCombox.create(comp) do
  2483.         init(self,self.fsd,self.fcanvas2);
  2484. //        skin:=TSkinCombox.create(comp);
  2485. //        skin.inithwnd(TWinControl(Comp).handle,self.fsd,fcanvas2,self);
  2486.      end
  2487.      else if (comp is TCustomComboBox) and (xcCombo in Fsd.SkinControls) then begin
  2488.        with TSkinCombox.create(comp) do
  2489.         init(self,self.fsd,self.fcanvas2);
  2490.      end
  2491.      else if (comp is TDateTimePicker) and
  2492.           (xcedit in Fsd.SkinControls) then begin
  2493.         if (TDateTimePicker(comp).DateMode = dmUpDown) or
  2494.            (TDateTimePicker(comp).kind = dtkTime) then begin
  2495.             with TSkinEdit.create(comp) do
  2496.             init(self,self.fsd,self.fcanvas2);
  2497.         end else begin
  2498. //            with TSkinCombox.create(comp) do
  2499.             with TSkinDateTime.create(comp) do
  2500.             init(self,self.fsd,self.fcanvas2);
  2501.         end;
  2502.      end
  2503.      else if (xcScrollBar in Fsd.SkinControls) AND
  2504.         ((cname='TRICHEDIT')) then begin
  2505.        with TSkinScrollBar.create(comp) do
  2506.         initScrollbar(TWinControl(Comp),self.fsd,self.fcanvas2,self);
  2507.      end
  2508.      else if (xcScrollBar in Fsd.SkinControls) AND
  2509.         ((cname='TWWDBRICHEDIT') or (cname='TDXDBMEMO')) then begin
  2510.        with TSkinScrollBar.create(comp) do
  2511.         initScrollbar(TWinControl(Comp),self.fsd,self.fcanvas2,self);
  2512.      end
  2513.      else if (Comp is Tbitbtn) then begin
  2514.        if  (xcbitbtn in Fsd.SkinControls) then begin
  2515.           with TSkinBitButton.create(comp) do
  2516.           init(self,self.fsd,self.fcanvas2);
  2517.        end else exit;
  2518.      end
  2519.      else if ((Comp is Tspeedbutton) and
  2520.           (xcSpeedButton in Fsd.SkinControls)) then begin
  2521.        with TSkinSpeedButton.create(comp) do
  2522.         InitGraphicControl(self,self.fsd,self.fcanvas2);
  2523.      end
  2524.      else if ((Comp is TCustomPanel))
  2525.        and (xcPanel in Fsd.SkinControls) then begin
  2526.        InitChildCtrl(Comp as TWinControl);
  2527.        with TSkinBox.create(comp) do
  2528.          init(self,self.fsd,self.fcanvas2,true);
  2529.      end
  2530.      else if ((cname='TDXTREELIST') or (cname='TDXDBTREELIST') or
  2531.          (cname='TDXDBGRID')) and (xcScrollBar in Fsd.SkinControls) then begin
  2532.        with TSkinScrollBar.create(comp) do
  2533.         initScrollbar(TWinControl(Comp),self.fsd,self.fcanvas2,self);
  2534.      end
  2535.      else if (Comp is TCustomListView)
  2536.          and (xcScrollBar in Fsd.SkinControls) then begin
  2537.        with TSkinlistview.create(comp) do
  2538.         initScrollbar(TWinControl(Comp),self.fsd,self.fcanvas2,self);
  2539.      end
  2540.      else if (xcScrollBar in Fsd.SkinControls)
  2541.          and (Comp is TCustomMemo) then begin
  2542.        with TSkinScrollBar.create(comp) do
  2543.         initScrollbar(TWinControl(Comp),self.fsd,self.fcanvas2,self);
  2544.      end
  2545.      else if (xcScrollBar in Fsd.SkinControls)
  2546.          and (Comp is TCustomgrid) then begin
  2547.        with TSkinScrollBar.create(comp) do
  2548.         initScrollbar(TWinControl(Comp),self.fsd,self.fcanvas2,self);
  2549.      end
  2550.      else if (xcScrollBar in Fsd.SkinControls)
  2551.          and ( isscrollcontrol(Comp)) then begin
  2552.        with TSkinScrollBar.create(comp) do
  2553.         initScrollbar(TWinControl(Comp),self.fsd,self.fcanvas2,self);
  2554.      end
  2555.      else if ((Comp is TButton) and (xcButton in Fsd.SkinControls)) then begin
  2556.        with TSkinButton.create(comp) do
  2557.         init(self,self.fsd,self.fcanvas2);
  2558.      end
  2559.      else if ((Comp is TCustomEdit)) and
  2560.           (xcedit in Fsd.SkinControls) then begin
  2561.         skin:=TSkinEdit.create(comp);
  2562.         skin.init(self,self.fsd,self.fcanvas2,false);
  2563.      end
  2564.      else if (cname='TDCEDIT') or (cname='TDCDBEDIT') then begin
  2565.          i:= GetIntProperty(comp,'NumButtons');
  2566.          if i=1 then begin
  2567.             if (xcCombo in Fsd.SkinControls) then begin
  2568.                 with TSkinCombox.create(comp) do
  2569.                 init(self,self.fsd,self.fcanvas2);
  2570.             end
  2571.          end else if i=0 then begin
  2572.            if (xcedit in Fsd.SkinControls) then begin
  2573.              skin:=TSkinEdit.create(comp);
  2574.              skin.inithwnd(TWinControl(Comp).handle,self.fsd,fcanvas2,self);
  2575.            end;
  2576.          end;
  2577.      end
  2578.      else if (Comp is TCustomFrame) then
  2579.        self.InitControlA(Comp as TWinControl)
  2580. //       InitChildCtrl(Comp as TWinControl)
  2581.      else if (Comp is TCustomform) then begin
  2582.       with TSkinBox.create(comp) do
  2583.          init(self,self.fsd,self.fcanvas2,true);
  2584.       self.InitControlA(Comp as TWinControl);
  2585.      end;
  2586. end;
  2587. {procedure TWinSkinForm.InitControls(wForm: TWinControl);
  2588. var
  2589.   i, x,j,tag: integer;
  2590.   Comp: TComponent;
  2591. begin
  2592.   DeleteSkinDeleted;
  2593.   for i := 0 to wForm.ComponentCount - 1 do begin
  2594.      Comp := wForm.Components[i];
  2595.      if comp is Tcontrol then
  2596.          addcomp(Tcontrol(comp),wform);
  2597.   end;
  2598. end;}
  2599. procedure TWinSkinForm.InitControlA(wForm: TWinControl);
  2600. var
  2601.   i: integer;
  2602.   Comp: TComponent;
  2603. begin
  2604.   for i := 0 to wForm.ComponentCount - 1 do begin
  2605.      Comp := wForm.Components[i];
  2606.      if comp is Tcontrol then
  2607.        addcomp(Tcontrol(comp),wform);
  2608.   end;
  2609.   if (xcPopupmenu in fsd.SkinControls) then
  2610.        InitPopMenu(wform,true,true);
  2611. end;
  2612. procedure TWinSkinForm.InitChildCtrl(wForm: TWinControl);
  2613. var
  2614.   i: integer;
  2615.   Ctrl: TControl;
  2616. begin
  2617.   for i := 0 to wForm.controlCount - 1 do begin
  2618.      Ctrl := wForm.controls[i];
  2619.      addcomp(ctrl,wform);
  2620.   end;
  2621. end;
  2622. procedure TWinSkinForm.InitControls(wForm: TWinControl);
  2623. var
  2624.   i,n: integer;
  2625.   Ctrl: TWinControl;
  2626.   Comp: TComponent;
  2627.   list:Tlist;
  2628.   s:string;
  2629. begin
  2630.   DeleteSkinDeleted;
  2631. {  if xoNoPreview in fsd.Options then begin
  2632.       s := lowercase(fform.Name);
  2633.       if (pos('preview',s)>0) then exit;
  2634.   end;  }
  2635.   InitControlA(wform);
  2636.   list:=Tlist.create;
  2637.   wform.GetTabOrderList(list);
  2638.   for i := 0 to list.Count - 1 do begin
  2639.      ctrl := list[i];
  2640.      if not FindSkinComp2(ctrl) then
  2641.         addcomp(ctrl,wform);
  2642.   end;
  2643.   list.Free;
  2644. end;
  2645. function TWinSkinForm.FindSkinComp2(ctrl:Twincontrol):boolean;
  2646. var isskin:integer;
  2647.     i:integer;
  2648.     sc:Tskincontrol;
  2649. begin
  2650.    result:=true;
  2651. {$ifdef CPPB_5}
  2652.    exit;
  2653. {$endif}
  2654. {$ifdef CPPB_6}
  2655.    exit;
  2656. {$endif}
  2657. //   if ctrl=nil then exit;
  2658. //   ctrl.HandleNeeded;
  2659.    if not ctrl.HandleAllocated then exit;
  2660.    if ctrl.Tag=fsd.DisableTag then exit;
  2661.    isskin:= sendmessage(ctrl.Handle,CN_IsSkined,0,0);
  2662.    if isskin=1 then exit;
  2663.    for i:= 0 to controllist.count-1 do begin
  2664.            sc:= Tskincontrol(controllist.items[i]);
  2665.            if sc.hwnd=ctrl.handle then begin
  2666.                result:=true;
  2667.                break;
  2668.            end;
  2669.     end;
  2670.     result:=false;
  2671. end;
  2672. procedure TWinSkinForm.InitNestform(wForm: Twincontrol);
  2673. var
  2674.   i, x,j,tag: integer;
  2675.   Comp: TComponent;
  2676. begin
  2677.   DeleteSkinDeleted;
  2678.   with TSkinBox.create(wform) do
  2679.          init(self,self.fsd,self.fcanvas2,true);
  2680.   for i := 0 to wForm.ComponentCount - 1 do begin
  2681.      Comp := wForm.Components[i];
  2682.      if comp is Tcontrol then
  2683.        addcomp(Tcontrol(comp),wform);
  2684.   end;
  2685.   InitPopMenu(wForm,true,true);
  2686. end;
  2687. procedure TWinSkinForm.DoSkinEdit(aEdit: Twincontrol);
  2688. var r1,r2:Trect;
  2689.     skin:TSkinControl;
  2690. begin
  2691.    getwindowrect(aedit.handle,r1);
  2692.    offsetrect(r1,-r1.left,-r1.Top);
  2693.    getClientrect(aedit.handle,r2);
  2694.    offsetrect(r2,-r2.left,-r2.Top);
  2695.    if (r1.Right=r2.Right) and (r1.bottom=r2.Bottom) then exit;
  2696.    skin:=TSkinEdit.create(aEdit);
  2697.    skin.init(self,self.fsd,self.fcanvas2);
  2698. end;
  2699. function TWinSkinForm.Find3rdControl(aname:string;comp:Twincontrol):boolean;
  2700. var i,p:integer;
  2701.     s,s1,s2,s3:string;
  2702.     subcomp:Twincontrol;
  2703.     subcontrol:Tcontrol;
  2704.     skin:TSkinControl;
  2705. begin
  2706.     s1:=lowercase(aname)+'=';
  2707.     s2:='';
  2708.     for i:= 0 to fsd.skin3rd.count-1 do begin
  2709.        s:=lowercase(fsd.Skin3rd[i]);
  2710.        if (pos(s1,s)=1) then begin
  2711.           p:=pos('=',s);
  2712.           s2:=copy(s,p+1,50);
  2713.           break;
  2714.        end;
  2715.     end;
  2716.     result:=false;
  2717.     if s2='' then exit;
  2718.     result:=true;
  2719.     if (s2='nil') then begin
  2720.         result:=true;
  2721.     end
  2722.     else if (s2='combobox') and (xcCombo in Fsd.SkinControls) then begin
  2723.        with TSkinCombox.create(comp) do
  2724.         init(self,self.fsd,self.fcanvas2);
  2725.     end
  2726.     else if (s2='comboboxex') and (xcCombo in Fsd.SkinControls) then begin
  2727.        with TSkinCombox.create(comp) do begin
  2728.         init(self,self.fsd,self.fcanvas2);
  2729.         hasbutton:=true;
  2730.        end;
  2731.     end
  2732.     else if (s2='edit') and (xcedit in Fsd.SkinControls) then begin
  2733.         DoSkinEdit(comp);
  2734. //        skin:=TSkinEdit.create(comp);
  2735. //        skin.init(self,self.fsd,self.fcanvas2);
  2736. //        skin.inithwnd(TWinControl(Comp).handle,self.fsd,fcanvas2,self);
  2737.     end
  2738.     else if (s2='radiobutton') and (xcRadioButton in Fsd.SkinControls) then begin
  2739.        with TSkinRadioButton.create(comp) do  begin
  2740.         init(self,self.fsd,self.fcanvas2,false);
  2741.        end;
  2742.     end
  2743.     else if (s2='panel') and (xcpanel in Fsd.SkinControls) then begin
  2744.        setproperty(Comp,'Transparent','True');
  2745.        with TSkinBox.create(comp) do
  2746.          init(self,self.fsd,self.fcanvas2,true);
  2747.     end
  2748.     else if ((s2='trackbar') and (xcbutton in Fsd.SkinControls)) then begin
  2749.        setproperty(Comp,'Transparent','True');
  2750.        with TSkinTrackBar.create(comp) do
  2751.         init(self,self.fsd,self.fcanvas2);
  2752.     end
  2753.      else if ((s2='button') and (xcButton in Fsd.SkinControls)) then begin
  2754.        with TSkinButton.create(comp) do begin
  2755.           init(self,self.fsd,self.fcanvas2);
  2756.        end;
  2757.      end
  2758.      else if ((s2='datetimepicker') and (xcCombo in Fsd.SkinControls)) then begin
  2759.        with TSkinDateTime.create(comp) do begin
  2760.           init(self,self.fsd,self.fcanvas2);
  2761.        end;
  2762.      end
  2763.      else if ((s2='mediaplayer') and (xcButton in Fsd.SkinControls)) then begin
  2764.        with TSkinMP.create(comp) do begin
  2765.           init(self,self.fsd,self.fcanvas2);
  2766.        end;
  2767.      end
  2768.      else if ((s2='bitbtn') and (xcButton in Fsd.SkinControls)) then begin
  2769.        if s1='tcxbutton=' then begin
  2770.           s3:= GetEnumProperty(comp,'Kind');
  2771.           if s3='cxbkDropDownButton' then begin
  2772.              with TSkinMenuButton.create(comp) do begin
  2773.                init(self,self.fsd,self.fcanvas2);
  2774.              end;
  2775.              result:=true;
  2776.              exit;
  2777.           end;
  2778.        end;
  2779.        with TSkinbitButton.create(comp) do begin
  2780.           init(self,self.fsd,self.fcanvas2);
  2781.        end;
  2782.      end
  2783.      else if ((s2='pngbitbtn') and (xcButton in Fsd.SkinControls)) then begin
  2784.        with TSkinbitButton.create(comp) do begin
  2785.           PicField:='PngImage';
  2786.           init(self,self.fsd,self.fcanvas2);
  2787.        end;
  2788.      end
  2789.      else if ((s2='pngspeedbutton') and (xcButton in Fsd.SkinControls)) then begin
  2790.        with TSkinSpeedButton.create(comp) do begin
  2791.           PicField:='PngImage';
  2792.           InitGraphicControl(self,self.fsd,self.fcanvas2);
  2793.        end;
  2794.      end
  2795.      else if ((s2='menubtn') and (xcButton in Fsd.SkinControls)) then begin
  2796.        with TSkinMenuButton.create(comp) do begin
  2797.           init(self,self.fsd,self.fcanvas2);
  2798.        end;
  2799.      end
  2800.      else if ((s2='speedbutton') and (xcSpeedButton in Fsd.SkinControls)) then begin
  2801.        with TSkinSpeedButton.create(comp) do
  2802.         InitGraphicControl(self,self.fsd,self.fcanvas2);
  2803.      end
  2804.     else if (s2='tab') and (xcTab in Fsd.SkinControls)
  2805.         and (fsd.tab<>nil) then begin
  2806.           skin:=TSkinTab.create(comp);
  2807.           skin.init(self,self.fsd,self.fcanvas2,false);
  2808. //          TSkinTab(skin).inithwnd(TWinControl(Comp).handle,self.fsd,self.fcanvas2,self);
  2809.     end
  2810.     else if (s2='progress') and (xcprogress in Fsd.SkinControls) then begin
  2811.        with TSkinProgress.create(comp) do
  2812.         init(self,self.fsd,self.fcanvas2);
  2813.     end
  2814.     else if (s2='scrollbar') and (xcScrollBar in Fsd.SkinControls) then begin
  2815.        with TSkinScrollBar.create(comp) do
  2816.         initScrollbar(TWinControl(Comp),self.fsd,self.fcanvas2,self);
  2817.       InitChildCtrl(Comp as TWinControl);
  2818.       //InitControlA(Comp as TWinControl);
  2819.     end
  2820.     else if (s2='singlescrollbar') and (xcScrollBar in Fsd.SkinControls) then begin
  2821.        with TSkinScrollBar.create(comp) do begin
  2822.         kind:=1;
  2823.         initScrollbar(TWinControl(Comp),self.fsd,self.fcanvas2,self);
  2824.        end;
  2825.     end
  2826.     else if (s2='embedscrollbar') and (xcScrollBar in Fsd.SkinControls) then begin
  2827.         for i := 0 to TWincontrol(comp).ControlCount-1 do begin
  2828.           subcomp:=Twincontrol(Twincontrol(comp).Controls[i]);
  2829.           if subcomp is TScrollbar then begin
  2830.              with TSkinScControl.create(subcomp) do
  2831.                initScrollbar(TWinControl(subComp),self.fsd,self.fcanvas2,self);
  2832.           end else if isscrollcontrol(subComp) then begin
  2833.              with TSkinScrollBar.create(subcomp) do
  2834.               initScrollbar(TWinControl(subComp),self.fsd,self.fcanvas2,self);
  2835.           end;
  2836.         end;
  2837.     end
  2838.     else if (s2='container') then begin
  2839.         InitChildCtrl(Comp as TWinControl);
  2840. {        for i := 0 to TWincontrol(comp).ControlCount-1 do begin
  2841.           subcontrol:=Twincontrol(comp).Controls[i];
  2842.           if subcontrol is Tcontrol then
  2843.             addcomp(subcontrol,nil);
  2844.           //if subcomp is Twincontrol then
  2845.           //  Find3rdControl(subcomp.classname,subcomp);
  2846.         end; }
  2847.     end
  2848.     else if (s2='groupbox') and (xcgroupbox in Fsd.SkinControls) then begin
  2849.        with TSkinGroupBox.create(comp) do
  2850.        init(self,self.fsd,self.fcanvas2,true);
  2851.     end
  2852.     else if ((s2='advpagecontrol') ) and (xctab in Fsd.SkinControls) then begin
  2853.          with TSkinAdvPage.create(comp) do begin
  2854.             kind:=4;
  2855.             init(self,self.fsd,self.fcanvas2,true);
  2856.          end;
  2857.     end
  2858.     else if (s2='radiogroup') and (xcgroupbox in Fsd.SkinControls) then begin
  2859.        if (xcradiobutton in Fsd.SkinControls) then begin
  2860.           for i:= 0 to TWincontrol(comp).ControlCount-1 do begin
  2861.             subcomp:=Twincontrol(Twincontrol(comp).Controls[i]);
  2862.             if pos('TRZ',aname)=0 then begin
  2863.                with TSkinRadioButton.create(subcomp) do
  2864.                    init(self,self.fsd,self.fcanvas2,false);
  2865.             end else begin
  2866.                with TSkinObjimage.create(subcomp) do begin
  2867.                    kind:=2;
  2868.                    init(self,self.fsd,self.fcanvas2,true);
  2869.                end;
  2870.             end;
  2871.           end;
  2872.        end;
  2873.        if (xcgroupbox in Fsd.SkinControls) then
  2874.        with TSkinGroupBox.create(comp) do
  2875.        init(self,self.fsd,self.fcanvas2,true);
  2876.     end
  2877.     else if (s2='checkgroup') and (xcpanel in Fsd.SkinControls) then begin
  2878.        if (xcradiobutton in Fsd.SkinControls) then begin
  2879.           for i:= 0 to TWincontrol(comp).ControlCount-1 do begin
  2880.             subcomp:=Twincontrol(Twincontrol(comp).Controls[i]);
  2881. //            addcomp(subcomp,fform);
  2882.             //TAccontrol(subcomp).ParentColor := false;
  2883.             if pos('TRZ',aname)=0 then begin
  2884.               with TSkinCheckbox.create(subcomp) do
  2885.                  init(self,self.fsd,self.fcanvas2,false);
  2886.             end else begin
  2887.                with TSkinObjimage.create(subcomp) do begin
  2888.                    kind:=1;
  2889.                    init(self,self.fsd,self.fcanvas2,true);
  2890.                end;
  2891.             end;
  2892.           end;
  2893.        end;
  2894.        if (xcgroupbox in Fsd.SkinControls) then
  2895.        with TSkinGroupBox.create(comp) do
  2896. //       with TSkinBox.create(comp) do
  2897.        init(self,self.fsd,self.fcanvas2,true);
  2898.     end
  2899.     else if (s2='checkbox') AND (xcCheckBox in Fsd.SkinControls) then begin
  2900.        with TSkinCheckBox.create(comp) do
  2901.         init(self,self.fsd,self.fcanvas2,false);
  2902.     end
  2903.     else exit;
  2904.     result:=true;
  2905. end;
  2906. procedure TWinSkinForm.InitHwndControls(ahwnd:Thandle);
  2907. var hctrl : Thandle;
  2908. begin
  2909.    hCtrl := GetTopWindow( ahWnd );
  2910.    while ( hCtrl<>0 ) do begin
  2911.       if (GetWindowLong(hCtrl, GWL_STYLE ) and WS_CHILD)>0 then begin
  2912.             AddControlh( hCtrl);
  2913.             //if (aname='#32770') then InitHwndControls(hctrl);
  2914.       end;
  2915.       hCtrl := GetNextWindow( hCtrl, GW_HWNDNEXT );
  2916.    end;
  2917. //   EnumChildWindows(hwnd, @enumcontrol, integer(self));
  2918. end;
  2919. function TWinSkinForm.Lookupcontrol(ahwnd:Thandle):Tskincontrol;
  2920. var c:Tskincontrol;
  2921.     i: integer;
  2922. begin
  2923.    result:=nil;
  2924.    for i:= 0 to controllist.count-1 do begin
  2925.       c:=Tskincontrol(controllist[i]);
  2926.       if c.hwnd=ahwnd then begin
  2927.         result:=c;
  2928.         break;
  2929.       end;
  2930.    end;
  2931. end;
  2932. function EnumControl(ahwnd :HWND;lParam: LPARAM):boolean;stdcall;
  2933. var s:string;
  2934.     sf:Twinskinform;
  2935. begin
  2936.    result:=false;
  2937.    sf:= TWinskinform(lparam);
  2938. //   if (GetParent(ahwnd)= lparam) then begin
  2939.    sf.AddControlh( ahwnd);
  2940.    s:=getwindowclassname(ahwnd);
  2941. //   skinaddlog(format('***enumchild %1x,%s',[ahwnd,s]));
  2942.    result:=true;
  2943. //   end;
  2944. end;
  2945. procedure TWinSkinForm.AddControlh(ahwnd :HWND);
  2946. var Style,dwExStyle:dword;
  2947.     c:Tskincontrol;
  2948.     szBuf: array [0..MAX_CLASSNAME] of char;
  2949.     aname:string;
  2950.     control:TACwincontrol;
  2951. begin
  2952.    c:= Lookupcontrol( ahWnd );
  2953.    if ( ahWnd=0 ) or (c<>nil) then exit;
  2954.    GetClassName( ahwnd, szBuf, MAX_CLASSNAME );
  2955.    aname:=szbuf;
  2956. //   skinaddlog(aname);
  2957.    aname:=lowercase(aname);
  2958.    Style := GetWindowLong( ahWnd, GWL_STYLE );
  2959.    dwExStyle := GetWindowLong( ahWnd, GWL_EXSTYLE );
  2960.    if (aname='button') and ((style and bs_ownerdraw)<>bs_ownerdraw) then begin
  2961.      if ((style and bs_groupbox)=bs_groupbox)
  2962.         or ((style and bs_bitmap)=bs_bitmap) then
  2963.               c:=nil
  2964.      else
  2965.      if ((Style and BS_AUTOCHECKBOX )=BS_AUTOCHECKBOX)
  2966.          or ((Style and BS_CHECKBOX )=BS_CHECKBOX)
  2967.          or ((Style and BS_3STATE )=BS_3STATE) then begin
  2968. //               c:=nil
  2969.           if (xcCheckbox in Fsd.SkinControls) then
  2970.              c := Tskincheckbox.create(Self)
  2971.       end else if ((Style and BS_AUTORADIOBUTTON)=BS_AUTORADIOBUTTON)
  2972.              or ((Style and BS_RADIOBUTTON)=BS_RADIOBUTTON) then begin
  2973.           if (xcRadioButton in Fsd.SkinControls) then
  2974.              c := Tskinradiobutton.create(Self);
  2975.       end else if (xcButton in Fsd.SkinControls) then
  2976.              c :=  Tskinbutton.create(Self);
  2977.    end
  2978.    else if (aname='combobox') and (xcCombo in Fsd.SkinControls) then begin
  2979.        if ((Style and $03)<>CBS_SIMPLE) then
  2980.         c := TSkinCombox.create(Self) ;
  2981.    end
  2982.    else if (aname='comboboxex32') and (xcCombo in Fsd.SkinControls) then begin
  2983.         ahwnd := GetTopWindow( ahWnd );
  2984.         if ahwnd<>0 then
  2985.         c := TSkinCombox.create(Self) ;
  2986.    end
  2987.    else if (aname='scrollbar') and ((Style and WS_TabStop) =0) then begin
  2988. //        c := TSkinboxh.create(Self) ;
  2989.         c := TSkinSizer.create(Self) ;
  2990.    end
  2991.    else if (aname='systreeview32') then begin
  2992.         //syslistview32
  2993. //        c := TSkinScrollbarH.create(Self) ;
  2994.    end
  2995.    else if (aname='#32770') and ((Style and WS_TabStop) =0) then begin
  2996.         inithwndcontrols(ahwnd);
  2997.         c := TSkinboxh.create(Self) ;
  2998.    end
  2999.    else if (aname='tpanel') or ( aname='ttntpanel.unicodeclass')
  3000.         or (aname='ttntsilentpaintpanel.unicodeclass') then begin
  3001.         inithwndcontrols(ahwnd);
  3002.         control := TACWincontrol(FindControlx(ahwnd));
  3003.         if control<>nil then
  3004.           control.color := fsd.colors[csButtonFace];
  3005.    end
  3006.    else if (aname='tcheckbox') and (xcCheckbox in Fsd.SkinControls)  then begin
  3007.          c := Tskincheckbox.create(Self);
  3008.    end
  3009.    else if (aname='tcombobox') and (xcCombo in Fsd.SkinControls) then begin
  3010.          c := TSkinCombox.create(Self);
  3011.    end
  3012.    else if (aname='tbutton') and (xcButton in Fsd.SkinControls) then begin
  3013.          c := Tskinbutton.create(Self);
  3014.    end
  3015.    else if (aname='tprogressbar') then begin
  3016.          c := TSkinProgress.create(Self);
  3017.    end
  3018.    else if (aname='tsilentpaintpanel') then begin
  3019.         control := TACWincontrol(FindControlx(ahwnd));
  3020.         if control<>nil then
  3021.           control.color := fsd.colors[csButtonFace];
  3022.    end
  3023.    else if (aname='systabcontrol32') and (xcTab in Fsd.SkinControls)
  3024.       and ((Style and TCS_OWNERDRAWFIXED)<>TCS_OWNERDRAWFIXED) then begin
  3025.         c := TSkinTab.create(Self) ;
  3026.    end
  3027.    else if (aname='toolbarwindow32') then begin
  3028.         c := TSkinboxh.create(Self) ;
  3029.    end
  3030.    else if (aname='edit') and (xcEdit in Fsd.SkinControls) then begin
  3031.         c := TSkinedit.create(Self) ;
  3032.    end;
  3033.    if c<>nil then begin
  3034.      c.inithwnd(ahwnd,fsd,fcanvas2,self);
  3035. //     controllist.add(c);
  3036. //     skinaddlog(format('***add control %1x,%s',[ahwnd,aname]));
  3037.    end;
  3038. end;
  3039. procedure TWinSkinForm.Refresh;
  3040. begin
  3041.   SetWindowPos(hwnd, 0, 0, 0, 0, 0,
  3042.     SWP_DRAWFRAME or SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER);
  3043. end;
  3044. procedure TWinSkinForm.InitSkinData;
  3045. var i,cw:integer;
  3046. begin
  3047.    if fsd.empty then exit;
  3048. //   GetClientRect(hwnd,fClientRect);
  3049.    if (formborder <> sbsnone) then begin
  3050.       bw.top:=fsd.border[3].map.height div fsd.border[3].frame;
  3051.       bw.left:=fsd.border[1].map.width div fsd.border[1].frame;
  3052.       bw.right:=fsd.border[2].map.width div fsd.border[2].frame;
  3053.       bw.bottom:=fsd.border[4].map.height div fsd.border[4].frame;
  3054.    end else begin
  3055.       bw:= rect(0,0,0,0);
  3056. //      bw:= rect(2,2,2,2);
  3057.       MenuHeight := 0;
  3058.    end;
  3059. {   if (menu=nil) then begin
  3060.      cw:= GetSystemMetrics(SM_CYCAPTION)+GetSystemMetrics(SM_CXFRAME);
  3061.      if (cw>bw.top) then
  3062.         menuheight := cw-bw.Top
  3063.      else menuheight:=0;
  3064.    end ;   }
  3065.    deletesysbtn;
  3066.    BtnCount:= length(fsd.sysbtn);
  3067.    setlength(sysbtn,BtnCount);
  3068.    for i:= 0 to BtnCount-1 do begin
  3069.        sysbtn[i]:=TWinsysbutton.create;
  3070.        sysbtn[i].data:=fsd.sysbtn[i];
  3071.        sysbtn[i].sf:=self;
  3072.        sysbtn[i].enabled:=true;
  3073.        if fsd.sysbtn[i].action in [3,11] then begin
  3074.           GetIcon(iconbmp);
  3075.           //copybmp(iconbmp,fsd.sysbtn[i].map);//fsd.sysicon);
  3076.           if sysbtn[i].data.map.empty then
  3077.              copybmp(iconbmp,fsd.sysbtn[i].map);//fsd.sysicon);
  3078. //             copybmp(fsd.sysicon,fsd.sysbtn[i].map);
  3079. //             copybmp(Iconbmp,fsd.sysbtn[i].map);
  3080. //             fsd.sysbtn[i].map.assign(Iconbmp);
  3081.           if fsd.sysicon.empty then
  3082.              copybmp(Iconbmp,fsd.sysicon);
  3083.           fsd.sysbtn[i].frame:=1;
  3084.        end;
  3085.    end;
  3086. end;
  3087. procedure TWinSkinForm.KeepClient;
  3088. var r1:Trect;
  3089. begin
  3090.    r1:=fform.ClientRect;
  3091. // Form Change Height
  3092.    fform.height:=r1.bottom+bw.top+bw.bottom+menuheight;
  3093. // Form Change Width
  3094.    fform.width:=r1.right+bw.left+bw.right;
  3095. end;
  3096. procedure TWinSkinForm.DrawIcon(dc:HDC;rc:TRect);
  3097. var SmallIcon: HIcon;
  3098. begin
  3099.     DefIcon := SendMessage(application.handle, WM_GETICON, ICON_SMALL, 0);
  3100.     if DefIcon = 0 then
  3101.        DefIcon := SendMessage(application.handle, WM_GETICON, ICON_BIG, 0);
  3102.     if deficon<>0 then begin
  3103.        SmallIcon := CopyImage(DefIcon, IMAGE_ICON, iconx, iconx,LR_COPYFROMRESOURCE);//LR_CREATEDIBSECTION);// LR_COPYFROMRESOURCE);
  3104.        DrawIconEx(dc,rc.Left,rc.Top, SmallIcon,iconx, iconx, 0, 0,DI_NORMAL);
  3105.        DestroyIcon(SmallIcon);
  3106.     end else begin
  3107.         DrawTranmap(DC,rc,iconbmp);
  3108. //        DrawRect1(dc,rc,iconbmp,1,1,1) ;
  3109.     end;
  3110. end;
  3111. {procedure TWinSkinForm.DrawIcon(dc:HDC;rc:TRect);
  3112. var SmallIcon: HIcon;
  3113. begin
  3114.     if deficon<>0 then begin
  3115.        SmallIcon := CopyImage(DefIcon, IMAGE_ICON, iconx, iconx,LR_CREATEDIBSECTION);// LR_COPYFROMRESOURCE);
  3116.        DrawIconEx(dc,rc.Left,rc.Top, defIcon ,iconx, iconx, 0, 0,DI_NORMAL);
  3117.        DestroyIcon(SmallIcon);
  3118.     end;
  3119. end;}
  3120. procedure TWinSkinForm.GetIcon(var bmp:Tbitmap);
  3121. var
  3122.   SmallIcon: HIcon;
  3123.   cx, cy,i: Integer;
  3124.   sd:Tskindata;
  3125. begin
  3126.       cx := GetSystemMetrics(SM_CXSMICON);
  3127.       cy := GetSystemMetrics(SM_CYSMICON);
  3128. //      bmp.Assign(nil);
  3129. //      bmp.canvas.brush.color:=clFuchsia;
  3130.       bmp.width:=cx;bmp.height:=cy;
  3131.       bmp.PixelFormat := pf16bit; 
  3132.       bmp.Canvas.Brush.color:=clFuchsia;
  3133.       bmp.canvas.fillrect(rect(0,0,cx,cy));
  3134.       iconx:=cx;
  3135.       // First try a small icon, then a big icon
  3136.       DefIcon := SendMessage(hwnd, WM_GETICON, ICON_SMALL, 0);
  3137.       if DefIcon = 0 then
  3138.         DefIcon := SendMessage(hwnd, WM_GETICON, ICON_BIG, 0);
  3139.       if DefIcon <> 0 then begin
  3140.         SmallIcon := CopyImage(DefIcon, IMAGE_ICON, cx, cy, LR_COPYFROMRESOURCE);
  3141.         DrawIconEx(bmp.Canvas.Handle, 0, 0, SmallIcon,
  3142.             cx, cy, 0, 0, DI_MASK or DI_IMAGE );//DI_NORMAL);
  3143.         DestroyIcon(SmallIcon);
  3144.       end else if not fsd.sysicon.empty then  begin //otherwise no icon found
  3145.          //cause DLL exception
  3146.          //bmp.assign(fsd.sysicon) ;
  3147.          //bmp.PixelFormat := pf24bit;
  3148.          //copybmp(sd.SysIcon,bmp);
  3149.       end else begin
  3150.          for i:= 0 to skinmanager.dlist.count-1 do begin
  3151.              sd:= Tskindata(skinmanager.dlist.items[i]);
  3152.              if sd.skinformtype=sfMainform then begin
  3153.                 if not sd.sysicon.empty then
  3154.                    //copybmp(sd.SysIcon,bmp);
  3155.                    //bmp.assign(sd.sysicon) ;
  3156.              end;
  3157.          end;
  3158.       end;
  3159. end;
  3160. function GetWindowClassname(ahwnd:Thandle):string;
  3161. var  buf:array[0..MAX_CLASSNAME] of char;
  3162. begin
  3163.      GetClassName(ahwnd, buf, MAX_CLASSNAME);
  3164.      result:=strpas(buf);
  3165. end;
  3166. procedure TWinSkinForm.doLog(msg:string);
  3167. var r:Trect;
  3168. begin
  3169.   {$IFDEF test}
  3170.   exit;
  3171.   if msg='' then exit;
  3172. //  if not skinmanager.menuactive then exit;
  3173.   if formstyle=sfsmdichild then exit;
  3174. //  if fform<>nil then
  3175. //  exit;
  3176.   msg:=format('%s-%4x :%s WS:%1d',[caption,hwnd,msg,Ord(windowstate)]);
  3177. //  getwindowrect(hwnd,r);
  3178. //  msg:=msg+format(' W(W:%1d H:%1d)',[r.right-r.left,r.bottom-r.top]);
  3179. //  getclientrect(hwnd,r);
  3180. //  msg:=msg+format(' C(w:%1d h:%1d)',[r.right-r.left,r.bottom-r.top]);
  3181. //  msg:=msg+format(' (l:%1d r:%1d w:%1d h:%1d)',[r.left,r.top,r.right,r.bottom]);
  3182. //  if crop then msg:=msg+' Crop:True'
  3183. //  else msg:=msg+' Crop:False';
  3184. //  if hassysbtn then msg:=msg+' SysBtn:True'
  3185. //  else msg:=msg+' SysBtn:False';
  3186.     if SkinCanLog then Logstring.add(msg);
  3187.   {$ENDIF}
  3188. end;
  3189. procedure TWinSkinForm.NewWndProc(var aMsg: TMessage);
  3190. const s='    ';
  3191. var  b:boolean;
  3192. begin
  3193.   {$IFDEF test}
  3194. //     dolog(MsgtoStr(aMsg));
  3195.   {$ENDIF}
  3196.   done2:=false;
  3197.   with aMsg do begin
  3198.     case Msg of
  3199.       CM_BEWAIT: begin
  3200.         // If message comes from Billenium Effects
  3201.         if aMsg.LParam = BE_ID then aMsg.Result := BE_ID
  3202.         else aMsg.Result :=1 ;
  3203.         end;
  3204.       CM_BENCPAINT: begin
  3205.          if amsg.LParam = BE_ID then begin
  3206.         // If a device context is provided then render the non client area in it
  3207.             if amsg.WParam <> 0 then
  3208.               updatenc(amsg.WParam);
  3209.             amsg.Result := BE_ID;
  3210.          end
  3211.         end;  
  3212.       CM_DialogChar:
  3213.             CMDialogChar(amsg);
  3214. //      CM_RELEASE: postmessage(hwnd,wm_close,0,0);
  3215.      {CM_MENUCHANGED: begin
  3216.           OldWndProc(amsg);
  3217.           refresh;
  3218.           done2:=true;
  3219.         end;}
  3220.       CN_SkinChanged:begin
  3221.          SkinChange;
  3222.          done:=true;
  3223.        end;
  3224.       WM_SETTEXT : begin
  3225.           if IsWindowVisible(hwnd) then begin
  3226.             // mdiform has problem, change caption when created
  3227.             {if isunicode or (formstyle=sfsmdichild)  then
  3228.                OldWndProc(amsg)
  3229.             else begin
  3230.               sendmessage(hwnd,WM_SETREDRAW,0,0);
  3231.               OldWndProc(amsg);
  3232.               sendmessage(hwnd,WM_SETREDRAW,1,0);
  3233.               Application.ProcessMessages;
  3234.             end;  }
  3235.             OldWndProc(amsg);
  3236.             if (windowstate=swsmax) then
  3237.                 postmessage(skinmanager.clienthwnd,CN_NewMDIChild,hwnd,0);
  3238.             if windowstate=swsmin then
  3239.                 updatenc(0)
  3240.             else  refresh;
  3241.           end else begin  //visible=false
  3242.              OldWndProc(amsg);
  3243.           end;
  3244.           done2:=true;
  3245.       end;
  3246.       else OldWndProc(amsg);
  3247.     end;
  3248.   end;
  3249. //  if not Done2 then OldWndProc(amsg);
  3250. end;
  3251. //          RedrawWindow(hwnd,0,0,RDW_FRAME or RDW_INVALIDATE or RDW_UPDATENOW);
  3252. procedure TWinSkinForm.SkinChange;
  3253. var i:integer;
  3254.     c,fc:Twincontrol;
  3255.     sc:Tskincontrol;
  3256.     b:boolean;
  3257. begin
  3258.     fc:=nil;
  3259.     b:=false;
  3260.     if fform<>nil then begin
  3261.        fform.color:=fsd.colors[csButtonFace];
  3262.        for i := 0 to fForm.ComponentCount - 1 do begin
  3263.           if fForm.Components[i] is Tcustomform then
  3264.            Tcustomform(fForm.Components[i]).color:=fsd.colors[csButtonFace]
  3265.          else if fForm.Components[i] is TCustomGrid then
  3266.            TacGrid(fForm.Components[i]).fixedcolor:=fsd.colors[csButtonFace];
  3267.        end;
  3268. //       fc:=fform.ActiveControl;
  3269. //       if fc<>nil then b:=fc.Focused;
  3270.     end;
  3271.     for i:= 0 to controllist.count-1 do begin
  3272.        sc:=Tskincontrol(controllist.items[i]);
  3273.        sc.skinchange;
  3274.     end;
  3275.     SkinState:=skin_change;
  3276.     if (sMainMenu) and (fform<>nil) then begin
  3277.       if fform<>nil then
  3278.        InitPopmenu(fform,true,true);
  3279.        ResizeForm(1);
  3280. //       SkinState:=skin_Active;
  3281. //       cropwindow;}
  3282.        fform.Height:=fform.height+1;
  3283.        fform.Height:=fform.height-1;
  3284.     end;
  3285.     AfterSkin;
  3286. //    if b and (fc<>Nil) then fc.SetFocus;
  3287.     SkinState:=skin_Active;
  3288. //    skinaddlog('**********************skin change************');
  3289. end;
  3290. procedure TWinSkinForm.UnSubclass;
  3291. var w,h:integer;
  3292.     p:Tpoint;
  3293.     r2:Trect;
  3294.     style:dword;
  3295. begin
  3296.   if not sMainMenu then begin
  3297.      Unsubclass2;
  3298.      exit;
  3299.   end;
  3300.   if  sysmenu<>nil then begin
  3301.     sysmenu.free;
  3302.     sysmenu:=nil;
  3303.   end;
  3304.      timer.enabled:=false;
  3305.      if fobjectinst=nil then exit;
  3306.      if (fform<>nil) and assigned(oldwndproc) then begin
  3307.           fform.WindowProc := OldWndProc;
  3308.           oldwndproc:=nil;
  3309.      end;
  3310.      if isunicode then
  3311.        SetWindowLongW(hwnd, GWL_WNDPROC,LongInt(FPrevWndProc))
  3312.      else
  3313.        SetWindowLong(hwnd, GWL_WNDPROC,LongInt(FPrevWndProc));
  3314.      FreeObjectInstance(FObjectInst);
  3315.      fobjectinst:=nil;
  3316.      DeleteControls;
  3317.      if fform<>nil then begin
  3318.         InitPopMenu(fform,false,false);
  3319.         if (xcMenuitem in fsd.SkinControls) then
  3320.              InitMainMenu(fForm,false,false);
  3321.         if Skinstate<>skin_Destory then
  3322.            fform.color:=formcolor;
  3323.      end;
  3324.      UpdateStyle(false);
  3325.      EnableSysbtn(true);
  3326.      if menu<>nil then begin
  3327.           if hmenu<>menu.hmenu then
  3328.             SetMenu(Hwnd, menu.hmenu)
  3329.           else
  3330.             SetMenu(Hwnd, hmenu);
  3331.        menu.free;
  3332.        menu:=nil;