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

Delphi控件源码

开发平台:

Delphi

  1. unit WinSkinDlg;
  2. {$I Compilers.Inc}
  3. {$WARNINGS OFF}
  4. {$HINTS OFF}
  5. {$RANGECHECKS OFF}
  6. interface
  7. uses windows,Messages,SysUtils,Classes,Graphics,WinSkinMenu,
  8.   forms,ExtCtrls;
  9. const
  10.    skin_Creating=0;
  11.    skin_Active=1;
  12.    skin_uninstall=2;
  13.    skin_change=3;
  14.    skin_Destory=4;
  15.    skin_Updating=5;
  16.    skin_Deleted=6;
  17.    skin_update=7;
  18.    m_popup=0;
  19.    m_systemmenu=2;
  20.    m_menuitem=1;
  21. Type
  22.   TSkinThread = class(TObject)
  23.   public
  24.     hook:HHook;
  25.     ThreadID:integer;
  26.   end;
  27.   TSBAPI1=function(ahwnd:hwnd): HResult; stdcall;
  28.   TSBAPI2= function() :HResult; stdcall;
  29.   TSkinManage = class(Tobject)
  30.   protected
  31.     Timer : TTimer;
  32.     SBLib :Thandle;
  33.     pinitApp,pUninitApp:TSBAPI2;
  34.     pinitSB,pUninitSb:TSBAPI1;
  35.     //function  FindSkinForm(aHwnd:THandle):boolean;
  36.     function  FindSkinForm(aHwnd:THandle):dword;
  37.     procedure DeleteAllForms;
  38.     function AddMenu(aHwnd:THandle):boolean;
  39.     function  FindSkinMenu(aHwnd:THandle):boolean;
  40.     function  DeleteMenu(aHwnd:THandle):boolean;
  41.     procedure DeleteAllMenus;
  42.     function  FindTForm(ahwnd:Thandle):Tform;
  43.     procedure OnTimer(Sender: TObject);
  44.     function NestedForm(ahwnd:Thandle):boolean;
  45.     procedure FindSkindata(var adata:pointer;ahwnd:Thandle);
  46.     function OnBeforeSkin(ahwnd:Thandle;aname:string):boolean;
  47.     procedure DeleteAllThreads;
  48.     procedure ActiveForm(aform:Tform);
  49.     procedure DeleteDeleted;
  50.     function IsDllForm(ahwnd:Thandle):boolean;
  51.     procedure DeleteAllSub;
  52.     procedure DeleteSubForm(amode:integer);
  53. //    function AddForm(aHwnd:THandle):boolean;
  54.      procedure WndProc(var Msg: TMessage);
  55.   public
  56.     Flist:Tlist;
  57.     Mlist:Tlist;
  58.     Dlist:Tlist;
  59.     Threadlist:Tlist;
  60.     sublist:Tlist;
  61.     active:boolean;
  62.     skinchildform:boolean;
  63.     state:integer;
  64.     menutype:integer;
  65.     menuactive:boolean;
  66.     MDIMax:boolean;
  67.     WMSetDraw:boolean;
  68.     clienthwnd:Thandle;
  69.     MDIForm : Tform;
  70.     action:integer;
  71.     UpdateData:pointer;
  72.     SBinstall :boolean;
  73.     MainData: pointer;
  74.     mode:integer;
  75.     handle : HWND;
  76.     lpara : integer;
  77.     mmgr:TSkinmanage;
  78.     constructor Create(amode:integer=0);
  79.     destructor Destroy; override;
  80.     procedure InstallHook;
  81.     function AddForm(aHwnd:THandle):boolean;
  82. //    function AddMDIForm(atform:Tform):boolean;
  83.     function DeleteForm(aHwnd:THandle):boolean;
  84.     function  GetMenuBg(amenu:Hmenu):Tbitmap;
  85.     procedure UpdateSkinMenu(amenu:Hmenu);
  86.     procedure  FindPopupMenu(amenu:Hmenu);
  87.     procedure  SetMDIMax(b:boolean);
  88.     procedure  SetMDIMax2(b:boolean);
  89.     procedure  SetCaption(b:boolean);
  90.     function  GetMDIChildNum:integer;
  91.     procedure SetAction(acode:integer;Interval:integer=250);
  92.     procedure AddSkinData(adata: Pointer);
  93.     procedure RemoveSkinData(adata: Pointer);
  94.     procedure DeleteSysbtn;
  95.     procedure InstallThread(aThreadID:integer);
  96.     procedure UnInstallThread(aThreadID:integer);
  97.     function initsb(ahwnd:Thandle):boolean;
  98.     function Uninitsb(ahwnd:Thandle):boolean;
  99.     procedure SetPopMenu;
  100.     procedure DeleteForm2(aHwnd:THandle);
  101.     procedure DeleteForm3;
  102.     procedure AssignData(adata: Pointer);
  103.     procedure SetHMenu(hmenu:Thandle);
  104.     procedure DeleteSub(p:Pointer);
  105.   end;
  106. //var HookCallback,WndCallBack,WndCallRet : HHOOK;
  107. var  SkinManager:TSkinManage;
  108.      RM_GetObjectInstance: DWORD;
  109.      ControlAtom: TAtom;
  110.      PropName:string;
  111.      myinstance:dword;
  112. function SkinHookCallback(code: integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
  113. function SkinHookCallRet(code: integer; wParam: WPARAM; lParam: LPARAM): LRESULT;stdcall;
  114. function SkinHookCBT(code: integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
  115. function SkinHookCBT2(code: integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
  116. implementation
  117. uses winskinform ,WinSkinData,menus,winsubclass;
  118. var
  119.      HookCallback,WndCallBack,WndCallRet : HHOOK;
  120.      appDestory:boolean;
  121. function SkinHookCallRet(code: integer; wParam: WPARAM; lParam: LPARAM): LRESULT;
  122. var pwp:PCWPRETSTRUCT;
  123.    s:string;
  124. begin
  125.    if code= HC_ACTION then begin
  126.      pwp:=PCWPRETSTRUCT (lparam);
  127.      case pwp.message of
  128.         WM_DRAWITEM: begin
  129. //              SkinManager.WMDRAWITEM(PDrawItemStruct(pwp.lparam));
  130.            end;
  131.      end;
  132.    end;
  133.    result:=CallNextHookEx( WndCallRet, Code, wParam, lParam );
  134. end;
  135. function SkinHookCallback(code: integer; wParam: WPARAM; lParam: LPARAM): LRESULT;
  136. var pwp:PCWPSTRUCT;
  137.    s:string;
  138.    msg:Tmessage;
  139. begin
  140.    if code= HC_ACTION then begin
  141.      pwp:=PCWPSTRUCT(lparam);
  142. {     if skincanlog then begin
  143.         msg.msg:=pwp.message;
  144.         msg.wparam:=pwp.wparam;
  145.         msg.lparam:=pwp.lparam;
  146.         skinaddlog('Hook:'+msgtostr(msg));
  147.      end; }
  148.      case pwp.message of
  149.         WM_CREATE:SkinManager.AddMenu(pwp.hwnd);
  150.         WM_DESTROY,WM_NCDESTROY:SkinManager.DeleteMenu(pwp.hwnd);
  151.         WM_INITMENU: begin
  152. //              skinaddlog('WH_CALLWNDPROC : WM_INITMENU');
  153.               skinmanager.FindPopupMenu(pwp^.wparam);
  154.            end;
  155. {        WM_DRAWITEM: begin
  156.               skinaddlog('WH_CALLWNDPROC : WM_DRAWITEM');
  157.            end;}
  158.      end;
  159.    end;
  160.    result:=CallNextHookEx( WndCallback, Code, wParam, lParam );
  161. end;
  162. function SkinHookCBT(code: integer; wParam: WPARAM; lParam: LPARAM): LRESULT;
  163. var s:string;
  164.    hwnd:Thandle;
  165.    ptr:^CBT_CREATEWND;
  166.    sf: dword;
  167.    sd:Tskindata;
  168. begin
  169. //message box WM_ACTIVATE TMessageForm
  170. //Dlg ****WM_ACTIVATE #32770 WA_ACTIVE
  171.    if (appDestory) then begin
  172.      result:=CallNextHookEx( HookCallback, Code, wParam, lParam );
  173.      exit;
  174.    end ;
  175.    if (code>=0) then begin
  176.       case code of
  177.         HCBT_ACTIVATE :begin
  178.            if skinmanager.state=skin_creating then
  179.               inc(skinmanager.state);
  180.            hwnd := Thandle(wParam);
  181.            if  SkinManager.addform(hwnd) then begin
  182.            end;
  183.          end;
  184.          HCBT_DESTROYWND : begin
  185.            hwnd := Thandle(wParam);
  186.            SkinManager.DeleteMenu(hwnd);
  187.            //if SkinManager.deleteform(hwnd) then begin
  188.            //end;
  189.          end;
  190.          HCBT_CREATEWND : begin
  191.            hwnd := Thandle(wParam);
  192.            ptr:=pointer(lparam);
  193.            s:= getwindowclassname(hwnd);
  194. //           skinAddlog(format('***HCBT_CREATEWND %s %1x,%1x',[s,hwnd,ptr^.lpcs^.hwndParent]));
  195.            if (s='ScrollBar') and ((ptr^.lpcs^.style and sbs_sizegrip)>0) then begin
  196.               s:= getwindowclassname(ptr^.lpcs^.hwndParent);
  197.               sf:= SkinManager.findskinform(ptr^.lpcs^.hwndParent);
  198.               if (sf>0)  then begin  //     and (s='#32770')
  199.                   Twinskinform(sf).addcontrolh(hwnd);
  200. //                  skinAddlog(format('*****Scrollbar %s %1x,%1x',[s,hwnd,ptr^.lpcs^.hwndParent]));
  201. //                  result:=10;
  202. //                  exit;
  203.               end;
  204.            end ;
  205.            if (ptr^.lpcs^.style and ws_child)=0 then begin
  206.                //skinAddlog(format('***Form Creater %s %1x (%1d,%1d)',[s,hwnd,ptr^.lpcs^.cx,ptr^.lpcs^.cy]));
  207.                s:= getwindowclassname(hwnd);
  208.                if (s='#32768') and (skinmanager.mmgr=nil) then
  209.                  SkinManager.AddMenu(hwnd)  ;
  210. //               sd:=SkinManager.maindata;
  211. //               sd.DoDebug(s);
  212. {               if (sd<>nil) and assigned(sd.OnNewform) then
  213.                   try
  214.                     sd.OnNewform(sd,hwnd,s);
  215.                   except
  216.                   end;       }
  217.            end;
  218.            if (ptr^.lpcs^.dwExStyle and ws_ex_mdichild)>0 then begin
  219.               SkinManager.addform(hwnd);
  220.            end;
  221.          end;
  222. {         HCBT_MINMAX : begin
  223.            hwnd := Thandle(wParam);
  224.            if lparam = SW_MAXIMIZE then
  225.                skinAddlog(format('***Form MAXIMIZE %1x ',[hwnd]));
  226.          end;}
  227.       end;//endcase
  228.    end else begin
  229.       if (code=HCBT_ACTIVATE) and (skinmanager.state=skin_creating) then
  230.               inc(skinmanager.state);
  231.    end;
  232.    result:=CallNextHookEx( HookCallback, Code, wParam, lParam );
  233. end;
  234. function SkinHookCBT2(code: integer; wParam: WPARAM; lParam: LPARAM): LRESULT;
  235. var s:string;
  236.    hwnd:Thandle;
  237.    ptr:^CBT_CREATEWND;
  238. begin
  239. //message box WM_ACTIVATE TMessageForm
  240. //Dlg ****WM_ACTIVATE #32770 WA_ACTIVE
  241.    if code>=0 then begin
  242.       case code of
  243.         HCBT_ACTIVATE :begin
  244.            if skinmanager.state=skin_creating then
  245.               inc(skinmanager.state);
  246.            hwnd := Thandle(wParam);
  247.              if  SkinManager.addform(hwnd) then begin
  248. //               s:='****HCBT_ACTIVATE '+s;
  249. //               skinAddlog(s);
  250.              end;
  251.          end;
  252.          HCBT_DESTROYWND : begin
  253.            hwnd := Thandle(wParam);
  254.            SkinManager.DeleteMenu(hwnd);
  255.            if SkinManager.deleteform(hwnd) then begin
  256.            end;
  257.          end;
  258.          HCBT_CREATEWND : begin
  259.            hwnd := Thandle(wParam);
  260.            ptr:=pointer(lparam);
  261.            s:= getwindowclassname(hwnd);
  262. //           skinAddlog(format('***HCBT_CREATEWND %s %1x,%1x',[s,hwnd,ptr^.lpcs^.hwndParent]));
  263.            if (s='ScrollBar') and (SkinManager.findskinform(ptr^.lpcs^.hwndParent)>0) then begin
  264. //              skinAddlog(format('***Scrollbar %s %1x,%1x',[s,hwnd,ptr^.lpcs^.hwndParent]));
  265.               result:=10;
  266.               exit;
  267.            end ;
  268.            if s='#32768' then
  269.               SkinManager.AddMenu(hwnd); //don't create scrollbar
  270.          end;
  271.       end;//endcase
  272.    end;
  273.    result:=CallNextHookEx( HookCallback, Code, wParam, lParam );
  274. end;
  275. constructor TSkinManage.Create(amode:integer=0);
  276. begin
  277.    inherited create();
  278.    if amode=0 then begin
  279.       flist:=Tlist.create;
  280.       Mlist:=Tlist.create;
  281.       dlist:=Tlist.create;
  282.       threadlist:=Tlist.create;
  283.       sublist:=Tlist.create;
  284.       mode:=0;
  285.    end else
  286.       mode := HInstance;
  287.    active:=false;
  288.    menuactive:=false;
  289.    MDIMax:=false;
  290.    menutype:=0;
  291.    mmgr:=nil;
  292.    Timer := TTimer.create(nil);
  293.    timer.Interval:=100;
  294.    timer.Ontimer:=Ontimer;
  295.    timer.enabled:=false;
  296.    SBinstall :=false;
  297.    skinchildform:=false;
  298.    wmsetdraw:=false;//true;
  299.    maindata:=nil;
  300.    state:=skin_creating;
  301. //   Handle := Classes.AllocateHWnd(WndProc);
  302.    SBLib:=0;
  303. //   SBLib := LoadLibrary('C:MyFileMySkinARTICLEcoolsb_srccoolsb2Releasecoolsb2.dll');
  304. //   SBLib := LoadLibrary('coolsb2.dll');
  305.    pinitapp:=nil;
  306.    sbinstall:=false;
  307.    if SBLib<>0 then begin
  308.     pinitApp:=GetProcAddress(SBLib,'CoolSB_InitializeApp');
  309.     pUninitApp:= GetProcAddress(SBLib,'CoolSB_UninitializeApp');
  310.     pinitSB:=GetProcAddress(SBLib,'InitializeCoolSB');
  311.     pUninitSb:=GetProcAddress(SBLib,'UninitializeCoolSB');
  312.    end;
  313.    if @pinitapp<>nil then
  314.        SBinstall := boolean(pinitapp);
  315. //   installhook;
  316. end;
  317. destructor TSkinManage.Destroy;
  318. begin
  319.    state:=skin_destory;
  320.    active:=false;
  321.    Timer.free;
  322.    if @pUninitapp<>nil then  pUninitapp;
  323.    if (sblib<>0) then
  324.        FreeLibrary(sblib);
  325.    if mode=0 then begin
  326.        DeleteAllThreads;
  327.        if (sublist.Count>0) or (flist.Count>0) then
  328.            deleteallforms;
  329.       if flist<>nil then flist.free;
  330.       deleteallmenus;
  331.       dlist.free;
  332.       deleteallsub;
  333.    end else if HookCallback<>0 then begin
  334.      if assigned(mmgr) {and (mmgr.state <> skin_destory)} then begin
  335.         mmgr.DeleteSub(self);
  336.         mmgr.DeleteSubForm(mode);
  337.      end;
  338.       //AssignData(nil);
  339.    end;
  340. //   Classes.DeallocateHWnd(Handle);
  341.    if HookCallback<>0 then
  342.      UnhookWindowsHookEx( HookCallback );
  343.    appDestory := true;
  344.    inherited destroy;
  345. end;
  346. procedure TSkinManage.InstallHook;
  347. var dwThreadID:DWORD;
  348. begin
  349.    winversion:=GetVersion();
  350. //   skinaddlog(format('Windows Version %1x',[winversion]));
  351. //   skinaddlog(format('Windows Version %1d %1d',[Win32MajorVersion,Win32MinorVersion]));
  352. //   skinaddlog(format('winversion %1x',[winversion]));
  353.    dwThreadID := GetCurrentThreadId;
  354. //   WndCallback :=SetWindowsHookEx( WH_CALLWNDPROC,SkinHookCallback,0,dwThreadID);
  355. //   WndCallRet :=SetWindowsHookEx( WH_CALLWNDPROCRET,SkinHookCallRet,0,dwThreadID);
  356.    HookCallback :=SetWindowsHookEx( WH_CBT,SkinHookCBT,0,dwThreadID);
  357. //   skinaddlog(format('ThreadId %1x',[dwThreadId]));
  358. //   skinaddlog(format('HookCallback %1x',[HookCallback]));
  359. end;
  360. procedure TSkinManage.InstallThread(aThreadID:integer);
  361. var obj:TSkinThread;
  362.      b: boolean;
  363.      i:integer;
  364. begin
  365.    b:=false;
  366.    for i:= 0 to threadlist.count-1 do begin
  367.       obj:= TSkinThread(threadlist[i]);
  368.       if obj.threadID=aThreadID then begin
  369.         b:=true;
  370.         break;
  371.       end;
  372.    end;
  373.    if b then exit;
  374.    obj:=TSkinThread.create;
  375.    obj.threadID:=aThreadID;
  376.    obj.hook :=SetWindowsHookEx( WH_CBT,SkinHookCBT2,0,aThreadID);
  377.    threadlist.add(obj);
  378. end;
  379. procedure TSkinManage.UnInstallThread(aThreadID:integer);
  380. var obj:TSkinThread;
  381.     i:integer;
  382. begin
  383.    for i:= 0 to threadlist.count-1 do begin
  384.       obj:= TSkinThread(threadlist[i]);
  385.       if obj.threadID=aThreadID then begin
  386.         UnhookWindowsHookEx( obj.hook);
  387.         threadlist.delete(i);
  388.         break;
  389.       end;
  390.    end;
  391. end;
  392. procedure TSkinManage.DeleteAllThreads;
  393. var obj:TSkinThread;
  394.     i:integer;
  395. begin
  396.    for i:= 0 to threadlist.count-1 do begin
  397.       obj:= TSkinThread(threadlist[i]);
  398.       UnhookWindowsHookEx( obj.Hook );
  399.       obj.free;
  400.    end;
  401.    threadlist.clear;
  402.    threadlist.free;
  403. end;
  404. function Tskinmanage.nestedform(ahwnd:Thandle):boolean;
  405. var  style:longword;
  406.      s:string;
  407.      phwnd:Thandle;
  408. begin
  409.    result:=false;
  410.    Style := GetWindowLong( ahwnd, GWL_STYLE );
  411.    if (style and ws_child)=0 then exit;
  412.    Style := GetWindowLong( ahwnd, GWL_EXSTYLE );
  413.    if (style and ws_ex_mdichild)>0 then exit;
  414.    phwnd:=getparent(ahwnd);
  415.    s:=lowercase(getwindowclassname(phwnd));
  416.    if s='mdiclient' then exit;
  417.    result:=true;
  418. end;
  419. procedure Tskinmanage.FindSkindata(var adata:pointer;ahwnd:Thandle);
  420. var s:string;
  421.   function FindOnlyThisForm:boolean;
  422.   var i:integer;
  423.       sd:Tskindata;
  424.       sf:Tform;
  425.   begin
  426.      result:=false;
  427.      for i:= 0 to dlist.count-1 do begin
  428.          sd:=Tskindata(dlist.items[i]);
  429.          sf:=Tform(sd.owner);
  430.          if (sd.skinformtype=sfOnlyThisForm) and (sf.handle=ahwnd) then begin
  431.              adata:=sd;
  432.              result:=true;
  433.          end;
  434.      end;
  435.   end;
  436.   function FindData(atype:TSkinFormType):boolean;
  437.   var i:integer;
  438.       sd:Tskindata;
  439.   begin
  440.      result:=false;
  441.      for i:= 0 to dlist.count-1 do begin
  442.          sd:=Tskindata(dlist.items[i]);
  443.          if (sd.skinformtype=atype) then begin
  444.              adata:=sd;
  445.              result:=true;
  446.          end;
  447.      end;
  448.   end;
  449. begin
  450.    if FindOnlyThisForm then exit;
  451.    s:=lowercase(getwindowclassname(ahwnd));
  452.    if ((s='tmessageform') or (s='#32770')) and finddata(sfDialog) then exit;
  453.    if finddata(sfMainform) then exit;
  454.    if dlist.count>0 then adata:=dlist.items[0]
  455.    else adata:=nil;
  456. end;
  457. function TSkinManage.OnBeforeSkin(ahwnd:Thandle;aname:string):boolean;
  458. var b:boolean;
  459.     i:integer;
  460.     sd:Tskindata;
  461.     s:string;
  462.     dwstyle:Dword;
  463. begin
  464.    b:=true;
  465.    if maindata<>nil then begin
  466.      s:= lowercase(aname);
  467.      if not (xoPreview in TSkindata(maindata).Options) then begin
  468.         if (pos('preview',s)>0) then b:=false;
  469.      end;
  470.      dwstyle := GetWindowLong( ahwnd, GWL_STYLE );
  471.      //file download dialog
  472.      if (aname='#32770') and ((dwstyle and DS_SETFOREGROUND)>0) then b:=false;
  473.      if (s='tpopupdbtreeview') then b:=false;
  474.      TSkindata(maindata).DoFormSkin(ahwnd,aname,b);
  475.    end;
  476. {   for i:= 0 to dlist.count-1 do begin
  477.        sd:=Tskindata(dlist.items[i]);
  478.        if (sd.skinformtype=sfMainform) then begin
  479.             sd.DoFormSkin(aname,b);
  480.             break;
  481.        end;
  482.    end;}
  483.    result:=b;
  484. end;
  485. procedure TSkinManage.ActiveForm(aform:Tform);
  486. var dwstyle:dword;
  487.     b:boolean;
  488. begin
  489.     dwstyle := GetWindowLong( aform.handle, GWL_STYLE );
  490.     b:= (dwstyle and ws_child)>0;   //child
  491.     //if aform.formstyle=fsmdichild then b:=false;//mdichild
  492.     if not aform.Visible then b:=true;
  493.     if not b then addform(aform.handle);
  494. end;
  495. function TSkinManage.AddForm(aHwnd:THandle):boolean;
  496. var aform:TWinskinform;
  497.     atform:TForm;
  498.     r:Trect;
  499.     s:string;
  500.     aptr:pointer;
  501.     adata:Tskindata;
  502.     isskin:integer;
  503.     dw:dword;
  504.     b:boolean;
  505. begin
  506.    result:=false;
  507.    if not active then exit;
  508.    DeleteDeleted;
  509.    isskin:=sendmessage(ahwnd,CN_IsSkined,0,0);
  510. // {$IFDEF demo}
  511. //    atform:=findtform(ahwnd);
  512. //    if atform<>nil then
  513. //      setproperty(atform,'Caption',' ');
  514. // {$endif}
  515.    if isskin=1 then exit;
  516.    if findskinform(ahwnd)<>0 then exit;
  517.    atform:=findtform(ahwnd);
  518.    if (not skinchildform) and nestedform(ahwnd) then exit;
  519. //   b:= (s='#32770') {or (s='TMessageForm')};
  520.    s:=getwindowclassname(ahwnd);
  521.    dw:=GetWindowLong(ahwnd,GWL_HINSTANCE);
  522.    if (atform=nil) and (dw<>myinstance) and (s<>'#32770') then exit;
  523. //   if (not b) and (atform=nil) and (not isdllform(ahwnd)) then exit;
  524. //   if not isdllform(ahwnd) then exit;
  525. //   TSkindata(maindata).DoDebug(s);
  526.    getwindowrect(ahwnd,r);
  527.    offsetrect(r,-r.left,-r.top);
  528.    dw:=GetWindowLong(ahwnd, GWL_EXSTYLE);
  529.    if (r.right*r.bottom=0) and ((dw and ws_ex_mdichild)=0) then exit;
  530.    if (atform<>nil) and (atform.tag=99) then exit;
  531.    if pos('TcxPopupEditPopupWindow',s)>0 then exit;
  532.    if pos('TTERenderWindow',s)>0 then exit;
  533.    if s='TApplication' then exit;
  534. //   if s='TQRStandardPreview' then exit; //quickreport preview form
  535.    if not OnBeforeSkin(ahwnd,s) then exit;
  536.    FindSkindata(aptr,ahwnd);
  537.    if aptr=nil then exit;
  538.    adata:=Tskindata(aptr);
  539.    if adata.empty then exit;
  540.    if atform<>nil then begin
  541.       aform:=Twinskinform.create(atform);
  542.       aform.hwnd:=ahwnd;
  543.       aform.mode:=mode;
  544.       aform.formclass:=s;
  545.       aform.InitTform(adata,atform);
  546.    end else begin
  547.       aform:=Twinskinform.create(nil);
  548.       aform.hwnd:=ahwnd;
  549.       aform.mode:=mode;
  550.       aform.formclass:=s;
  551.       aform.initDlg(adata);
  552.    end;
  553.    flist.add(aform);
  554. //   LockWindowUpdate(ahwnd);
  555.    postMessage(ahwnd, CN_NewForm, 0, 1000);
  556.    result:=true;
  557. end;
  558. {function TSkinManage.AddMDIForm(atform:Tform):boolean;
  559. var aform:TWinskinform;
  560.     r:Trect;
  561.     s:string;
  562.     aptr:pointer;
  563.     adata:Tskindata;
  564.     isskin:integer;
  565.     ahwnd:Thandle;
  566. begin
  567.    result:=false;
  568.    if not active then exit;
  569.    DeleteDeleted;
  570.    ahwnd:=atform.handle;
  571.    isskin:=sendmessage(ahwnd,CN_IsSkined,0,0);
  572.    if isskin=1 then exit;
  573.    if not OnBeforeSkin(s) then exit;
  574.    FindSkindata(aptr,ahwnd);
  575.    if aptr=nil then exit;
  576.    adata:=Tskindata(aptr);
  577.    if adata.empty then exit;
  578.    if atform<>nil then begin
  579.       aform:=Twinskinform.create(atform);
  580.       aform.hwnd:=ahwnd;
  581.       aform.InitTform(adata,atform);
  582.       flist.add(aform);
  583.       postMessage(ahwnd, CN_NewForm, 0, 1000);
  584.       result:=true;
  585.    end;
  586. end;    }
  587. function TSkinManage.DeleteForm(aHwnd:THandle):boolean;
  588. var i: integer;
  589.     sf :TWinSkinform;
  590. begin
  591.    if (state=skin_destory) then exit;
  592.    result:=false;
  593.    for i:=0 to flist.count-1 do begin
  594.       sf:=TWinSkinform(flist[i]);
  595.       if sf.hwnd=ahwnd then begin
  596.          if sf.FForm = nil then exit;
  597.          sf.Skinstate:=skin_Destory;
  598.          sf.unsubclass;
  599.          flist.delete(i);
  600.          sf.free;
  601.          sf:=nil;
  602.          result:=true;
  603.          break;
  604.       end;
  605.    end;
  606. end;
  607. procedure TSkinManage.DeleteForm2(aHwnd:THandle);
  608. var i: integer;
  609.     sf :TWinSkinform;
  610. begin
  611.    if (state=skin_destory) then exit;
  612.    for i:=0 to flist.count-1 do begin
  613.       sf:=TWinSkinform(flist[i]);
  614.       if sf.hwnd=ahwnd then begin
  615.          flist.delete(i);
  616.          break;
  617.       end;
  618.    end;
  619. end;
  620. procedure TSkinManage.DeleteDeleted;
  621. var i: integer;
  622.     sf :TWinSkinform;
  623. begin
  624.    if (state=skin_destory) then exit;
  625.    for i:=flist.count-1 downto 0 do begin
  626.       sf:=TWinSkinform(flist[i]);
  627.       if IsBadReadPtr(sf, InstanceSize) then begin
  628.          flist.delete(i);
  629.       end else if (sf.skinstate=skin_Deleted) and (sf.mode=mode) then begin
  630.          //sf.UnSubclass3;
  631.          flist.delete(i);
  632.          sf.free;
  633.       end;
  634.    end;
  635. end;
  636. procedure TSkinManage.DeleteAllForms;
  637. var i: integer;
  638.     sf :TWinSkinform;
  639. begin
  640.     active:=false;
  641. //    DeleteDeleted;
  642.     for i:=flist.count-1 downto 0 do begin
  643.         sf:=TWinSkinform(flist[i]);
  644.         if IsBadReadPtr(sf, InstanceSize) then continue;
  645. //??  remove dialog
  646.         if sf.mode<>mode then continue;
  647.         //sf.Skinstate:=skin_Destory;
  648.         flist.delete(i);
  649.         sf.unsubclass3;
  650.         sf.free;
  651.    end;
  652. end;
  653. procedure TSkinManage.DeleteSubForm(amode:integer);
  654. var i: integer;
  655.     sf :TWinSkinform;
  656. begin
  657.     for i:=flist.count-1 downto 0 do begin
  658.         sf:=TWinSkinform(flist[i]);
  659.         if IsBadReadPtr(sf, InstanceSize) then continue;
  660.         if sf.mode<>amode then continue;
  661.         //sf.Skinstate:=skin_Destory;
  662.         flist.delete(i);
  663.         sf.FForm.Free;
  664.         //sf.unsubclass3;
  665.         //sf.free;
  666.    end;
  667. end;
  668. procedure TSkinManage.DeleteForm3;
  669. var i: integer;
  670.     sf :TWinSkinform;
  671. begin
  672.    if (state=skin_destory) then exit;
  673.    for i:=flist.count-1 downto 0 do begin
  674.       sf:=TWinSkinform(flist[i]);
  675.       if sf.skinstate=skin_deleted then begin
  676.          flist.delete(i);
  677.          sf.free;
  678.       end;
  679.    end;
  680. end;
  681. procedure TSkinManage.AddSkinData(adata: Pointer);
  682. begin
  683.    dlist.add(adata);
  684.    if (maindata=nil) and (TSkindata(adata).skinformtype=sfmainform) then
  685.     maindata:=adata;
  686. end;
  687. procedure TSkinManage.RemoveSkinData(adata: Pointer);
  688. var i:integer;
  689. begin
  690.    i:= dlist.indexof(adata);
  691.    if i<>-1 then begin
  692.      dlist[i]:=nil;
  693.      dlist.delete(i);
  694.    end;
  695. end;
  696. procedure TSkinManage.AssignData(adata: Pointer);
  697. var d:TSkinmanage;
  698. begin
  699.    if adata<>nil then begin
  700.       d:=TskinManage(adata);
  701.       flist:=d.Flist;
  702.       Mlist:=d.Mlist;
  703.       dlist:=d.Dlist;
  704.       threadlist:=d.Threadlist;
  705.       maindata:=d.MainData;
  706.       mmgr:=d;
  707.       state:=1;
  708.       active:=d.active;
  709.       //active:=false;
  710.       d.sublist.Add(self);
  711.    end else begin
  712.       flist:=nil;
  713.       Mlist:=nil;
  714.       dlist:=nil;
  715.       threadlist:=nil;
  716.       maindata:=nil;
  717.       active:=false;
  718.       state:=skin_destory;
  719.       if HookCallback<>0 then
  720.          UnhookWindowsHookEx( HookCallback );
  721.       HookCallback:=0;
  722.    end;
  723. end;
  724. procedure TSkinManage.DeleteAllMenus;
  725. var i: integer;
  726.     sm :TWinSkinPopMenu;
  727. begin
  728.    for i:=0 to mlist.count-1 do begin
  729.       sm:=TWinSkinPopMenu(mlist[i]);
  730.       sm.free;
  731.    end;
  732.    mlist.clear;
  733.    mlist.free;
  734.    mlist:=nil;
  735. end;
  736. procedure TSkinManage.DeleteAllSub;
  737. var i: integer;
  738.     sm :TSkinmanage;
  739. begin
  740.    for i:=0 to sublist.count-1 do begin
  741.       sm:=TSkinManage(sublist[i]);
  742.       if not IsBadReadPtr(TSkinManage(sublist[i]), InstanceSize) then
  743.          sm.Assigndata(nil);
  744. //      sm.Assigndata(nil);
  745.       //sm.Free;
  746.    end;
  747.    sublist.clear;
  748.    sublist.free;
  749.    sublist:=nil;
  750. end;
  751. procedure TSkinManage.DeleteSub(p:Pointer);
  752. var i: integer;
  753. begin
  754.    if sublist = nil then exit;
  755.    if IsBadReadPtr(sublist, InstanceSize) then exit;
  756.    for i:=0 to sublist.count-1 do begin
  757.       if sublist[i]=p then begin
  758.         sublist.delete(i);
  759.         break;
  760.       end;
  761.    end;
  762. end;
  763. procedure TSkinManage.SetPopMenu;
  764. var i: integer;
  765.     sm :TWinSkinPopMenu;
  766. begin
  767. //   i:= mlist.count;
  768. //   if i=0 then exit;
  769.    for i:=0 to mlist.count-1 do begin
  770.       sm:=TWinSkinPopMenu(mlist[i]);
  771.       sm.ownerdraw:=true;
  772.    end;
  773. end;
  774. procedure TSkinManage.SetHMenu(hmenu:Thandle);
  775. var i: integer;
  776.     sm :TWinSkinPopMenu;
  777. begin
  778. //   i:= mlist.count;
  779. //   if i=0 then exit;
  780.    for i:= mlist.count-1 downto 0 do begin
  781.       sm:=TWinSkinPopMenu(mlist[i]);
  782.       if sm.hmenu=0 then begin
  783.          sm.hmenu:=hmenu;
  784.          break;
  785.       end;
  786.    end;
  787. end;
  788. function  TSkinManage.FindSkinForm(aHwnd:THandle):dword;
  789. var i: integer;
  790.     sf :TWinSkinform;
  791. begin
  792.    result:=0;
  793.    for i:=0 to flist.count-1 do begin
  794.       sf:=TWinSkinform(flist[i]);
  795.       if sf.hwnd=ahwnd then begin
  796.          result:=dword(sf);
  797.          break;
  798.       end;
  799.    end;
  800. end;
  801. function TSkinManage.AddMenu(aHwnd:THandle):boolean;
  802. var amenu:TWinSkinPopMenu;
  803.     s:string;
  804.     adata:Tskindata;
  805.     aptr:pointer;
  806.     isskin:integer;
  807. begin
  808.    result:=false;
  809.    if not active then exit;
  810.    isskin:=sendmessage(ahwnd,CN_IsSkined,0,0);
  811.    if isskin=1 then exit;
  812.    if findskinMenu(ahwnd) then exit;
  813.    FindSkindata(aptr,ahwnd);
  814.    if aptr=nil then exit;
  815.    adata:=Tskindata(aptr);
  816. //   if (adata.empty) or (not(xcMainmenu in adata.SkinControls)) then exit;
  817.    if (adata.empty) then exit;
  818.    case menutype of
  819.      m_popup : if (not(xcPopupmenu in adata.SkinControls)) then exit;
  820.      m_menuitem : if (not(xcMainmenu in adata.SkinControls)
  821.           and not(xcMenuitem in adata.SkinControls)) then exit;
  822.      m_systemmenu: if (not(xcSystemmenu in adata.SkinControls)) then exit;
  823.    end;
  824.    amenu:=TWinSkinPopMenu.create;
  825.    amenu.InitSkin(ahwnd,adata,0);
  826.    Mlist.add(amenu);
  827.    if menuactive then amenu.ownerdraw:=true;
  828. end;
  829. function TSkinManage.DeleteMenu(aHwnd:THandle):boolean;
  830. var i: integer;
  831.     sm :TWinSkinPopMenu;
  832. begin
  833.    result:=false;
  834.    //work for multilizer
  835.    //if mlist=nil then exit;
  836.    if IsBadReadPtr(mlist, InstanceSize) then exit;
  837.    for i:=0 to mlist.count-1 do begin
  838.       sm:=TWinSkinPopMenu(mlist[i]);
  839.       if sm.hwnd=ahwnd then begin
  840.          sm.unsubclass;
  841.          mlist.delete(i);
  842.          sm.free;
  843.          result:=true;
  844.          break;
  845.       end;
  846.    end;
  847.    if mlist.count=0 then begin
  848.      menuactive:=false;
  849.          menutype:=0;
  850.    end;
  851. end;
  852. function  TSkinManage.FindSkinMenu(aHwnd:THandle):boolean;
  853. var i: integer;
  854.     sm :TWinSkinPopMenu;
  855. begin
  856.    result:=false;
  857.    for i:=0 to mlist.count-1 do begin
  858.       sm:=TWinSkinPopMenu(mlist[i]);
  859.       if sm.hwnd=ahwnd then begin
  860.          result:=true;
  861.          break;
  862.       end;
  863.    end;
  864. end;
  865. procedure TSkinManage.UpdateSkinMenu(amenu:Hmenu);
  866. var i: integer;
  867.     mh:Thandle;
  868. begin
  869. {   mh:=FindWindowex(0,0,'#32768',nil);
  870.    if (mh<>0) and (mh<>smenu.hwnd) then begin
  871.       smenu.InitSkin(mh,GSkinData,amenu);
  872.    end;}
  873. end;
  874. function  TSkinManage.GetMenuBg(amenu:Hmenu):Tbitmap;
  875. var i: integer;
  876. begin
  877.    result:=nil;
  878.    for I:= 0 to mlist.count-1 do
  879.       if TWinSkinPopMenu(mlist[i]).hmenu=amenu then begin
  880.          result:=TWinSkinPopMenu(mlist[i]).menubg;
  881.          break;
  882.       end;
  883. end;
  884. procedure  TSkinManage.FindPopupMenu(amenu:Hmenu);
  885. var i: integer;
  886. begin
  887.    for I:= 0 to PopupList.count-1 do
  888.       if TPopupMenu(PopupList[i]).handle=amenu then begin
  889.          menuactive:=true;
  890.          break;
  891.       end;
  892. end;
  893. procedure  TSkinManage.SetMDIMax(b:boolean);
  894. var i: integer;
  895.     sf:Twinskinform;
  896.     sd:TSkinData;
  897. begin
  898.    if mdimax=b then exit;
  899.    mdimax:=b;
  900.    sd:=SkinManager.maindata;
  901.    if (xoMDIChildBorder in sd.Options) then exit;
  902.    for I:= 0 to flist.count-1 do begin
  903.       sf:=TWinSkinform(flist[i]);
  904.       if sf.formstyle=sfsmdichild then  begin
  905.         if b then begin
  906.            if sf.crop then sf.Uncropwindow;
  907.            sf.EnableSysbtn(b);
  908.         end else begin
  909.           if sf.windowstate<>swsmin then begin
  910.             sf.windowstate:=swsnormal;
  911.             sf.cropwindow;
  912.             sf.EnableSysbtn(b);
  913.             if not sf.crop then sf.refresh;
  914.           end else sf.EnableSysbtn(true);
  915.         end;
  916.       end;
  917.    end;
  918. //   if b then skinaddlog('***** SetMdiMax True')
  919. //   else skinaddlog('***** SetMdiMax Flase');
  920. end;
  921. procedure  TSkinManage.SetMDIMax2(b:boolean);
  922. var i: integer;
  923.     sf:Twinskinform;
  924. begin
  925.    if mdimax=b then exit;
  926.    mdimax:=b;
  927.    for I:= 0 to flist.count-1 do begin
  928.       sf:=TWinSkinform(flist[i]);
  929.       if sf.formstyle=sfsmdichild then  begin
  930.         if b then begin
  931.            if sf.crop then sf.Uncropwindow;
  932.            sf.EnableSysbtn(b);
  933.         end else begin
  934.           if sf.windowstate<>swsmin then begin
  935.             sf.windowstate:=swsnormal;
  936.             sf.cropwindow;
  937.             sf.EnableSysbtn(b);
  938.             if not sf.crop then sf.refresh;
  939.           end else sf.EnableSysbtn(true);
  940.         end;
  941.       end;
  942.    end;
  943.    if b then skinaddlog('***** SetMdiMax True')
  944.    else skinaddlog('***** SetMdiMax Flase');
  945. end;
  946. procedure  TSkinManage.SetCaption(b:boolean);
  947. var i: integer;
  948.     sf:Twinskinform;
  949.     dwstyle:Dword;
  950. begin
  951.    for I:= 0 to flist.count-1 do begin
  952.       sf:=TWinSkinform(flist[i]);
  953.       if sf.formstyle=sfsmdichild then  begin
  954.         dwstyle := GetWindowLong( sf.hwnd, GWL_STYLE );
  955.         dwstyle := dwstyle or WS_CAPTION;
  956.         SetWindowLong( sf.hwnd, GWL_STYLE, dwstyle );
  957.       end;
  958.    end;
  959. end;
  960. function  TSkinManage.GetMDIChildNum:integer;
  961. var i: integer;
  962.     sf:Twinskinform;
  963. begin
  964.    result:=0;
  965.    for I:= 0 to flist.count-1 do begin
  966.       sf:=TWinSkinform(flist[i]);
  967.       if sf.formstyle=sfsmdichild then
  968.         inc(result);
  969.    end;
  970. end;
  971. {function EnumProp(ahwnd:HWND;prop:Pchar;data:Thandle):boolean;stdcall;
  972. var s:string;
  973.     p:dword;
  974.     buf: array[0..31] of Char;
  975. begin
  976.      //p:=GetProp(ahwnd,prop);
  977. //     s:=format('%4x',[data]);
  978. //     if pos('FF',s)=1 then exit;
  979. //     StrCopy(buf,prop);
  980.     result:=true;
  981.     if ATOM(prop) = dword(prop) then exit;
  982.     result:=true;
  983.     s:=format('%s',[prop]);
  984.     if pos('ControlOfs',s)=1 then begin
  985. //        b:=true;
  986.         result:=false;
  987.     end;
  988. end; }
  989. function TSkinManage.IsDllForm(ahwnd:Thandle):boolean;
  990. var b:boolean;
  991.     i:integer;
  992.    function EnumProp(ahwnd:HWND;prop:Pchar;data:Thandle):boolean;stdcall;
  993.    var s:string;
  994.        p:^integer;
  995.    begin
  996.      result:=true;
  997.      if ATOM(prop) = dword(prop) then exit;
  998.      s:=strpas(prop);
  999.      if pos('ControlOfs',s)=1 then begin
  1000.         result:=false;
  1001.      end;
  1002.    end;
  1003. begin
  1004.   b:=true;
  1005.   i:=0;
  1006.   i:=EnumProps(ahwnd,@enumprop);
  1007.   if i=0 then result:=false
  1008.   else result:=true;
  1009. end;
  1010. function TSkinManage.FindTForm(ahwnd:Thandle):TForm;
  1011. var i:integer;
  1012.    aform:TForm;
  1013. begin
  1014.   aform:=nil;
  1015.   for I := 0 to Screen.FormCount - 1 do  begin
  1016.     if Screen.Forms[I].handle=ahwnd then  begin
  1017.       aform := Screen.Forms[I];
  1018.       break;
  1019.     end;
  1020.   end;
  1021.   if aform=nil then
  1022.       aform:=Tform(FindControlx(ahwnd));
  1023.   result:=aform;
  1024. //  Result := TForm(SendMessage(ahwnd, RM_GetObjectInstance, 0, 0)) ;
  1025. end;
  1026. procedure TSkinManage.SetAction(acode:integer;Interval:integer=250);
  1027. var i:integer;
  1028.     sm:Tskinmanage;
  1029. begin
  1030.    action:=acode;
  1031.    timer.Interval:=interval;
  1032.    if (state=skin_creating) then begin
  1033.      if acode=skin_Active then active:=true
  1034.      else if acode=skin_uninstall then active:=false;
  1035.    end else begin
  1036.       if mode=0 then begin
  1037.          //other skinmanager
  1038.          for i:=0 to sublist.count-1 do begin
  1039.             sm:=TSkinManage(sublist[i]);
  1040.             sm.UpdateData:=UpdateData;
  1041.             if  acode=skin_Active  then begin
  1042.                sm.active:=true ;
  1043.                sm.SetAction(skin_Active,300)
  1044.             end else if  acode=skin_change  then begin
  1045.                //sm.SetAction(skin_change,300)
  1046.             end else if  acode=skin_uninstall  then
  1047.                sm.active:=false;
  1048.          end;
  1049.       end;   
  1050.       timer.enabled:=true;
  1051.    end;
  1052. end;
  1053. function EnumWindow(ahwnd :HWND;lParam: LPARAM):boolean;stdcall;
  1054. var s:string;
  1055.     r:Trect;
  1056. begin
  1057.    result:=false;
  1058. //   if (GetParent(ahwnd)= lparam) then begin
  1059.       s:=getwindowclassname(ahwnd);
  1060.       getwindowrect(ahwnd,r);
  1061. //      skinaddlog(format('***enumWindow %1x,%s (%1d,%1d,%1d,%1d)',
  1062. //             [ahwnd,s,r.left,r.top,r.right,r.bottom]));
  1063.       result:=true;
  1064. //   end;
  1065. end;
  1066. function EnumAddWindow(ahwnd :HWND;lParam: LPARAM):boolean;stdcall;
  1067. var s:string;
  1068.     r:Trect;
  1069. begin
  1070.    result:=true;
  1071.    Skinmanager.addform(ahwnd);
  1072. end;
  1073. procedure TSkinManage.DeleteSysbtn;
  1074. var i: integer;
  1075.     sf :TWinSkinform;
  1076. begin
  1077.    for i:= 0 to flist.count-1 do begin
  1078.       sf:=TWinSkinform(flist[i]);
  1079.       if sf.fsd=updatedata then
  1080.         sf.DeleteSysbtn;
  1081.    end;
  1082. end;
  1083. function TSkinManage.initsb(ahwnd:Thandle):boolean;
  1084. begin
  1085.    result:=false;
  1086.    if SBinstall and (@pinitsb<>nil) then
  1087.        result := boolean(pinitsb(ahwnd));
  1088. end;
  1089. function TSkinManage.Uninitsb(ahwnd:Thandle):boolean;
  1090. begin
  1091.    result:=false;
  1092.    if SBinstall and (@pUninitsb<>nil) then
  1093.        result := boolean(pUninitsb(ahwnd));
  1094. end;
  1095. procedure TSkinManage.WndProc(var Msg: TMessage);
  1096. var ahwnd:hwnd;
  1097.     sf :TWinSkinform;
  1098. begin
  1099.     if (msg.Msg = CN_SkinNotify ) then begin
  1100.         ahwnd:=msg.LParam;
  1101.         if (msg.WParam=skin_update) then begin
  1102.           sf := TWinSkinform(findskinform(ahwnd));
  1103.           if sf<>nil then begin
  1104.              application.ProcessMessages();
  1105.              sleep(10);
  1106.              sf.UnSubclass();
  1107.              sf.skinstate:=skin_Deleted;
  1108.              deleteDeleted;
  1109.              sleep(10);
  1110.              application.ProcessMessages();
  1111.              AddForm(ahwnd);
  1112.           end;
  1113.         end;
  1114.         msg.result:=0;
  1115.     end  else
  1116.     msg.Result := DefWindowProc(handle, msg.msg, msg.wParam, msg.lParam);
  1117. end;
  1118. procedure TSkinManage.OnTimer(Sender: TObject);
  1119. var i: integer;
  1120.     sf :TWinSkinform;
  1121.     sd: TSkindata;
  1122.     sm:Tskinmanage;
  1123.     ahwnd:Thandle;
  1124. begin
  1125.    timer.enabled:=false;
  1126.    if UpdateData=nil then exit;
  1127.    sd := TSkindata(updateData);
  1128.    if sd.SkinFormtype = sfOnlyThisForm then begin
  1129.       case action of
  1130.         skin_uninstall:begin
  1131.           active:=false;
  1132.           DeleteDeleted;
  1133.           for i:= flist.count-1 downto 0 do begin
  1134.              sf:=TWinSkinform(flist[i]);
  1135.              if sf.fsd = sd then begin
  1136.                  sf.unsubclass;
  1137.                  sf.repaint(sf.hwnd);
  1138.                  flist.delete(i);
  1139.                  sf.free;
  1140.                  break;
  1141.              end;
  1142.           end;
  1143.         end;
  1144.        skin_change:begin
  1145.           DeleteDeleted;
  1146.           for i:= 0 to flist.count-1 do begin
  1147.              sf:=TWinSkinform(flist[i]);
  1148.              if (sf.fsd = sd) then begin
  1149.                 sf.DeleteSysbtn;
  1150.                 sf.InitSkinData;
  1151.                 sf.skinchange;
  1152.                 break;
  1153.              end;
  1154.           end;
  1155.         end;
  1156.        skin_Active: begin
  1157.          active:=true;
  1158.          skinchildform:=true;
  1159. //         EnumThreadWindows(GetCurrentThreadId,@EnumAddWindow,0);
  1160.          for I := Screen.FormCount - 1 downto 0 do  begin
  1161.               if Screen.Forms[I]=sd.Owner then begin
  1162.                 activeform(Screen.Forms[I]);
  1163.                 break;
  1164.               end;
  1165.          end;
  1166.          skinchildform:=false;
  1167.         end;
  1168.        skin_deleted : deleteform3;
  1169.       end;//endcase
  1170.       sd.doskinchanged;
  1171.       UpdateData:=nil;
  1172.    end else begin
  1173.    case action of
  1174.      skin_Active: begin
  1175.          active:=true;
  1176.          wmsetdraw:=false;
  1177.          skinchildform:=true;
  1178. //         EnumThreadWindows(GetCurrentThreadId,@EnumAddWindow,0);
  1179.          DeleteDeleted;
  1180.          for I := Screen.FormCount - 1 downto 0 do  begin
  1181.               ActiveForm(Screen.Forms[I]);
  1182.          end;
  1183.          skinchildform:=false;
  1184.          if mode=0 then begin
  1185.             for i:=0 to sublist.count-1 do begin
  1186.                sm:=TSkinManage(sublist[i]);
  1187.                sm.UpdateData:=UpdateData;
  1188.                sm.active:=true ;
  1189.                sm.SetAction(skin_Active,300)
  1190.             end;
  1191.          end;
  1192.       end;
  1193.       skin_uninstall:begin
  1194.           active:=false;
  1195.           DeleteDeleted;
  1196. {          for i:= flist.count-1 downto 0 do begin
  1197.              sf:=TWinSkinform(flist[i]);
  1198.              sf.unsubclass;
  1199.              sf.repaint(sf.hwnd);
  1200.              flist.delete(i);
  1201.              sf.free;
  1202.           end;}
  1203.           while flist.count>0 do begin
  1204.              sf:=TWinSkinform(flist[0]);
  1205.              sf.unsubclass;
  1206.              sf.repaint(sf.hwnd);
  1207.              flist.delete(0);
  1208.              sf.free;
  1209.           end;
  1210.          if mode=0 then begin
  1211.             for i:=0 to sublist.count-1 do begin
  1212.                sm:=TSkinManage(sublist[i]);
  1213.                sm.active:=false ;
  1214.             end;
  1215.          end;
  1216. {          for i:= flist.count-1 downto 0 do begin
  1217.              sf:=TWinSkinform(flist[i]);
  1218.              sf.unsubclass;
  1219.              sf.repaint(sf.hwnd);
  1220.              flist.delete(i);
  1221.              sf.free;
  1222.           end;}
  1223.       end;
  1224.       skin_change:begin
  1225.           DeleteDeleted;
  1226.           for i:= 0 to flist.count-1 do begin
  1227.              sf:=TWinSkinform(flist[i]);
  1228.              if (sf.fsd = sd) {and (sf.mode=mode)} then begin
  1229.                sf.DeleteSysbtn;
  1230.                sf.InitSkinData;
  1231.              end;
  1232.           end;
  1233. //          for i:= flist.count-1 downto 0 do begin
  1234.           for i:= 0 to flist.count-1 do begin
  1235.              sf:=TWinSkinform(flist[i]);
  1236.              if (sf.fsd = sd) {and (sf.mode=mode)}then
  1237.                sf.skinchange;
  1238.           end;
  1239.       end;
  1240.       skin_deleted : deleteform3;
  1241.       skin_update  : begin
  1242.           ahwnd:=lpara;
  1243.           sf := TWinSkinform(findskinform(ahwnd));
  1244.           if sf<>nil then begin
  1245.              sf.UnSubclass();
  1246.              sf.skinstate:=skin_Deleted;
  1247.              deleteDeleted;
  1248.              AddForm(ahwnd);
  1249.           end;
  1250.           exit;
  1251.       end;
  1252.    end;//endcase
  1253.    sd.doskinchanged;
  1254.    UpdateData:=nil;
  1255.    end;
  1256. end;
  1257. function LCIDToCodePage(ALcid: LCID): Cardinal;
  1258. var
  1259. //  {$IFDEF VER230}
  1260. //    Buf: array[0..6] of WideChar;
  1261. //  {$else}
  1262.   Buf: array[0..6] of Char;
  1263. //  {$endif}
  1264. begin
  1265.   GetLocaleInfo(ALcid, LOCALE_IDefaultAnsiCodePage, Buf, 6);
  1266.   Result := StrToIntDef(Buf, GetACP);
  1267. end;
  1268. procedure InitMsg;
  1269. var AtomText: array[0..31] of Char;
  1270. begin
  1271.   PropName := Format('ControlOfs%.8X%.8X', [HInstance, GetCurrentThreadID]);
  1272.   RM_GetObjectInstance := RegisterWindowMessage(PChar(PropName));
  1273.   DefaultUserCodePage := CP_ACP;
  1274.   myinstance:=HInstance;
  1275. //  DefaultUserCodePage := 3; //CP_THREAD_ACP
  1276.   ControlAtom := GlobalAddAtom(
  1277.     StrFmt(AtomText, 'ControlOfs%.8X%.8X', [HInstance, GetCurrentThreadID]));
  1278. end;
  1279. Procedure Fini;
  1280. var i:integer;
  1281. begin
  1282.   if skinmanager<>nil then
  1283.       SkinManager.free;
  1284.   SkinManager:=nil;
  1285. end;
  1286. initialization
  1287.   Win32PlatformIsUnicode := (Win32Platform = VER_PLATFORM_WIN32_NT);
  1288.   isVista := (Win32MajorVersion <> 6) ;
  1289.   InitMsg;
  1290.   appDestory := false;
  1291. //  Win32PlatformIsUnicode := false;
  1292. //  skinmanager := TSkinManage.create;
  1293. //  skinmanager.installhook;
  1294. finalization
  1295.    fini;
  1296. //  if skinmanager<>nil then
  1297. //      SkinManager.free;
  1298. //  SkinManager:=nil;
  1299. end.