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

Delphi控件源码

开发平台:

Delphi

  1.      end;
  2.      if FMDIObjectInst<>nil then begin
  3.        unsubclassMDI;
  4.      end;
  5.      //captionbuf.assign(nil);
  6.      GetWindowRect(hwnd,r2);
  7.      p:=point(r2.left,r2.top);
  8.      if formstyle=sfsmdichild then
  9.        screentoclient(skinmanager.clienthwnd,p);
  10.      w:=(r2.right-r2.left)-(bw.left+bw.right-oldsize.right);
  11.      h:=(r2.bottom-r2.top)-(bw.top+{menuheight+}bw.bottom-oldsize.bottom);
  12.      if (Skinstate<>skin_Destory) and ((formstyle=sfsmdichild) or ((dwstyle and ws_child)=0)) then
  13.      SetWindowPos(hwnd, 0, p.x, p.y,w,h,
  14.        SWP_DRAWFRAME or SWP_NOZORDER or SWP_NOACTIVATE);
  15.      SetWindowRgn(hwnd,0,true);
  16.      if crop then begin //uncropwindow;
  17.         deleteobject(winrgn);
  18.         crop:=false;
  19.      end;
  20. end;
  21. procedure TWinSkinForm.UnSubclass3;
  22. var w,h:integer;
  23.     p:Tpoint;
  24.     r2:Trect;
  25.     style:dword;
  26. begin
  27.   if not sMainMenu then begin
  28.      Unsubclass2;
  29.      exit;
  30.   end;
  31. //  if fform<>nil then InitPopmenu(fform,false,false);
  32.   if  sysmenu<>nil then begin
  33.     sysmenu.free;
  34.     sysmenu:=nil;
  35.   end;
  36.      timer.enabled:=false;
  37.      if fobjectinst=nil then exit;
  38.      if (fform<>nil) and assigned(oldwndproc) then begin
  39.           fform.WindowProc := OldWndProc;
  40.           oldwndproc:=nil;
  41.      end;
  42.      if fobjectinst<>nil then begin
  43.        if isunicode then
  44.           SetWindowLongW(hwnd, GWL_WNDPROC,LongInt(FPrevWndProc))
  45.        else
  46.           SetWindowLong(hwnd, GWL_WNDPROC,LongInt(FPrevWndProc));
  47.        FreeObjectInstance(FObjectInst);
  48.        fobjectinst:=nil;
  49.      end;  
  50.      //if mode=0 then
  51.      DeleteControls;
  52.      if menu<>nil then begin
  53.        menu.free;
  54.        menu:=nil;
  55.      end;
  56.      //captionbuf.assign(nil);
  57. end;
  58. procedure TWinSkinForm.UnSubclass2;
  59. var i:integer;
  60. begin
  61.      timer.enabled:=false;
  62.      DeleteControls;
  63.      if fform<>nil then begin
  64.         InitPopMenu(fform,false,false);
  65.         if (xcMenuitem in fsd.SkinControls) then
  66.             InitMainMenu(fForm,false,false);
  67.         if Skinstate<>skin_Destory then fform.color:=formcolor;
  68.      end;
  69.      if fobjectinst<>nil then begin
  70.         if isunicode then
  71.            SetWindowLongW(hwnd, GWL_WNDPROC,LongInt(FPrevWndProc))
  72.         else
  73.           SetWindowLong(hwnd, GWL_WNDPROC,LongInt(FPrevWndProc));
  74.         FreeObjectInstance(FObjectInst);
  75.         fobjectinst:=nil;
  76.      end;
  77.      if FMDIObjectInst<>nil then begin
  78.        unsubclassMDI;
  79.      end;
  80.      if fform=nil then exit;
  81.      if Skinstate<>skin_Destory then
  82.         for i := 0 to fForm.ComponentCount - 1 do begin
  83.             if fForm.Components[i] is Tcontrol then
  84.              Tcontrol(fForm.Components[i]).invalidate;
  85.         end;
  86. end;
  87. procedure TWinSkinForm.AfterSkin;
  88. var i:integer;
  89.     sc:Tskincontrol;
  90. begin
  91.    SendMessage(Hwnd, CM_BERUN, 0, BE_ID);
  92.    if assigned(fsd.OnAfterSkinForm) then
  93.      fsd.OnAfterSkinForm(fform,hwnd,formclass);
  94.    exit;
  95.    if fform=nil then exit;
  96. {$IFNDEF COMPILER_6_UP}
  97. {   for i:= 0 to controllist.count-1 do begin
  98.        sc:=Tskincontrol(controllist.items[i]);
  99.        if assigned(sc.control) and (sc.control is Tscrollbox) then begin
  100.           TSkinScrollbar(sc).vb.visible:=true;
  101.           TSkinScrollbar(sc).hb.visible:=true;
  102.           //control.invalidate;
  103.        end;
  104.    end; }
  105. {$ENDIF}
  106. end;
  107. procedure TWinSkinForm.StopUpdate;
  108. var dw:dword;
  109. begin
  110.     if not skinmanager.wmsetdraw then exit;
  111.     if not ischildform  and  sMainMenu and (formborder<>sbsnone)then begin
  112.       dw := GetWindowLong(hwnd, GWL_STYLE);
  113.       dw := dw and not WS_VISIBLE;
  114.       SetWindowLong(hwnd, GWL_STYLE, dw);
  115. //       sendmessage(hwnd,WM_SETREDRAW,0,0);
  116.     end;
  117. end;
  118. procedure TWinSkinForm.BeginUpdate;
  119. var dw:dword;
  120. begin
  121. //    exit;
  122. // has problem in virtual treeview demo, so give up
  123.     if not skinmanager.wmsetdraw then exit;
  124.     // only work for first form
  125.     skinmanager.wmsetdraw:=false;
  126.     dw := GetWindowLong(hwnd, GWL_STYLE);
  127.     if (dw and WS_VISIBLE)=0 then begin
  128.       dw := dw or WS_VISIBLE;
  129.       SetWindowLong(hwnd, GWL_STYLE, dw);
  130.     end;
  131. {    if not ischildform  and  sMainMenu then begin
  132.        sendmessage(hwnd,WM_SETREDRAW,1,0);
  133.        Application.ProcessMessages;
  134.        if IsWindowVisible(hwnd) then
  135.           RedrawWindow(hwnd,0,0,RDW_INVALIDATE+RDW_INTERNALPAINT+RDW_ERASE);
  136.     end;}
  137. end;
  138. procedure TWinSkinForm.WinWndProc(var aMsg: TMessage);
  139. var b1,b2,b3,b4,b5: boolean;
  140.     s:string;
  141. begin
  142.   {$IFDEF test}
  143.       s:= MsgtoStr(aMsg);
  144.       dolog(s);
  145.   {$ENDIF}
  146.   if (skinstate=skin_Creating) then begin
  147.       if (amsg.Msg=WM_NCPAINT) then begin
  148.        amsg.Result := 0  ;
  149.        exit;
  150.       end;
  151.   end;
  152.   b3:=false;b4:=false;
  153.   case amsg.Msg of
  154. {      WM_STYLECHANGED : begin
  155.           if amsg.wParam=GWL_STYLE then
  156.             dwstyle:= PSTYLESTRUCT(amsg.lParam)^.styleNew;
  157.           default(amsg);
  158.           end;  }
  159. //      WM_GETICON:   default(amsg);
  160.       CN_IsSkined :  begin
  161.            amsg.result := 1;
  162. //          fsd.DoDebug('CN_IsSkined');
  163.            PostMessage(Hwnd, CM_BERUN, 0, BE_ID);
  164.           end;
  165.       174: amsg.Result:=0;
  166.       WM_NCDESTROY: begin
  167. //          skinaddlog('WM_NCDESTROY '+caption);
  168. //          fsd.DoDebug('***WM_NCDESTROY '+caption);
  169.           Skinstate:=skin_Destory;
  170.           //if ischildform then
  171.           unsubclass3;
  172.           default(amsg);
  173.           Skinstate:=skin_Deleted;
  174.         end;
  175.       WM_ERASEBKGND:WMERASEBKGND(aMsg);
  176.       WM_CTLCOLORSTATIC:WMCtlcolor(amsg);
  177.       WM_CTLCOLORBTN: begin
  178.           default(amsg);
  179.           if fform=nil then
  180.            SetBkMode(amsg.wparam,TRANSPARENT);
  181.         end;
  182.       WM_INITMENUPOPUP: begin
  183.            if amsg.WParam=hsysmenu then
  184.                skinmanager.menutype:=m_systemmenu
  185.            else
  186.                skinmanager.menutype:=m_menuitem;
  187.            default(amsg);
  188.         end;
  189.       WM_NCACTIVATE : begin
  190.          if (skinstate=skin_Creating) and (formstyle<>sfsMDIChild) then
  191.              amsg.Result := 0
  192.           else if not sMainMenu then
  193.              default(amsg)
  194.           else b3:=true;
  195.         end;
  196.       CN_ReCreateWnd: begin
  197.            WMReCreateWnd(amsg);
  198.         end;
  199.       CN_NewForm:begin
  200.           factive:=true;
  201. //          GetClientRect(hwnd,fClientRect);
  202.           hsysmenu:=GetSystemMenu(hWnd, FALSE);
  203.           geticon(iconbmp);
  204. //          createsysmenu2;
  205.           GetBorderSize;
  206.           BeginUpdate();
  207.           if fform<>nil then
  208.               InitControls(fform)
  209.           else InitHwndControls(hwnd);
  210.           if (skinstate=skin_Creating) then begin
  211.             if (formstyle=sfsmdichild) then begin
  212.                if (windowstate=swsmax) then begin
  213. //                  if not skinmanager.MDIMax then
  214. //                     skinmanager.setmdimax(true);
  215.                  postmessage(skinmanager.clienthwnd,CN_NewMDIChild,hwnd,0);
  216.                  //postMessage(skinmanager.MDIForm.Handle, CN_FormUPdate, 0,0);
  217.                end else if (windowstate=swsnormal) then begin
  218.                  skinstate:=skin_Updating;
  219.                  resizeform(0);
  220.                  skinstate:=Skin_Active;
  221.                  //LockWindowUpdate(0);
  222.                  cropwindow;
  223.                end else Enablesysbtn(true);
  224.             end else begin
  225.                if  not (ischildform or (formborder=sbsnone))
  226.                   and (windowstate<>swsmin) then begin
  227.                  skinstate:=skin_Updating;
  228.                  resizeform(0);
  229.                  skinstate:=Skin_Active;
  230.                  //LockWindowUpdate(0);
  231.                  if (windowstate=swsnormal) then cropwindow
  232.                  else refresh;
  233.                end;
  234.             end;
  235.           end;
  236.           AfterSkin;
  237.           skinstate:=Skin_Active;
  238.           dolog('*****Skin Active finish');
  239.           //if (fform<>nil) then fform.Perform(CM_ACTIVATE,0,0);
  240.           timer.enabled:=true;
  241.        end;
  242.       else begin
  243.         if not sMainMenu then
  244.              default(amsg)
  245.         else b3:=true;
  246.       end;
  247.   end;
  248. //  if not (xcMainMenu in fsd.SkinControls) then exit;
  249.   //go, two message has handle
  250.   if not b3 then exit;
  251.   //embeded form
  252.   if (not(formstyle=sfsmdichild)) and ((dwstyle and ws_child)>0) and b3 then begin
  253.      default(amsg);
  254.      exit;
  255.   end;
  256.   b3:=false;b4:=false;
  257.   case amsg.Msg of
  258.       WM_SysCommand: WMSysCommand(amsg);
  259.       WM_Command: WMCommand(amsg);
  260.       WM_WINDOWPOSCHANGED:WMWINDOWPOSCHANGED(amsg);
  261.       WM_NCACTIVATE: begin ;
  262.              fwindowactive:=BOOLean(amsg.wParam);
  263.              b3:=true;
  264.            end;
  265.       WM_ACTIVATE: begin ;
  266.              fwindowactive:=BOOLean(amsg.wParam);
  267.              b3:=true;
  268.            end;
  269. //      CN_UPdateMainMenu:updatemainmenu;
  270.       WM_CTLCOLORSTATIC:WMCtlcolor(amsg);
  271.       WM_CTLCOLORBTN: begin
  272.           default(amsg);
  273.           if fform=nil then
  274.            SetBkMode(amsg.wparam,TRANSPARENT);
  275.         end;
  276.       WM_GETMINMAXINFO:WMGETMINMAXINFO(amsg);
  277.       CM_MENUCHANGED: begin
  278.            b5:= fsd.menumsg;
  279.            fsd.menumsg := false;
  280.            default(amsg);
  281.            fsd.menumsg := b5;
  282.            if (getmenu(hwnd)<>0) then  begin
  283.              if (menu<>nil) and fsd.menuupdate then  begin
  284.                  menu.hmenu := getmenu(hwnd);
  285.                  //SetMenu(hwnd, 0);
  286.                  if fsd.MenuMerge then  menu.updatabtn
  287.                  else menu.updatabtn;
  288.              end;
  289.              setmenu(hwnd,0)
  290.            end ;
  291. {           if (menu<>nil) and fsd.menuupdate
  292.              and (getmenu(hwnd)<>0) then  begin
  293.                  menu.hmenu := getmenu(hwnd);
  294.                  //SetMenu(hwnd, 0);
  295.                  if fsd.MenuMerge then  menu.updatabtn
  296.                  else menu.updatabtn;
  297.            end ;
  298.            if (getmenu(hwnd)<>0) then setmenu(hwnd,0);  //remove menu}
  299.          end;
  300.       CN_MenuSelect: MenuSelect(amsg);
  301.       WM_SIZE: WMSize(amsg);
  302.       WM_SetICON : begin
  303.               default(amsg);
  304.               geticon(iconbmp);
  305.          end;
  306. //      WM_NCPAINT: WMNCPaint(amsg) ;
  307.       else b3:=true;
  308.   end;
  309.   b1:=(formstyle=sfsmdichild) and (windowstate=swsmax);//<>swsnormal);
  310.   b2:=false;
  311. //  b2:=(windowstate=swsmin);
  312.   if b1 or b2 or (skinstate=Skin_Creating) then begin
  313.      if b3 then default(amsg);
  314.      exit;
  315.   end;
  316.   case amsg.Msg of
  317.       WM_NCPAINT: WMNCPaint(amsg) ;
  318.       WM_NCACTIVATE:WMNcactive(amsg) ;
  319.       WM_NCCALCSIZE: WMNCCalcSize(amsg);
  320.       WM_SIZE: WMSize(amsg);
  321.       WM_NCMouseMove:WMNCMouseMove(amsg);
  322.       WM_NCLButtonDown:WMNCLButtonDown(amsg);
  323.       WM_NCLBUTTONDBLCLK :WMNCLBUTTONDBLCLK(amsg);
  324.       WM_NCLButtonUp : WMNCLButtonUp(amsg);
  325.       WM_NCRBUTTONDOWN : WMNCRButtonUp(amsg);
  326. //      WM_SysCommand: WMSysCommand(amsg);
  327. //      WM_Command: WMCommand(amsg);
  328.       WM_NCHitTest:WMNCHitTest(amsg);
  329.       WM_MEASUREITEM:WMMEASUREITEM(amsg);
  330.       WM_DRAWITEM:WMDRAWITEM(amsg);
  331.       WM_WINDOWPOSCHANGING: WMWindowPosChanging(amsg);
  332. //      WM_Paint:WMPaint(amsg);
  333. //      WM_CTLCOLORSTATIC:WMCtlcolor(amsg);
  334.       CN_FormUPdate:updatenc;
  335.       else b4:=true;
  336.   end;
  337.   if b3 and b4 then default(amsg);
  338. //    doLog('error');
  339. end;
  340. procedure TWinSkinForm.WMMDIACTIVATE(var aMsg: TMessage);
  341. begin
  342.     exit;
  343.     if not skinmanager.mdimax then exit;
  344.     //MDIChild DeActive
  345.     if (formstyle=sfsmdichild) and (hwnd=amsg.wparam) then
  346.        enablesysbtn(false);
  347.     if (formstyle=sfsmdichild) and (hwnd=amsg.Lparam) then
  348.        enablesysbtn(true);
  349. end;
  350. {procedure TWinSkinForm.WinWndProc(var aMsg: TMessage);
  351. var
  352.   Old: boolean;
  353. begin
  354.   Done := false;
  355.   with aMsg do begin
  356.     case Msg of
  357. //      WM_ACTIVATE:WMactive(amsg) ;
  358.       WM_NCPAINT: WMactive(amsg) ;
  359.       WM_NCACTIVATE:WMNcactive(amsg) ;
  360.       WM_NCCALCSIZE: WMNCCalcSize(amsg);
  361.       WM_SIZE: WMSize(amsg);
  362.       WM_NCMouseMove:WMNCMouseMove(amsg);
  363.       WM_NCLButtonDown:WMNCLButtonDown(amsg);
  364.       WM_NCLBUTTONDBLCLK :WMNCLBUTTONDBLCLK(amsg);
  365.       WM_NCLButtonUp : WMNCLButtonUp(amsg);
  366.       WM_NCRBUTTONDOWN : WMNCRButtonUp(amsg);
  367.       WM_SysCommand: WMSysCommand(amsg);
  368.       WM_Command: WMCommand(amsg);
  369.       WM_NCHitTest:WMNCHitTest(amsg);
  370. //      WM_INITMENU:WMINITMENU(amsg.wparam);
  371. //      WM_INITMENUPopup:WMINITMENU(amsg.wparam);
  372. //      WM_MEASUREITEM:WMMEASUREITEM(amsg);
  373.       WM_DRAWITEM:WMDRAWITEM(amsg);
  374. //      WM_Paint:WMPaint(amsg);
  375. //      WM_WINDOWPOSCHANGED:WMWINDOWPOSCHANGED(amsg);
  376.       WM_ERASEBKGND:WMERASEBKGND(aMsg);
  377.       WM_CTLCOLORSTATIC:WMCtlcolor(amsg);
  378.       WM_SETTEXT : begin
  379.             dolog('WM_SETTEXT');
  380.           end;
  381.       CN_SkinChanged:begin
  382.          resizeform(1);
  383.          cropwindow;
  384.          done:=true;
  385.        end;
  386.       WM_DESTROY: begin
  387.         if FMDIObjectInst<>nil then unsubclassMDI;
  388.         if fobjectinst<>nil then begin
  389.            SetWindowLong(hwnd, GWL_WNDPROC,LongInt(FPrevWndProc));
  390.            FreeObjectInstance(FObjectInst);
  391.            fobjectinst:=nil;
  392.            if crop then deleteobject(winrgn);
  393.         end;
  394.       end;
  395.     end;
  396.   end;
  397.   if not Done then default(amsg);
  398. //    doLog('error');
  399. end;}
  400. procedure TWinSkinForm.WMMDITile(var aMsg: TMessage);
  401.   procedure setcaption(b:boolean);
  402.   var i:integer;
  403.       fm:Tform;
  404.       dw:dword;
  405.   begin
  406.       for i:= 0 to fform.MDIChildCount-1 do begin
  407.          fm:=fform.MDIChildren[i];
  408.          dw := GetWindowLong(fm.Handle, GWL_STYLE );
  409.          if b then dw:=dw or WS_CAPTION
  410.          else dw := dwstyle and ( not WS_CAPTION);
  411.          SetWindowLong(fm.Handle, GWL_STYLE,dw );
  412.       end;
  413.   end;
  414. begin
  415.   setcaption(true);
  416.   defaultMDI(amsg);
  417.   setcaption(false);
  418. end;
  419. procedure TWinSkinForm.WinMDIProc(var aMsg: TMessage);
  420. var s:string;
  421.     mdidone,bmax:boolean;
  422.     style,isskin:longint;
  423.     b,b1:boolean;
  424.     ahwnd:THandle;
  425. begin
  426.     s:='';
  427.     mdidone:=true;
  428.     b:= sMainmenu;
  429.     case amsg.Msg of
  430.       CN_NewMDIChild : begin
  431.            RedrawWindow(hwnd,0,0,
  432.             RDW_UPDATENOW or RDW_ALLCHILDREN or RDW_ERASE or RDW_FRAME or RDW_INVALIDATE);
  433.           end;
  434.       WM_NCDESTROY: begin
  435.            defaultMDI(amsg);
  436.            unsubclassMDI;
  437.         end;
  438.       WM_NCCALCSIZE:begin
  439.          if b then begin
  440.             Style := GetWindowLong(clienthwnd, GWL_STYLE);
  441.             Style := style and (not WS_HSCROLL);
  442.             Style := style and (not WS_VSCROLL);
  443.             if not (xoMDIScrollbar in fsd.Options) then
  444.               SetWindowLong(clienthwnd, GWL_STYLE, Style);
  445.          end;
  446.          defaultMDI(amsg);
  447.          end;
  448.       WM_MDIACTIVATE: begin
  449.            defaultMDI(amsg);
  450.          end;
  451.       WM_MDICREATE: begin
  452.            //mdi do not handle CM_MenuChange
  453.            fsd.menuUpdate:=false;
  454.            defaultMDI(amsg);
  455.            //newchildhwnd:=amsg.result;
  456.          end;
  457.       WM_MDIDESTROY: begin
  458.            //s:='WM_MDIDESTROY '+format('%4x',[amsg.wparam]);
  459.            //skinmanager.deleteform(amsg.wparam);
  460.            defaultMDI(amsg);
  461.            if b then begin
  462.               skinmanager.setmdimax(MDIChildMax);
  463.               ahwnd:=sendmessage(clienthwnd,WM_MDIGETACTIVE,0,longint(@b1));
  464.               if (menu<>nil) and (ahwnd=0) then begin
  465.                  fsd.menuUpdate:=menuauto;
  466.                  menu.UpdataBtn;
  467.               end;
  468.            end;
  469.          end;
  470.       WM_MDICASCADE,WM_MDITILE: begin
  471.            if b and (skinmanager.mdimax) then
  472.                 skinmanager.setmdimax(false);
  473.            defaultMDI(amsg);
  474.          end;
  475.       WM_MDIREFRESHMENU : begin
  476.             defaultMDI(amsg);
  477. {            if (newchildhwnd<>0) then begin
  478.               skinmanager.addform(newchildhwnd);
  479.               postMessage(hwnd, CN_FormUPdate, 0,0);
  480.               newchildhwnd:=0;
  481.             end else begin
  482.                ahwnd:=sendmessage(clienthwnd,WM_MDIGETACTIVE,0,longint(@b));
  483.                if ahwnd<>0 then begin
  484.                   isskin :=sendmessage(ahwnd,CN_IsSkined,0,0);
  485.                   if isskin=0 then begin
  486.                        skinmanager.addform(ahwnd);
  487.                        postMessage(hwnd, CN_FormUPdate, 0,0);
  488.                   end;
  489.                end;
  490.             end; }
  491.          end;
  492.          //older code , menu merger work.
  493. {       WM_MDISETMENU : begin
  494.            defaultMDI(amsg);
  495.            if (menu<>nil) and (amsg.WParam<>0) then
  496.                  menu.updatabtn2(amsg.WParam)
  497.            else if (menu<>nil) then menu.updatabtn;
  498.          end;}
  499.        WM_MDISETMENU : begin
  500.            defaultMDI(amsg);
  501.            //DrawMenuBar(hwnd);
  502.            if b then begin
  503.               if (amsg.WParam<>0) and (menu<>nil) then begin
  504.                   //skinaddlog('WM_MDISETMENU*************');
  505.                  //when child menu merge main menu, it do not call
  506.                  //when active update,menu do not paint, menubutton.bounds=0,
  507.                  //so call setmenurect;
  508.                   menu.updatabtn2(amsg.WParam);//getmenu(hwnd));
  509.                   //bcb6 has bug
  510.                   //menu.SetMenuRect;
  511.               end ;
  512.               SetMenu(hwnd, 0);
  513.            end;
  514.          end;
  515.        else defaultMDI(amsg);
  516.     end;
  517. //   if mdidone then defaultMDI(amsg);
  518. //    if s<>'' then skinaddlog('**MDI: '+s);
  519. end;
  520. procedure TWinSkinForm.WMNCLBUTTONDBLCLK(Var Msg: TMessage);
  521. var P: TPoint;
  522.     btn:TNCobject;
  523.     b:boolean;
  524.     i:integer;
  525. begin
  526. //  if not fwindowactive then exit;
  527.   P := GetWinXY(msg.LParamLo,msg.LParamhi);
  528.   btn := findbtn(p);
  529.   b:=false;
  530.   if (btn<>nil) then begin
  531.     i:= TWinsysbutton(btn).data.Action;
  532.     if (i=3) or (i=11) then begin
  533.          timer.enabled:=false;
  534.          postmessage(hwnd,WM_SYSCOMMAND,SC_CLOSE,0);
  535.     end;
  536.   end else begin
  537.     if (windowstate <> swsnormal) then
  538.               restore
  539.     else if (sbiMax in formIcons) then
  540.        maximize
  541.     else default(msg);
  542.   end;
  543.   done:=true;  
  544. end;
  545. procedure TWinSkinForm.WMCtlcolor(Var Msg: TMessage);
  546. begin
  547.    default(msg);
  548.    if fform=nil then begin
  549.       SetBkMode(msg.wparam,TRANSPARENT);
  550.       msg.Result:=fsd.BGBrush;
  551.    end;
  552. //   msg.Result:=fsd.BGBrush;
  553. end;
  554. procedure TWinSkinForm.Default(Var Msg: TMessage);
  555. begin
  556.   msg.result:=CallWindowProc(FPrevWndProc,hwnd,Msg.msg,msg.WParam,msg.LParam);
  557. end;
  558. procedure TWinSkinForm.WMNCActive(Var Msg: TMessage);
  559. var b,b1:boolean;
  560. begin
  561. {$ifdef ver130}
  562.     if Msg.WParamLo<>WA_INACTIVE then begin
  563. //       ShowWindow(Application.Handle, SW_SHOWNORMAL);
  564.     end;
  565. {$endif ver130}
  566.     fwindowactive:=BOOLean(msg.wParam);
  567.     timer.enabled:= fwindowactive;
  568.     if (not timer.enabled) and (activeskincontrol<>nil) then begin
  569.        activeskincontrol.mouseleave;
  570.        activeskincontrol:=nil;
  571.     end;
  572.     b:= (formstyle=sfsmdichild) and (windowstate=swsmax);//<>swsnormal);
  573.     if formstyle=sfsMDIform then begin
  574.        sendmessage(Clienthwnd,WM_NCACTIVATE,msg.wparam,0);
  575.        //default(msg);
  576.     end else if (formstyle=sfsMDIChild) then begin
  577.       default(msg);
  578.     end ;
  579.     if not b then updatenc;
  580.     msg.result:=1;  
  581. end;
  582. procedure TWinSkinForm.WMSize(Var Msg: TMessage);
  583. begin
  584.    default(msg);
  585.    case msg.wparam of
  586.      SIZE_RESTORED   :windowstate:=swsnormal;
  587.      SIZE_MINIMIZED  : windowstate:=swsmin;
  588.      SIZE_MAXIMIZED  : windowstate:=swsmax;
  589.    end;
  590.    if windowstate=swsmin then exit;
  591.    if (formstyle=sfsmdichild) and
  592.    ((skinmanager.mdimax) or (windowstate<>swsnormal)) then exit;
  593.    if (skinstate=skin_active) or (skinstate=skin_change) then
  594.     cropwindow;
  595. end;
  596. procedure TWinSkinForm.WMGetMinMaxInfo(Var Msg: TMessage);
  597. var phwnd:Thandle;
  598.     r:Trect;
  599.     w:integer;
  600. begin
  601. //   enablesysbtn(true);
  602.    default(msg);
  603.    GetWindowstate;
  604.    if windowstate=swsmin then
  605.          enablesysbtn(true)
  606.    else if (formstyle=sfsmdichild) then begin
  607.         //restore from max
  608.         if (windowstate=swsnormal) then begin
  609. //           if (skinmanager.mdimax) then skinmanager.setmdimax(false);
  610.            EnableSysbtn(false);
  611.         end else if(windowstate=swsmax) then begin
  612.           //cause MDIChild max-close problem
  613.           //if not skinmanager.mdimax then  skinmanager.setmdimax(true);
  614.           enablesysbtn(true);
  615.         end;
  616.    end else EnableSysbtn(false);
  617.   //single no limit
  618. //  if formborder=sbsSizeable then
  619. {  with PMINMAXINFO(msg.lParam)^ do begin
  620.      ptMaxTrackSize.x:=GetSystemMetrics(SM_CXMAXIMIZED);
  621.      ptMaxTrackSize.y:=GetSystemMetrics(SM_CYMAXIMIZED);
  622.   end;}
  623. //  msg.result:=0;
  624. {  if formborder = sbsSingle then
  625.   with PMINMAXINFO(msg.lParam)^ do begin
  626.      ptMaxTrackSize.y:=ptMaxTrackSize.y-8;
  627.   end;}
  628. //  skinaddlog(format('MINMAXINFO (%1d,%1d)',[PMINMAXINFO(msg.lParam)^.ptMaxTrackSize.x,
  629. //                        PMINMAXINFO(msg.lParam)^.ptMaxTrackSize.y ]));
  630. end;
  631. function TWinSkinForm.FindBtn(Point: TPoint): TNcobject;
  632. var  i: integer;
  633. begin
  634.   Result := nil;
  635.   for i := 0 to high(sysbtn) do begin
  636.      if sysbtn[i].visible and (sysbtn[i].data.action>=0) and
  637.         PtInRect(sysbtn[i].bounds, Point) then begin
  638.         Result := sysbtn[i];
  639.         break;
  640.      end;
  641.   end;
  642. end;
  643. procedure TWinSkinForm.WMMouseMove(Var Msg: TMessage);
  644. begin
  645.    if not fwindowactive then exit;
  646. //   if activebtn<>-1 then begin
  647. //       drawsysbtn(ActiveBtn,1);
  648. //       ActiveBtn:=-1;
  649. //   end;
  650. end;
  651. procedure TWinSkinForm.WMNCHitTest(Var Msg: TMessage);
  652. var p:Tpoint;
  653. begin
  654.   default(msg);
  655.   if (Msg.Result=0) or (Msg.Result=HTCAPTION) then begin
  656.     P := getwinxy(msg.LParamLo,msg.LParamhi);
  657.     if p.y>3 then Msg.Result:=HTCAPTION;
  658.     if (p.y>bw.top) and (menuheight>0) then
  659.         Msg.Result:=HTMENU;
  660. //    fsd.DoDebug('hittest caption');
  661.   end;
  662. end;
  663. function TWinSkinForm.GetWinXY(x,y:Smallint):Tpoint;
  664. var
  665.   WindowPos, ClientPos,p: TPoint;
  666. begin
  667.    p:=point(x,y);
  668.    screentoclient(hwnd,p);
  669.    if (windowstate<>swsmin) or (formstyle<>sfsmdichild) then begin
  670.      inc(p.x,bw.left);
  671.      inc(p.y,bw.top+menuheight);
  672.    end;
  673.    result:=p;
  674. end;
  675. procedure TWinSkinForm.HintReset();
  676. begin
  677.     fsd.hintcount:=0;
  678.     fsd.HideHint();
  679. end;
  680. function TWinSkinForm.GetSysBtnHint(i:integer):string;
  681. begin
  682.     result:='';
  683.      case i of
  684.        1,22: result:='Maximize';
  685.        2,23: result:='Minimize';
  686.        7,60   : result:='Minimize';
  687.        8,61   : result:='Restore';
  688.        9,0,62   : result:='Close';
  689.        else result:='';
  690.      end;
  691. end;
  692. procedure TWinSkinForm.OnTimer(Sender: TObject);
  693. var p,p1,p2:Tpoint;
  694.     t:integer;
  695.     s:string;
  696. begin
  697.    if finmenu then exit;
  698.    if activebtn<>nil then begin
  699.      GetCursorPos(p);
  700.      P1 := GetWinXY(p.x,p.y);
  701.      if not PtInRect(activebtn.bounds, p1) then begin
  702.         if not IsBadReadPtr(activebtn, InstanceSize) then begin
  703.            activebtn.mouseleave;
  704.         end;
  705.         activebtn:=nil;
  706.         hintreset();
  707.      end else if not (ActiveBtn is TMenuBtn) then begin
  708.        fsd.hintcount:=fsd.hintcount+timer.Interval;
  709.        t:=  Application.HintPause*2;
  710.        if (fsd.hintcount<t) then begin
  711.        end else if (fsd.hintcount < (t + Application.HintHidePause))then begin
  712.             GetWindowRect(hwnd, wtr);
  713.             p2 := Point(activebtn.bounds.Left+wtr.left,p.Y+24);
  714.             s:=GetSysBtnHint(TWinsysbutton(activebtn).data.action);
  715.             if (Length(s)>0) then
  716.               fsd.ActivateHint(Rect(p2.x,p2.y,0,0),s);
  717.        end else begin
  718.             fsd.HideHint();
  719.        end;
  720.      end;
  721.    end;
  722.    if (fform=nil) and (activeskincontrol<>nil) then begin
  723.      GetCursorPos(p);
  724.      if not ptinrect(activeskincontrol.boundsrect,p) then begin
  725.         activeskincontrol.mouseleave;
  726.         activeskincontrol:=nil;
  727.      end;
  728.    end;
  729. end;
  730. procedure TWinSkinForm.WMNCMouseMove(Var Msg: TMessage);
  731. var P: TPoint;
  732.     btn: TNCObject;
  733.     b:boolean;
  734. begin
  735.   if not fwindowactive then exit;
  736.   P := GetWinXY(msg.LParamLo,msg.LParamhi);
  737.   btn := findbtn(p);
  738.   if (btn=nil) and (menu<>nil) then btn := menu.findbtn(p);
  739.   b:=false;
  740.   if btn<>nil then begin
  741.        btn.mouseenter;
  742.        b:=true;
  743.   end else begin
  744.      if activebtn<>nil then begin
  745.        //drawsysbtn(ActiveBtn,1);
  746.        activebtn.mouseleave;
  747.        activebtn:=nil;
  748.      end;
  749.   end;
  750.   if b then begin
  751.      Msg.Result := 0;
  752.      Msg.Msg := WM_NULL;
  753.   end else default(msg);
  754. end;
  755. procedure TWinSkinForm.WMNCLButtonDown(var Msg:TMessage);
  756. var P: TPoint;
  757.     btn:TNCobject;
  758.     b:boolean;
  759. begin
  760. //  if not fwindowactive then exit;
  761.   P := GetWinXY(msg.LParamLo,msg.LParamhi);
  762.   fsd.HideHint();
  763.   btn := findbtn(p);
  764.   if (btn=nil) and (menu<>nil) then btn := menu.findbtn(p);
  765.   b:=false;
  766.   if (btn<>nil) then begin
  767.     if not fwindowactive then
  768.            SetForegroundWindow(hwnd);
  769.     btn.mousedown;
  770.     if btn is TMenuBtn then begin
  771.          if lastselect then //mousemove select menu
  772.              CheckMenu(TMenuBtn(Btn))
  773.          else begin // click directly
  774.              // (TMenuBtn(Btn).hsubmenu=0) then
  775.              //stmessage(hwnd,wm_command,TMenuBtn(Btn).mid,0);
  776.              CheckMenu(TMenuBtn(Btn));
  777.          end;
  778.          activebtn:=btn;
  779.     end;
  780.     b:=true;
  781.   end;
  782.   if b then begin
  783.      Msg.Result := 0;
  784.      Msg.Msg := WM_NULL;
  785.   end else begin
  786.      if (windowstate=swsmax) and (msg.wparam=HTCAPTION) and fwindowactive then
  787.        msg.wparam:=HTMENU;
  788.      default(msg);
  789.   end;
  790. end;
  791. procedure TWinSkinForm.WMNCLButtonUp(var Msg:TMessage);
  792. var P: TPoint;
  793.     btn:TNcobject;
  794.     b:boolean;
  795. begin
  796.   P := GetWinXY(msg.LParamLo,msg.LParamhi);
  797.   fsd.HideHint();
  798. //  if msg.wparam=HTMENU then btn := menu.findbtn(p)
  799. //  else btn := findbtn(p);
  800.   btn := findbtn(p);
  801.   if (btn=nil) and (menu<>nil) then btn := menu.findbtn(p);
  802.   b:=false;
  803.   if (Btn<>nil) then begin
  804.     if btn is TWinSysbutton then begin
  805.        if btn=activebtn then begin
  806.          btn.mouseup;
  807.          SysBtnAction(msg.LParamLo,msg.LParamhi);
  808.        end ;
  809.     end else if btn is Tmenubtn then begin
  810. //       postmessage(hwnd,wm_command,tmenubtn(btn).mid,0);
  811.     end;
  812.     b:=true;
  813.   end ;
  814.   if b then begin
  815.      Msg.Result := 0;
  816.      Msg.Msg := WM_NULL;
  817.   end else default(msg);
  818. end;
  819. procedure TWinSkinForm.WMNCRButtonUp(var Msg:TMessage);
  820. var b:boolean;
  821. begin
  822.   b:=false;
  823.   fsd.HideHint();
  824.   if (msg.wparam=HTCAPTION) and (formstyle<>sfsMdichild) then begin
  825. //  if (msg.wparam=HTCAPTION) then begin
  826. //    sysmenu.popup(msg.LParamLo,msg.LParamhi);
  827.     popsysmenu(point(msg.LParamLo,msg.LParamhi));
  828.     b:=true;
  829.   end ;
  830.   if b then begin
  831.      Msg.Result := 0;
  832.      Msg.Msg := WM_NULL;
  833.   end else default(msg);
  834. end;
  835. procedure TWinSkinForm.PopSysmenu(p:Tpoint);
  836. var  AFlags: Integer;
  837.      i:integer;
  838. begin
  839. {    if sysmenu=nil then exit;
  840.     for i:= 0 to sysmenu.items.count-1 do begin
  841.        case sysmenu.Items.items[i].Tag of
  842.          Sc_Restore:sysmenu.Items.items[i].enabled:= (windowstate<>swsnormal) ;
  843.          SC_MAXIMIZE:sysmenu.Items.items[i].enabled:= (windowstate<>swsmax) and (sbimax in formicons);
  844.          SC_MINIMIZE:sysmenu.Items.items[i].enabled:= (windowstate<>swsmin) and (sbimin in formicons);
  845.        end;
  846.     end;}
  847.     //dll form right click problem.
  848.     if skinmanager.mode <>0 then exit;
  849.     if (gettickcount - poptime) >DoubleTime then begin
  850.        skinmanager.menutype:=m_systemmenu;
  851.        Aflags:= TPM_LEFTALIGN or TPM_RIGHTBUTTON;
  852.        poptime := gettickcount ;
  853.        createsysmenu2;
  854.        if sysmenu<>nil then sysmenu.popup(p.x,p.y)
  855. {       if (xcSystemMenu in fsd.SkinControls) and (formstyle<>sfsmdichild) then begin
  856.              createsysmenu2;
  857.              if sysmenu<>nil then sysmenu.popup(p.x,p.y)
  858.        end else if hsysmenu<>0 then
  859.         TrackPopupMenu(hsysmenu, aflags, p.x, p.y,0,hwnd,nil );}
  860.     end else if (activebtn<>nil) then begin
  861.        timer.enabled:=false;
  862.        postmessage(hwnd,wm_close,0,0);
  863.     end;
  864. end;
  865. {procedure TWinSkinForm.WMPaint(var Msg: TMessage);
  866. var  OldMode: integer;
  867.      dc:HDC;
  868.      PS: TPaintStruct;
  869. begin
  870.     dc:=msg.wparam;
  871.     if dc=0 then
  872.       msg.wparam:=BeginPaint(hwnd, PS);
  873.     OldMode := SetBkMode(msg.wparam, TRANSPARENT);
  874.     SetBkColor(msg.wparam,fsd.colors[csButtonFace]);
  875.     default(msg);
  876.     SetBkMode(msg.wparam, OldMode);
  877.     if dc=0 then EndPaint(hwnd, PS);
  878.     done:=true;
  879. end;}
  880. procedure TWinSkinForm.WMERASEBKGND(var Msg: TMessage);
  881. var r:Trect;
  882. begin
  883.   default(msg);
  884.   if (fform=nil) then begin
  885.     GetClientRect(hwnd,r);
  886.     FillRect( msg.wparam,r,fsd.BGbrush);
  887.     Msg.Result := 1;
  888.   end ;
  889. end;
  890. procedure TWinSkinForm.WMMEASUREITEM(var Msg: Tmessage);
  891. var ItemID:integer;
  892.     b:boolean;
  893.     mis:PMEASUREITEMSTRUCT;
  894.     item:Tmenuitem;
  895.     Canvas :TControlCanvas;
  896.     dc:HDC;
  897.     s:string;
  898.     Buffer: array[0..79] of Char;
  899. begin
  900. //   default(msg);
  901.    mis:= PMEASUREITEMSTRUCT(msg.lparam);
  902.    if (mis^.CtlType=ODT_MENU) and (hmenu<>0) then begin
  903. //      default(msg);
  904. //      skinaddlog('MENU WMMEASUREITEM');
  905.          if fform=nil then begin
  906.              WMMEASUREITEMH(msg);
  907.              exit;
  908.          end;
  909.          skinmanager.setpopmenu;
  910.          if menu.menu<>nil then
  911.             Item := Menu.Menu.FindItem(mis^.itemID, fkCommand)
  912.          else item:=nil;
  913.          if Item <> nil then begin
  914.            DC := GetWindowDC(hwnd);
  915.            Canvas := TControlCanvas.Create;
  916.            Canvas.Handle := DC;
  917.            Canvas.Font := Screen.MenuFont;
  918.            MeasureItem(item,Canvas,Integer(mis^.itemWidth), Integer(mis^.itemHeight));
  919.            Canvas.Handle := 0;
  920.            Canvas.Free;
  921.            ReleaseDC(hwnd, DC);
  922.            done:=true;
  923.          end else begin
  924.            //only draw MDI windows menu.
  925.            if (mis^.itemID<Max_MenuitemID) and (mis^.itemID>0) then begin
  926.              default(msg);
  927.              exit;
  928.            end;
  929.            GetMenuString(activemenu,mis^.itemID,buffer,sizeof(buffer),MF_BYCOMMAND);
  930.            s:=buffer;
  931.            DC := GetWindowDC(hwnd);
  932.            Canvas := TControlCanvas.Create;
  933.            Canvas.Handle := DC;
  934.            Canvas.Font := Screen.MenuFont;
  935.            mis^.itemWidth:= canvas.TextWidth(s)+26;
  936.            if fsd.MenuItem<>nil then mis^.itemWidth:=mis^.itemWidth+fsd.MenuItem.r.Left;
  937.            Canvas.Handle := 0;
  938.            Canvas.Free;
  939.            ReleaseDC(hwnd, DC);
  940.            if s='' then
  941.              mis^.itemHeight:=8
  942.            else inc(mis^.itemHeight,4);
  943.            if (winversion >= $80000000) then
  944.               inc(mis^.itemHeight,4);
  945.          end;//if
  946.    end else default(msg);
  947. end;
  948. procedure TWinSkinForm.WMMEASUREITEMH(var Msg: Tmessage);
  949. var ItemID:integer;
  950.     b:boolean;
  951.     mis:PMEASUREITEMSTRUCT;
  952.     item:Tmenuitem;
  953.     Canvas :TControlCanvas;
  954.     dc:HDC;
  955.     s:string;
  956.     Buffer: array[0..79] of Char;
  957. begin
  958. //   default(msg);
  959.            mis:= PMEASUREITEMSTRUCT(msg.lparam);
  960.            GetMenuString(activemenu,mis^.itemID,buffer,sizeof(buffer),MF_BYCOMMAND);
  961.            s:=buffer;
  962.            DC := GetWindowDC(hwnd);
  963.            Canvas := TControlCanvas.Create;
  964.            Canvas.Handle := DC;
  965.            Canvas.Font := Screen.MenuFont;
  966.            mis^.itemWidth:= canvas.TextWidth(s)+26;
  967.            if fsd.MenuItem<>nil then mis^.itemWidth:=mis^.itemWidth+fsd.MenuItem.r.Left;
  968.            Canvas.Handle := 0;
  969.            Canvas.Free;
  970.            ReleaseDC(hwnd, DC);
  971.            if s='' then
  972.              mis^.itemHeight:=8
  973.            else inc(mis^.itemHeight,4);
  974.            if (winversion >= $80000000) then
  975.               inc(mis^.itemHeight,4);
  976. end;
  977. procedure TWinSkinForm.WMDRAWITEM(var Msg: Tmessage);
  978. var ItemID:integer;
  979.     b:boolean;
  980.     mis:PDrawItemStruct;
  981. //    ahwnd:Thandle;
  982. //    ptr:integer;
  983. begin
  984.    mis:= PDrawItemStruct(msg.lparam);
  985.    if (mis^.CtlType=ODT_MENU) and (hmenu<>0) then begin
  986.       if (formstyle=sfsmdiform) and (Win32Platform = VER_PLATFORM_WIN32_NT)
  987.          and (Win32MajorVersion = 4) then begin
  988.          default(msg);
  989.          exit;
  990.       end;
  991. {      if newskinmenu<>nil then begin
  992.          newskinmenu.hmenu:=mis^.hwndItem;
  993.          newskinmenu:=nil
  994.       end;}
  995.       skinmanager.sethmenu(mis^.hwndItem);
  996.       skinmanager.setPopmenu;
  997.       //skinmanager.UpdateSkinMenu(mis^.hwndItem);
  998. //      DrawHmenuItem(mis^.hDC,mis^.rcItem,mis^.itemid,mis^.hwndItem,(mis^.itemState and ODS_SELECTED)>0);
  999.       if fform<>nil then
  1000.          WMDrawMenuitem(Msg)
  1001.       else
  1002.          WMDrawMenuitemH(Msg);
  1003. //      done:=true;
  1004.    end else default(msg);
  1005. end;
  1006. procedure TWinSkinForm.WMDrawMenuitem(var Msg: Tmessage);
  1007. var item,pitem:Tmenuitem;
  1008.     Canvas :TControlCanvas;
  1009. begin
  1010.     with PDrawItemStruct(Msg.LParam)^ do begin
  1011.        Item := Menu.Menu.FindItem(itemID, fkCommand);
  1012.        if (Item = nil) then begin
  1013.           //only draw MDI windows menuite
  1014.           if (itemid<Max_MenuitemID) and (itemid>0) then begin
  1015.              default(msg);
  1016.              exit;
  1017.           end;
  1018.           Item := CreateMenuItem(hwndItem,itemid);
  1019.           Canvas := TControlCanvas.Create;
  1020.           Canvas.Handle := hDC;
  1021.           Canvas.Font := Screen.MenuFont;
  1022.           DrawHMenuItem2(hwndItem,item,canvas,rcitem,(itemState and ODS_SELECTED)>0);
  1023.           Canvas.Handle := 0;
  1024.           Canvas.Free;
  1025.           item.free;
  1026.        end else begin;
  1027.           Canvas := TControlCanvas.Create;
  1028.           Canvas.Handle := hDC;
  1029.           Canvas.Font := Screen.MenuFont;
  1030.           if fsd.menuitem= nil then begin
  1031.              DefaultMenuItem(item,canvas,rcitem,(itemState and ODS_SELECTED)>0);
  1032.           end else
  1033.              DrawMenuItem(item,canvas,rcitem,(itemState and ODS_SELECTED)>0);
  1034.           Canvas.Handle := 0;
  1035.           Canvas.Free;
  1036.        end;
  1037.     end;//with
  1038. end;
  1039. procedure TWinSkinForm.WMDrawMenuitemH(var Msg: Tmessage);
  1040. var item,pitem:Tmenuitem;
  1041.     Canvas :TControlCanvas;
  1042. begin
  1043.     with PDrawItemStruct(Msg.LParam)^ do begin
  1044.           Item := CreateMenuItem(hwndItem,itemid);
  1045.           Canvas := TControlCanvas.Create;
  1046.           Canvas.Handle := hDC;
  1047.           Canvas.Font := Screen.MenuFont;
  1048.           DrawHMenuItem2(hwndItem,item,canvas,rcitem,(itemState and ODS_SELECTED)>0);
  1049.           Canvas.Handle := 0;
  1050.           Canvas.Free;
  1051.           item.free;
  1052.     end;
  1053. end;
  1054. function TWinSkinForm.CreateMenuItem(amenu:Hmenu;aid:integer):Tmenuitem;
  1055. var item:Tmenuitem;
  1056.     mi:TMenuItemInfo;
  1057.     Buffer: array[0..79] of Char;
  1058. begin
  1059.     mi.cbSize:= sizeof(TMENUITEMINFO);
  1060.     mi.fMask:=MIIM_TYPE or MIIM_STATE  ;
  1061.     mi.dwTypeData := Buffer;
  1062.     Mi.cch := SizeOf(Buffer);
  1063.     GetMenuItemInfo(amenu, aid, false, mi);
  1064.     Item := Tmenuitem.create(nil);
  1065.     GetMenuString(amenu,aid,buffer,sizeof(buffer),MF_BYCOMMAND);
  1066.     item.caption:=buffer;
  1067.     if item.caption='' then item.caption:='-';
  1068.     item.enabled:= (mi.fState and MFS_DISABLED)=0;
  1069.     item.checked:= (mi.fState and MFS_CHECKED)>0;
  1070.     result:=item;
  1071. end;
  1072. procedure TWinSkinForm.WMCommand(var Msg: Tmessage);
  1073. var ItemID:integer;
  1074.     b:boolean;
  1075. begin
  1076.    itemid:=TWMCommand(msg).ItemID;
  1077.    case itemid of
  1078.       SC_CLOSE,SC_MAXIMIZE,SC_MINIMIZE,SC_RESTORE:b:=true;
  1079.       SC_MOVE,SC_SIZE: b:=true;
  1080.       SC_NEXTWINDOW,SC_PREVWINDOW:b:=true;
  1081.       else b:=false;
  1082.    end;
  1083. //   skinaddlog(format('__________WMCommand %1d %1d',[msg.wparam,msg.lparam]));
  1084.    if itemid>= $ff00 then begin
  1085. //      setmenu(hwnd,0);
  1086.       default(msg);
  1087.    end else if b then begin
  1088.      postmessage(hwnd,wm_syscommand,itemid,0);
  1089.      exit;
  1090.    end else default(msg);
  1091. end;
  1092. procedure TWinSkinForm.WMINITMENU(hm:Hmenu);
  1093. var i,n,v:integer;
  1094.     mi:TMenuItemInfo;
  1095.     Buffer: array[0..79] of Char;
  1096. begin
  1097.   n:= GetMenuItemCount(hm);
  1098.   for i:= 0 to n-1 do begin
  1099.        mi.cbSize:= sizeof(TMENUITEMINFO);
  1100.        mi.fMask := MIIM_TYPE or MIIM_STATE or MIIM_SUBMENU;
  1101. //       mi.fType := MFT_STRING ;
  1102.        FillChar(buffer, SizeOf(buffer), 0);
  1103.        mi.dwTypeData := Buffer;
  1104.        Mi.cch := SizeOf(Buffer);
  1105.        GetMenuItemInfo(hm, i, TRUE, mi);
  1106.        mi.fMask := MIIM_TYPE ;
  1107.        mi.fType := mi.fType or MFT_OWNERDRAW;
  1108.        SetMenuItemInfo(hm, i, TRUE, mi);
  1109.        if mi.hSubMenu<>0 then WMINITMENU(mi.hSubMenu);
  1110.   end;
  1111. end;
  1112. procedure TWinSkinForm.WMReCreateWnd(var Msg: Tmessage);
  1113. var i:integer;
  1114.     hctrl:Thandle;
  1115.     sc:Tskincontrol;
  1116.     ss:Tskinscrollbar;
  1117.     sv:TSkinListView;
  1118.     comp:TWincontrol;
  1119. begin
  1120.     hctrl:=msg.WParam;
  1121.     if controllist=nil then exit;
  1122.     for i:= controllist.count-1 downto 0 do begin
  1123.         sc:=TSkinControl(Controllist.items[i]);
  1124.         if sc.hwnd=hctrl then begin
  1125.            comp:=sc.control;
  1126.            if sc is TSkinListView then begin
  1127.               Controllist.Delete(i);
  1128.               sc.Free;
  1129.               sv:=TSkinListView.create(comp);
  1130.               sv.initScrollbar(comp,self.fsd,self.fcanvas2,self);
  1131.            end else begin
  1132.               Controllist.Delete(i);
  1133.               sc.Free;
  1134.               ss:=TSkinScrollBar.create(comp);
  1135.               ss.initScrollbar(comp,self.fsd,self.fcanvas2,self);
  1136.            end;
  1137.            //fsd.DoDebug('Received RecreateWnd');
  1138.            break;
  1139.         end;
  1140.     end;
  1141. end;
  1142. procedure TWinSkinForm.WMSysCommand(var Msg: Tmessage);
  1143. var Button:TMenuBtn;
  1144.     p:Tpoint;
  1145. begin
  1146.   if not FInMenu then begin
  1147.     with TWMSysCommand(msg) do begin
  1148.       if (CmdType and $FFF0 = SC_KEYMENU) and (Key <> VK_SPACE) and
  1149.         (Key <> Word('-')) and (GetCapture = 0) then  begin
  1150.         if (Key = 0) and (menu<>nil) then
  1151.           Button := Menu.Buttons[0]
  1152.         else
  1153.           Button := FindButtonFromAccel(Key);
  1154.         if (Key = 0) or (Button <> nil) then
  1155.         begin
  1156.           CheckMenu(button);
  1157. //          TrackMenu(Button);
  1158.           Result := 1;
  1159.           exit;
  1160.         end;
  1161.       end else if (CmdType and $FFF0 = SC_KEYMENU) and (Key = VK_SPACE) then begin
  1162.         p:=point(0,0);
  1163.         clienttoscreen(hwnd,p);
  1164.         PopSysmenu(p);
  1165.       end;
  1166.     end; //end with
  1167.   end;
  1168.     case msg.wparam of
  1169.       SC_MAXIMIZE: begin
  1170.          windowstate:=swsmax;
  1171.          {if formstyle=sfsmdichild then begin
  1172.             enablesysbtn(true);
  1173.             if not (skinmanager.mdimax) then
  1174.                 skinmanager.setmdimax(true);
  1175.          end;  }
  1176.        end;
  1177.       SC_MINIMIZE: begin
  1178.          windowstate:=swsmin;
  1179.          if formstyle=sfsmdichild then enablesysbtn(true);
  1180.          end;
  1181.       SC_RESTORE:begin
  1182.          windowstate:=swsnormal;
  1183.          if formstyle=sfsmdichild then begin
  1184.             enablesysbtn(false);
  1185.             if (skinmanager.mdimax) then
  1186.                 skinmanager.setmdimax(false);
  1187.          end;
  1188.        end;
  1189.     end;
  1190.     default(msg);
  1191. end;
  1192. procedure TWinSkinForm.Maximize;
  1193. begin
  1194.     if windowstate<>swsmax then begin
  1195.       if formstyle=sfsmdichild then
  1196.         SkinManager.SetMDIMax(true);
  1197. //      SetAnimation(false);
  1198.       windowstate:=swsmax;
  1199.       postmessage(hwnd,wm_syscommand,SC_MAXIMIZE,0);
  1200.       activebtn:=nil;
  1201.     end else  restore;
  1202. end;
  1203. procedure TWinSkinForm.Restore;
  1204. begin
  1205.     windowstate:=swsnormal;
  1206.     postmessage(hwnd,wm_syscommand,SC_Restore,0);
  1207. end;
  1208. procedure TWinSkinForm.RestoreMDI;
  1209. begin
  1210.     if fform.ActiveMDIChild<>nil then
  1211.     fform.ActiveMDIChild.windowstate:=wsnormal;
  1212. end;
  1213. procedure TWinSkinForm.Minimize;
  1214. begin
  1215.     if windowstate=swsmin then
  1216.        restore
  1217.     else begin
  1218. //      SetAnimation(false);
  1219.       windowstate:=swsmin;
  1220.       UpdateStyle(false);
  1221. //      ShowWindow(hwnd, SW_MINIMIZE);
  1222.       postmessage(hwnd,wm_syscommand,SC_MINIMIZE,0);
  1223. //      postmessage(hwnd,WM_SHOWWINDOW,0,SW_PARENTCLOSING);
  1224.     end;
  1225. end;
  1226. procedure TWinSkinForm.SysBtnAction(x,y:smallint);
  1227. var i:integer;
  1228. begin
  1229.      i:=TWinsysbutton(activebtn).data.action;
  1230.      case i of
  1231.        1,22: if TWinsysbutton(activebtn).enabled then Maximize;
  1232.        2,23: if TWinsysbutton(activebtn).enabled then Minimize;
  1233.        0   : begin
  1234.             if checksysmenu then begin
  1235.                timer.enabled:=false;
  1236.                postmessage(hwnd,WM_SYSCOMMAND,SC_CLOSE,0);
  1237.               //postmessage(hwnd,wm_close,0,0);
  1238.             end;
  1239.            end;
  1240.        3,11,12: popsysmenu(point(x+1,y+1));
  1241.        4    : postmessage(hwnd,WM_SYSCOMMAND,SC_CONTEXTHELP,0);
  1242.        7,60   : MDIchildaction(61472);//SC_MINIMIZE);
  1243.        8,61   : MDIchildaction(SC_RESTORE);
  1244.        9,62   : MDIchildaction(SC_Close);
  1245.        else postmessage(hwnd,cn_captionBtnClick,i,0);
  1246.      end;
  1247. end;
  1248. procedure TWinSkinForm.MDIChildAction(const action:Integer);
  1249. var b:boolean;
  1250.     ahwnd:Thandle;
  1251.     acomm:integer;
  1252. begin
  1253. //  SetAnimation(false);
  1254.   if (formstyle<>sfsMDIform) or (ClientHwnd=0) then exit;
  1255.   acomm:=action;
  1256.   //close last child,no action
  1257. //  if (action<>SC_Close) then
  1258. //          skinmanager.setmdimax(false);
  1259.   ahwnd:=sendmessage(clienthwnd,WM_MDIGETACTIVE,0,longint(@b));
  1260.   if (ahwnd=0) then exit;
  1261.   sendmessage(ahwnd,wm_syscommand,acomm,0);
  1262. {  if skinmanager.mdimax then begin
  1263.     if not MDIChildMax then skinmanager.setmdimax(false)
  1264.   end;}
  1265. end;
  1266. procedure TWinSkinForm.DoSysMenu(Sender: TObject);
  1267. begin
  1268.   case TMenuitem(Sender).tag of
  1269.       3: begin
  1270.             timer.enabled:=false;
  1271.             postmessage(hwnd,wm_close,0,0);
  1272.          end; 
  1273.       1: Maximize;
  1274.       2: Minimize;
  1275.       0: Restore;
  1276.   else begin
  1277.        end;
  1278.   end;
  1279. end;
  1280. procedure TWinSkinForm.DoSysMenu2(Sender: TObject);
  1281. begin
  1282.   postmessage(hwnd,wm_syscommand,TMenuitem(Sender).tag,0);
  1283. end;
  1284. procedure TWinSkinForm.DrawSysbtn(btn:TWinSysButton;I:integer);
  1285. var w:integer;
  1286.     r:Trect;
  1287.    FWorkDC: HDC;
  1288. begin
  1289.     FWorkDC := GetWindowDC(hwnd);
  1290.     w:= btn.data.map.width div btn.data.frame;
  1291.     if not btn.enabled then begin
  1292.        i:=4;
  1293.        if i>btn.data.frame then i:=1;
  1294.     end;
  1295.     r:= rect((i-1)*w,0,i*w,btn.data.map.height);
  1296.     if btn.data.Visibility=100 then begin
  1297.        if i=3 then i:=4
  1298.     end;
  1299.     if btn.data.action in [3,11] then
  1300.         DrawIcon(fworkdc, btn.bounds)
  1301.     else
  1302.         DrawRect1(FWorkDC,btn.bounds,btn.data.map,i,btn.data.frame,1);
  1303.     ReleaseDC(hwnd, FWorkDC);
  1304. end;
  1305. procedure TWinSkinForm.WMWINDOWPOSCHANGED(Var Msg: TMessage);
  1306. begin
  1307.    GetWindowstate;
  1308.    default(msg);
  1309. end;
  1310. procedure TWinSkinForm.WMWindowPosChanging(Var Msg: TMessage);
  1311. begin
  1312.    default(msg);
  1313. end;
  1314. procedure TWinSkinForm.WMactive(Var Msg: TMessage);
  1315. begin
  1316.     fwindowactive:=BOOLean(msg.wParam);
  1317.     default(msg);
  1318. end;
  1319. procedure TWinSkinForm.WMMDIACTIVATE2(Var Msg: TMessage);
  1320. var dwstyle: Dword;
  1321. begin
  1322.     dwstyle := GetWindowLong( hwnd, GWL_STYLE );
  1323.     SetWindowLong( hwnd, GWL_STYLE, dwstyle and (not WS_CAPTION));
  1324.     default(msg);
  1325.     SetWindowLong( hwnd, GWL_STYLE, dwstyle );
  1326. end;
  1327. procedure TWinSkinForm.WMNCPaint(Var Msg: TMessage);
  1328. var dc:HDC;
  1329. begin
  1330.     UpdateStyle(true);
  1331.     if (fsd.menumsg) then begin
  1332.     if ((formstyle=sfsmdichild) and (windowstate=swsmax))
  1333.        or (formborder = sbsnone) then begin
  1334.        default(msg);
  1335.        exit;
  1336.     end;
  1337.     {dc := GetDCEx(hwnd, msg.wParam, DCX_WINDOW or DCX_INTERSECTRGN);
  1338.     updatenc(dc);
  1339.     ReleaseDC(hwnd, dc); }
  1340.     updatenc(0);
  1341.     end;
  1342.     msg.result:=0;
  1343. end;
  1344. procedure TWinSkinForm.UpdateNc(adc:HDC=0);
  1345. var WR, R1: TRect;
  1346.    FWorkDC: HDC;
  1347.     b:boolean;
  1348. begin
  1349.     if bg=nil then exit;
  1350.     if (skinstate<>skin_active) and (skinstate<>skin_change) then exit;
  1351.     if (formborder = sbsnone) then exit;
  1352.     if (formstyle=sfsmdichild) and (windowstate=swsmax) then exit;
  1353. //    dolog(format('************Do UPdate NC %1d',[Ord(skinstate)]));
  1354.     if adc=0 then
  1355.       FWorkDC := GetWindowDC(hwnd)
  1356.     else
  1357.       FWorkDC := adc;
  1358.     try
  1359. //       UpdateStyle(true);
  1360.        if GetWindowRect(hwnd, WR) then begin;
  1361.          wtr:=wr;
  1362.          OffsetRect(wr,-wr.left,-wr.top);
  1363.          fwidth :=wr.right;
  1364.          fheight:=wr.bottom;
  1365.          if (windowstate<>swsmin) then begin
  1366.              drawborder(1,rect(0,0,bw.left,wr.bottom),fworkdc);
  1367.              drawborder(2,rect(wr.right-bw.right,0,wr.right,wr.bottom),fworkdc);
  1368.              drawborder(4,rect(bw.left,wr.bottom-bw.bottom,wr.right-bw.right,wr.bottom),fworkdc);
  1369.              DrawFLine(fworkdc);
  1370.              b:=true;
  1371.              if (menu<>nil) and b then
  1372.                  menu.drawmenu(fworkdc,rect(bw.left,bw.top,
  1373.                      wr.right-bw.right,bw.top+menuheight))
  1374.              else if (menuheight>0) then begin
  1375.                  r1:=rect(bw.Left,bw.Top,wr.Right-bw.Right,bw.Top+menuheight);
  1376.                  fillrect(fworkdc,r1,fsd.BGbrush);
  1377.              end;
  1378.           end else begin
  1379.              DrawFLine(fworkdc);
  1380. //             DrawMin(fworkdc);
  1381.           end;
  1382.        end;
  1383.     except
  1384.     end;
  1385.     activebtn:=nil;
  1386.     if adc=0 then
  1387.       ReleaseDC(hwnd, FWorkDC);
  1388. end;
  1389. procedure TWinSkinForm.UpdateStyle(b:boolean);
  1390. var exstyle:Dword;
  1391.     b2:boolean;
  1392. begin
  1393.     if sbicaption in formicons then exit;
  1394.     dwstyle := GetWindowLong( hwnd, GWL_STYLE );
  1395.     if false {(windowstate=swsmin)} then begin
  1396.         if (hsysmenu>0) then
  1397.            dwstyle := dwstyle or WS_SYSMENU;
  1398.     end else begin;
  1399.        if b then
  1400.         dwstyle := dwstyle and ( not WS_SYSMENU)
  1401.        else if (hsysmenu>0) then
  1402.         dwstyle := dwstyle or WS_SYSMENU;
  1403.     end;
  1404.     SetWindowLong( hwnd, GWL_STYLE, dwstyle );
  1405. end;
  1406. procedure TWinSkinForm.UpdateMainMenu;
  1407. var WR, R1: TRect;
  1408.    FWorkDC: HDC;
  1409.     b:boolean;
  1410. begin
  1411.     if (menu=nil) then exit;
  1412.     FWorkDC := GetWindowDC(hwnd);
  1413.     GetWindowRect(hwnd, WR);
  1414.     wtr:=wr;
  1415.     OffsetRect(wr,-wr.left,-wr.top);
  1416.     fwidth :=wr.right;
  1417.     fheight:=wr.bottom;
  1418.     menu.updataBtn;
  1419.     menu.drawmenu(fworkdc,rect(bw.left,bw.top,
  1420.                   wr.right-bw.right,bw.top+menuheight));
  1421.     ReleaseDC(hwnd, FWorkDC);
  1422. end;
  1423. procedure TWinSkinForm.DrawFLine(dc:HDC);
  1424. var rc,r1,r2:Trect;
  1425.     h,x,y:integer;
  1426. begin
  1427.     rc:=rect(0,0,fwidth,bw.top);
  1428.     if windowstate=swsmin then begin
  1429.        CaptionBuf.height:=fheight;
  1430.        CaptionBuf.width:= fwidth;
  1431.        captionbuf.Canvas.Brush.color:=fsd.colors[csbuttonface];
  1432.        captionbuf.canvas.fillrect(rect(0,0,fwidth,fheight));
  1433.     //top border
  1434.        r1:=rect(0,0,fwidth,bw.Top);
  1435.     end else begin
  1436.        CaptionBuf.height:=rc.bottom;
  1437.        CaptionBuf.width:= rc.right;
  1438.        BitBlt(CaptionBuf.canvas.handle,rc.left,rc.top,rc.right,rc.bottom,
  1439.                  dc,0 ,0 ,Srccopy);
  1440.        r1:=rect(bw.left,0,rc.right-bw.right,rc.bottom);
  1441.     end;
  1442.     //top border
  1443.     drawborder(3,r1,CaptionBuf.canvas.handle);
  1444.     //caption
  1445.     DrawLine(CaptionBuf.canvas,r1);
  1446.  {$IFDEF demo}
  1447.     x:=fsd.title.r.left++15;//+fsd.title.backleft;
  1448.     y:= ((r1.Bottom-r1.Top)-(fsd.logo.height)) div 2 +
  1449.              fsd.title.r.top div 2;
  1450.     CaptionBuf.canvas.draw(x,y,fsd.logo);
  1451.  {$Endif}
  1452.     //sysbtn
  1453.     SetSysbtnRect;
  1454.     drawallsysbtn(CaptionBuf.canvas,rc);
  1455.     BitBlt(dc,rc.left ,rc.top,CaptionBuf.Width,CaptionBuf.Height,
  1456.                  CaptionBuf.canvas.handle,0 ,0 ,Srccopy);
  1457. //    H := GetSystemMetrics(SM_CYCAPTION)+GetSystemMetrics(SM_CXSIZEFRAME);
  1458.     SetBkMode(dc,OPAQUE);
  1459. end;
  1460. procedure TWinSkinForm.DrawMin(dc:HDC);
  1461. var rc,r1,r2:Trect;
  1462.     h,y:integer;
  1463. begin
  1464.     rc:=rect(0,0,fwidth,fheight);
  1465.     CaptionBuf.height:=rc.bottom;
  1466.     CaptionBuf.width:= rc.right;
  1467.     DrawRect2(CaptionBuf.canvas.handle,rc,fsd.MinCaption.Map,
  1468.                         fsd.MinCaption.r,1,1);
  1469.     //caption
  1470.     r1:=rect(bw.left,0,rc.right-bw.right,rc.bottom);
  1471.     DrawLine(CaptionBuf.canvas,r1);
  1472.     //sysbtn
  1473.     SetSysbtnRect;
  1474.     drawallsysbtn(CaptionBuf.canvas,rc);
  1475.     BitBlt(dc,rc.left ,rc.top,rc.right,rc.bottom,
  1476.                  CaptionBuf.canvas.handle,0 ,0 ,Srccopy);
  1477.     SetBkMode(dc,OPAQUE);
  1478. end;
  1479. procedure TWinSkinForm.DrawLine(acanvas:Tcanvas;rc:TRect);
  1480. var ws:widestring;
  1481.     r1,r2:Trect;
  1482.     OldMode,x,y,i: integer;
  1483.     OldFont: HFont;
  1484.     DrawStyle: Longint;
  1485.     BtnCounter,mleft:Integer ;
  1486. begin
  1487.  {$IFNDEF demo}
  1488.     if bidileft then
  1489.       DrawStyle := DT_NOPREFIX or DT_END_ELLIPSIS or DT_SINGLELINE or DT_Right or DT_RTLREADING
  1490.     else
  1491.       DrawStyle := DT_NOPREFIX or DT_END_ELLIPSIS or DT_SINGLELINE or DT_LEFT;
  1492.     ws:=' ';
  1493.     astr:=' ';
  1494.     if isunicode then
  1495.        ws:= bstr+getformcaption(hwnd)+astr
  1496.     else
  1497.        ws := StrToWideStr(bstr+getformcaptionA(hwnd)+astr);
  1498.        // By Shraga Milon because there was a problem in
  1499. //    if bidileft then begin
  1500.        rightbtn:=0;
  1501.        for BtnCounter:= 0 to high(sysbtn) do
  1502.          if (sysBtn[BtnCounter].data.Align = 1) and (not sysbtn[BtnCounter].data.map.empty) then begin
  1503.              if SysBtnVisible(BtnCounter) then begin
  1504.                  if SysBtn[BtnCounter].data.XCoord >rightbtn then
  1505.                     rightbtn:=SysBtn[BtnCounter].data.XCoord;
  1506.              end;
  1507.        end;
  1508. //    end;
  1509.     acanvas.font:=captionfont;
  1510.     OldMode := SetBkMode(aCanvas.Handle, TRANSPARENT);
  1511.     with acanvas do
  1512.     try
  1513.        if (fwindowactive) then begin
  1514.           font.color:=fsd.colors[csTitleTextActive];
  1515.        end else begin
  1516.           font.color:=fsd.colors[csTitleTextNoActive];
  1517.        end;
  1518.        r1:=rc;
  1519. //       DrawText(acanvas.Handle,PChar(bstr+Text+astr),length(bstr+Text+astr)
  1520. //                ,r1, DT_CALCRECT or DT_NOCLIP);
  1521.        TNT_DrawTextw(acanvas.Handle,ws,r1, DT_CALCRECT or DT_NOCLIP or DT_NOPREFIX);
  1522.        inc(r1.right,fsd.title.backleft+fsd.title.backright);
  1523.        x:=0;
  1524.        case fsd.title.Aligment of
  1525.         0:x:=fsd.title.r.left;
  1526.         1:x:=((rc.right-rc.left)-(r1.right-r1.left)) div 2;
  1527.         2:x:=(rc.right-rc.left-fsd.title.r.right-(r1.right-r1.left)) ;
  1528.        end;
  1529.        // right button, caption button
  1530.        if bidileft then begin
  1531.           mleft := fsd.title.r.right;
  1532.           //some skin may have problem
  1533.           //if mleft<rightbtn+2 then
  1534.           mleft:=rightbtn;
  1535.           case fsd.title.Aligment of
  1536.             2:x:=fsd.title.r.left;
  1537.             1:x:=((rc.right-rc.left)-(r1.right-r1.left)-mLeft) div 2;
  1538.             0:x:=(rc.right-rc.left-mLeft-(r1.right-r1.left));
  1539.           end;
  1540.        end;
  1541.        y:= ((rc.Bottom-rc.Top)-(r1.Bottom-r1.Top)) div 2 +
  1542.              fsd.title.r.top div 2;
  1543.        offsetrect(r1,x,y);
  1544.        if bidileft and (x<=0) then
  1545.           r1.left:=fsd.title.r.left;
  1546.        if (dwstyle and ws_popup) = 0 then  begin
  1547.           // Fix by Shraga Milon to bring closer the caption to the button
  1548.           if bidileft then
  1549.              OffsetRect(r1,10,0)  // i add this to bring closer the caption to the button
  1550.           else if r1.right>rc.right-fsd.title.r.right then
  1551.                r1.right:=rc.right-fsd.title.r.right;
  1552.        end else begin
  1553.           if bidileft then
  1554.              OffsetRect(r1,10,0) // i add this to bring closer the caption to the button
  1555.           else if (r1.right>rc.right-rightbtn-5) and (rightbtn>5) then
  1556.             r1.right:=rc.right-rightbtn-5;
  1557.        end;
  1558.        if (formborder = sbsDialog) and (fsd.title.Aligment=0) then dec(r1.left,16);
  1559.        ctr:=r1;
  1560.        if not fsd.title.map.empty then begin
  1561.          if (not fwindowactive) then  i:=2  else i:=1;
  1562.          DrawRectTile(acanvas,rect(r1.left,rc.top,r1.right,rc.bottom),fsd.title.map,
  1563.               rect(fsd.title.backleft,0,fsd.title.backright,0),i,2,1);
  1564.        end;
  1565.        inc(r1.left,fsd.title.backleft);
  1566.        dec(r1.right,fsd.title.backright);
  1567.        Tnt_DrawTextW(acanvas.Handle,ws,r1, DrawStyle);
  1568.     finally
  1569.       SetBkMode(aCanvas.Handle, OldMode);
  1570.     end;
  1571.  {$else}
  1572.     x:=fsd.title.r.left++15;//+fsd.title.backleft;
  1573.     y:= ((rc.Bottom-rc.Top)-(fsd.logo.height)) div 2 +
  1574.              fsd.title.r.top div 2;
  1575.     acanvas.draw(x,y,fsd.logo);
  1576.  {$ENDIF}
  1577. end;
  1578. procedure TWinSkinForm.SetSysbtnRect;
  1579. var i,j,w,y,minleft:integer;
  1580.     r1 :Trect;
  1581. begin
  1582.   minleft:=0;
  1583.   for i:= 0 to high(sysbtn) do
  1584.      if SysBtnVisible(i) and
  1585.      (not sysbtn[i].data.map.empty) then begin
  1586.      w:= sysbtn[i].data.map.width div sysbtn[i].data.frame;
  1587.      r1:=rect(0,0,w,sysbtn[i].data.map.height);
  1588.      with sysbtn[i].data do
  1589.        case Align of
  1590.          0: offsetrect(r1,XCoord,ycoord);
  1591.          1: begin
  1592.                offsetrect(r1,fwidth-XCoord,ycoord);
  1593.                if minleft<r1.Left then minleft:=r1.left;
  1594.             end;
  1595. //         2: offsetrect(r1,xcoord,fheight-Ycoord);
  1596. //         3: offsetrect(r1,fwidth-xcoord,fheight-Ycoord);
  1597.          2,8: offsetrect(r1,ctr.left-w-sysbtn[i].data.xcoord,ycoord);
  1598.          3,9: offsetrect(r1,ctr.right+xcoord,ycoord);
  1599.          100 : begin
  1600.              y:=bw.top+(menuheight-r1.bottom) div 2;
  1601.                 if fsd.menubar<>nil then
  1602.                    offsetrect(r1,fwidth-xcoord-bw.right-fsd.menubar.r.left,y)
  1603.                 else
  1604.                    offsetrect(r1,fwidth-xcoord-bw.right,y);
  1605. {             if bidileft then begin
  1606.                 if fsd.menubar<>nil then
  1607.                    offsetrect(r1,xcoord+bw.left+fsd.menubar.r.left,y)
  1608.                 else
  1609.                    offsetrect(r1,xcoord+bw.left,y);
  1610.              end else begin
  1611.                 if fsd.menubar<>nil then
  1612.                    offsetrect(r1,fwidth-xcoord-bw.right-fsd.menubar.r.left,y)
  1613.                 else
  1614.                    offsetrect(r1,fwidth-xcoord-bw.right,y);
  1615.              end;}
  1616.            end;
  1617.        end;
  1618.      sysbtn[i].bounds:=r1;
  1619.    end ;
  1620.    if minleft>0 then rightbtn:=minleft;
  1621. end;
  1622. procedure TWinSkinForm.DrawAllSysbtn(acanvas:Tcanvas;rc:TRect);
  1623. var i,j:integer;
  1624. begin
  1625.   for i:= 0 to High(sysbtn) do
  1626.      if SysBtnVisible(i) and (not sysbtn[i].data.map.empty)
  1627.        and (sysbtn[i].data.Visibility<>100) then begin
  1628. //      and (sysbtn[i].data.CombineOp=-1) then begin
  1629.         if (fwindowactive) then j:=1 else j:=4;
  1630.         if (not sysbtn[i].enabled) then j:=4;
  1631.         if sysbtn[i].data.frame<4 then j:=1;
  1632.         if sysbtn[i].data.action in [3,11] then begin
  1633.           DrawIcon(aCanvas.Handle, sysbtn[i].bounds);
  1634.         end else
  1635.           DrawRect1(acanvas.handle,sysbtn[i].bounds,sysbtn[i].data.map,j,sysbtn[i].data.frame,1);
  1636.      end;
  1637. end;
  1638. function TWinSkinForm.MDIChildMax:boolean;
  1639. var b:boolean;
  1640.     ahwnd:Thandle;
  1641. begin
  1642.   result:=false;
  1643.   if (formstyle<>sfsMDIform) or (ClientHwnd=0) then exit;
  1644.   ahwnd:=sendmessage(clienthwnd,WM_MDIGETACTIVE,0,longint(@b));
  1645.   if (ahwnd<>0) and b then result:=true;
  1646. end;
  1647. function TWinSkinForm.SysBtnVisible(i:integer):boolean;
  1648. var b:boolean;
  1649. begin
  1650.   case sysbtn[i].data.Visibility of
  1651.     -1 : b:=false;
  1652.      0: begin
  1653.           result:=true;     //always show
  1654.           //if (formborder = sbsDialog) then  result:=false;
  1655. //          if (sysbtn[i].data.action=0) and (not(sbisystem in formicons)) then
  1656. //               result:=false;
  1657.         end;
  1658.      1: result:= WindowState=swsMax;
  1659.      2: result:= WindowState<>swsMax;
  1660.      3: result:= fwindowactive;
  1661.      4: result:= not fwindowactive;
  1662.      6:begin
  1663.         result:=  ((sbiMin in formIcons) or (sbiMax in formIcons)) and (sbisystem in formicons);
  1664. //        sysbtn[i].enabled:= (sbiMax in formIcons) and (sbisystem in formicons);
  1665.        end;
  1666.      7:result:= not (sbiMax in formIcons);
  1667.      8:result:= ((sbiMin in formIcons) or (sbiMax in formIcons)) and (sbisystem in formicons);
  1668.      9:result:= not (sbiMin in formIcons);
  1669.      100 : result:= MDIChildMax and (menu<>nil);
  1670.      10:result:= (sbiHelp in formIcons) 
  1671.              and (not ((sbiMin in formIcons) or (sbiMax in formIcons))) ;
  1672. //     11:result:= not(biHelp in BorderIcons);
  1673. {     100 :
  1674.        if (fform.FormStyle=fsMDIForm) and
  1675.           (fform.ActiveMDIChild<>nil) and
  1676.           (fform.ActiveMDIChild.windowstate=wsmaximized) then
  1677.              result:=true}
  1678.        200 : result:= (not ismessagebox) and (formborder=sbsDialog);
  1679.        201..999: result:= true;
  1680.        1000..2000 : begin
  1681.             result:=sendmessage(hwnd,CN_CaptionBtnVisible,
  1682.                sysbtn[i].data.Visibility,sysbtn[i].data.action)>0;
  1683.           end;
  1684.        else result:=false;
  1685.   end;
  1686.   b:=false;
  1687.   case sysbtn[i].data.Visibility1 of
  1688.     -1 : b:=false;
  1689.      0: b:=true;     //always show
  1690.      1: b:= WindowState=swsMax;
  1691.      2: b:= WindowState<>swsMax;
  1692.      3: b:= fwindowactive;
  1693.      4: b:= not fwindowactive;
  1694.      6:b:= ((sbiMin in formIcons) or (sbiMax in formIcons)) ; //show with minbutton
  1695.      7:b:= not (sbiMax in formIcons);
  1696.      8:b:= ((sbiMin in formIcons) or (sbiMax in formIcons)) ;
  1697.      9:b:= not (sbiMin in formIcons);
  1698.      10:b:= sbiHelp in formIcons;
  1699. //     11:b:= not(sbiHelp in formIcons);
  1700.      100 : b:=result;
  1701.      200 : result:= (not ismessagebox) and (formborder=sbsDialog);
  1702.      201..2000: result:= true;
  1703.   end;
  1704.   result:= result and b;
  1705.   case sysbtn[i].data.action of
  1706.      0: if not (sbisystem in formIcons) then
  1707.            result:=false;
  1708.      1: sysbtn[i].enabled:= (sbiMax in formIcons) and (sbisystem in formicons);
  1709.      2: sysbtn[i].enabled:= (sbiMin in formIcons) and (sbisystem in formicons);
  1710. {     1: if not (sbiMax in formIcons) then
  1711.            result:= false;
  1712.      2: if not (sbiMin in formIcons) then
  1713.            result:=false;  }
  1714.      3,11,12:   if (formborder = sbsDialog) then
  1715.            result:=false;
  1716.   end;
  1717.   sysbtn[i].Visible:= result;
  1718. end;
  1719. procedure TWinSkinForm.Drawborder(n:integer;Rc:Trect;dc:HDC);
  1720. var r:Trect;
  1721.     temp:Tbitmap;
  1722.     i,tile,sp:integer;
  1723. begin
  1724.    r:=rc;
  1725.    offsetrect(r,-rc.left,-rc.top);
  1726.    if (r.right<0) or (r.bottom<0) then exit;
  1727.    if (not fwindowactive) then
  1728.     i:=2  else i:=1;
  1729.    if (fsd.border[n].frame=1) then  i:=1;
  1730.    if fsd.border[n].tile=1 then tile:=0 else tile:=1;
  1731.    if n<3 then sp:=0 else sp:=1;
  1732. {   if n<3 then begin
  1733.       DrawRectV(dc,rc,fsd.border[n].map,fsd.border[n].r,i,fsd.border[n].frame,tile,sp);
  1734.    end else
  1735.       DrawRectH(dc,rc,fsd.border[n].map,fsd.border[n].r,i,fsd.border[n].frame,tile,sp);}
  1736.    temp:=GetHMap(r,fsd.border[n].map,fsd.border[n].r,I,fsd.border[n].frame,
  1737.          Tile,sp);
  1738.    BitBlt(dc,rc.left ,rc.top,r.right,r.bottom,
  1739.                  temp.Canvas.Handle ,0 ,0 ,Srccopy);
  1740.    temp.free;
  1741. end;
  1742. procedure TWinSkinForm.Uncropwindow;
  1743. begin
  1744.    if crop then  begin
  1745.        //captionbuf.assign(nil);
  1746.        deleteobject(winrgn);
  1747. //       skinstate:=skin_Creating;
  1748.       if formstyle=sfsmdichild then
  1749.           SetWindowRgn(hwnd,0,true)
  1750.       else
  1751.           SetWindowRgn(hwnd,0,false);
  1752. //       skinstate:=skin_Active;
  1753.        crop:=false;
  1754.    end;
  1755. end;
  1756. procedure TWinSkinForm.cropwindow;
  1757. var  rgn1,rgn2,rgn3,rgn4 : HRGN;
  1758.      WR,r1: TRect;
  1759.      fbmp:Tbitmap;
  1760.      t1 : dword;
  1761. begin
  1762. //   dolog(format('****%s Crop Window Start',[caption]));
  1763. //   if formstyle=sfsMDIchild then exit;
  1764.    if (skinstate=skin_Deleted) or (not sMainMenu) then exit;
  1765.    GetWindowRect(hwnd, WR);
  1766.    OffsetRect(wr,-wr.left,-wr.top);
  1767.    if wr.bottom*wr.right=0 then exit;
  1768.    if (formstyle=sfsmdichild) and (windowstate<>swsnormal) then exit;
  1769. //   if (windowstate<>swsnormal) then exit;
  1770.    if (crwidth=wr.right) and (crheight=wr.bottom) then begin
  1771.       if (formstyle<>sfsmdichild) and (SkinState<>skin_change) then  exit;
  1772.    end;
  1773.    if crop then deleteobject(winrgn);
  1774.    crop := false;
  1775.    if (fsd.border[1].trans+fsd.border[2].trans+
  1776.       fsd.border[3].trans+fsd.border[1].trans)= 0 then begin
  1777.       winrgn:= CreateRectRgn(0,0,wr.right,wr.bottom);
  1778.       SetWindowRgn(hwnd,WinRgn,true);
  1779.       crop:=true;
  1780.       exit;
  1781.    end;
  1782.    t1:=gettickcount;
  1783.    crwidth :=wr.right;
  1784.    crheight:=wr.bottom;
  1785.    
  1786.    winrgn:= CreateRectRgn(bw.left,bw.top,
  1787.         wr.right-bw.right,wr.bottom-bw.bottom);
  1788.    if formborder<>sbsnone then begin
  1789.       fbmp:=Tbitmap.create;
  1790.       if (fsd.border[1].trans=1) and (wr.bottom>1) then begin
  1791.         r1:=rect(0,0,bw.left,wr.bottom);
  1792.         fbmp.width:=r1.right;
  1793.         fbmp.height:=r1.bottom;
  1794.         drawborder(1,r1,fbmp.canvas.handle);
  1795.         rgn1:=BitmapToRegion(fbmp,0,0,clFuchsia);
  1796.       end else
  1797.         rgn1:=CreateRectRgn(0,0,bw.left,wr.bottom);
  1798.       if (fsd.border[2].trans=1) and (wr.bottom>1) then begin
  1799.          r1:=rect(0,0,bw.right,wr.bottom);
  1800.          fbmp.width:=r1.right;
  1801.          fbmp.height:=r1.bottom;
  1802.          drawborder(2,r1,fbmp.canvas.handle);
  1803.          rgn2:=BitmapToRegion(fbmp,wr.right-bw.right,0,clFuchsia);
  1804.       end else
  1805.          rgn2:=CreateRectRgn(wr.right-bw.right,0,wr.right,wr.bottom);
  1806.       if fsd.border[4].trans=1 then begin
  1807.          r1:=rect(0,0,wr.right-bw.left-bw.right,bw.bottom);
  1808.          fbmp.width:=r1.right;
  1809.          fbmp.height:=r1.bottom;
  1810.          drawborder(4,r1,fbmp.canvas.handle);
  1811.          if bw.bottom>1 then
  1812.             rgn4:=BitmapToRegion(fbmp,bw.left,wr.bottom-bw.bottom,clFuchsia)
  1813.          else  rgn4:= CreateRectRgn(bw.left,wr.bottom-bw.bottom,
  1814.                wr.right-bw.right,wr.bottom);
  1815.       end else
  1816.           rgn4:= CreateRectRgn(bw.left,wr.bottom-bw.bottom,
  1817.                wr.right-bw.right,wr.bottom);
  1818.       if (fsd.border[3].trans=1) and (bw.top>1) then begin
  1819.          r1:=rect(0,0,wr.right-bw.left-bw.right,bw.top);
  1820.          if (r1.right>0) and (r1.bottom>0) then begin
  1821.             fbmp.width:=r1.right;
  1822.             fbmp.height:=r1.bottom;
  1823.             drawborder(3,r1,fbmp.canvas.handle);
  1824.             rgn3:=BitmapToRegion(fbmp,bw.left,0,clFuchsia);
  1825.          end else
  1826.             rgn3:= CreateRectRgn(bw.left,0,wr.right-bw.right,bw.top);
  1827.       end else
  1828.          rgn3:= CreateRectRgn(bw.left,0,wr.right-bw.right,bw.top);
  1829. {      if (fsd.border[3].trans=1) and (bw.top>1) then begin
  1830.          r1:=rect(0,0,wr.right-bw.left-bw.right,bw.top);
  1831.          if (r1.right>0) and (r1.bottom>0) then begin
  1832.             fbmp.width:=r1.right;
  1833.             fbmp.height:=r1.bottom;
  1834.             if not captionbuf.empty then
  1835.               fbmp.canvas.copyrect(r1,captionbuf.canvas,rect(bw.left,0,r1.right+bw.left,r1.bottom))
  1836.             else   drawborder(3,r1,fbmp.canvas.handle);
  1837.             rgn3:=BitmapToRegion(fbmp,bw.left,0,clFuchsia);
  1838.          end else
  1839.          rgn3:= CreateRectRgn(bw.left,0,wr.right-bw.right,bw.top);
  1840.       end else
  1841.          rgn3:= CreateRectRgn(bw.left,0,wr.right-bw.right,bw.top);}
  1842.      CombineRgn(Rgn1, Rgn1, Rgn2, RGN_OR);
  1843.      CombineRgn(Rgn3, Rgn3, Rgn4, RGN_OR);
  1844.      CombineRgn(Rgn3, Rgn3, Rgn1, RGN_OR);
  1845.      CombineRgn(WinRgn, WinRgn, Rgn3, RGN_OR);
  1846.      DeleteObject(Rgn1);
  1847.      DeleteObject(Rgn2);
  1848.      DeleteObject(Rgn3);
  1849.      DeleteObject(Rgn4);
  1850.      fbmp.free;
  1851.    end;
  1852.    SetWindowRgn(hwnd,WinRgn,true);
  1853. //   SetWindowRgn(hwnd,WinRgn,false);
  1854.    crop:=true;
  1855.   {$IFDEF test}
  1856.    t1:=gettickcount-t1;
  1857.    doLog('crop window :'+inttostr(t1));
  1858.    {$endif}
  1859. end;
  1860. {procedure TWinSkinForm.cropwindow;
  1861. var  borderRgn : Thandle;
  1862.      WR: TRect;
  1863.      fbmp:Tbitmap;
  1864.      t1 : dword;
  1865. begin
  1866.    t1:=gettickcount;
  1867.    if crop then deleteobject(winrgn);
  1868.    fbmp:=Tbitmap.create;
  1869.    GetWindowRect(fform.Handle, WR);
  1870.    OffsetRect(wr,-wr.left,-wr.top);
  1871.    fwidth :=wr.right;
  1872.    fheight:=wr.bottom;
  1873.    fbmp.width:=wr.right;
  1874.    fbmp.height:=wr.bottom;
  1875.    fbmp.canvas.Brush.color := clBtnFace;
  1876.    fbmp.canvas.FillRect(wr);
  1877. //   fbmp.canvas.copyrect(wr,fform.canvas,wr);
  1878.    drawborder(1,rect(0,0,bw.left,wr.bottom),fbmp.canvas.handle);
  1879.    drawborder(2,rect(wr.right-bw.right,0,wr.right,wr.bottom),fbmp.canvas.handle);
  1880.    DrawFLine(fbmp.canvas.handle);
  1881.    //   drawborder(3,rect(bw.left,0,wr.right-bw.right,bw.top),fbmp.canvas);
  1882.    drawborder(4,rect(bw.left,wr.bottom-bw.bottom,wr.right-bw.right,wr.bottom),fbmp.canvas.handle);
  1883.    winrgn := BitmapToRegion(fbmp,0,0,clFuchsia);
  1884.    fbmp.free;
  1885.    SetWindowRgn(fform.Handle,WinRgn,True);
  1886.    crop:=true;
  1887.    t1:=gettickcount-t1;
  1888.    doLog('crop window :'+inttostr(t1));
  1889. end;}
  1890. procedure TWinSkinForm.getClipMap(fbmp:Tbitmap);
  1891. var   WR: TRect;
  1892. begin
  1893.    GetWindowRect(fform.Handle, WR);
  1894.    OffsetRect(wr,-wr.left,-wr.top);
  1895.    fbmp.width:=wr.right;
  1896.    fbmp.height:=wr.bottom;
  1897. //   fillrect(fbmp.canvas.handle,wr,fsd
  1898.    fbmp.canvas.Brush.color := clBtnFace;
  1899.    fbmp.canvas.FillRect(wr);
  1900.    drawborder(1,rect(0,0,bw.left,wr.bottom),fbmp.canvas.handle);
  1901.    drawborder(2,rect(wr.right-bw.right,0,wr.right,wr.bottom),fbmp.canvas.handle);
  1902.    DrawFLine(fbmp.canvas.handle);
  1903.    //   drawborder(3,rect(bw.left,0,wr.right-bw.right,bw.top),fbmp.canvas);
  1904.    drawborder(4,rect(bw.left,wr.bottom-bw.bottom,wr.right-bw.right,wr.bottom),fbmp.canvas.handle);
  1905. end;
  1906. procedure TWinSkinForm.GetWindowstate;
  1907. var wp:WINDOWPLACEMENT;
  1908. begin
  1909.     wp.length:=sizeof(WINDOWPLACEMENT);
  1910.     GetWindowPlacement(hWnd,@wp);
  1911.     case wp.showCmd of
  1912.       SW_MINIMIZE,SW_SHOWMINIMIZED,SW_SHOWMINNOACTIVE: windowstate:=swsmin;
  1913.       SW_SHOWMAXIMIZED:windowstate:=swsmax;
  1914.       else windowstate:=swsnormal;
  1915.     end;
  1916. end;
  1917. procedure TWinSkinForm.GetFormstyle;
  1918. var hctrl : Thandle;
  1919.     aname:string;
  1920.     style:longint;
  1921. begin
  1922.    formstyle:=sfsnormal;
  1923.    hCtrl := GetTopWindow( hWnd );
  1924.    while ( hCtrl<>0 ) do begin
  1925.       aname:=getwindowclassName( hCtrl);
  1926.       if aname='MDIClient' then begin
  1927.          formstyle:=sfsMDIform;
  1928.          clienthwnd:=hctrl;
  1929.          skinmanager.clienthwnd:=hctrl;
  1930.          skinmanager.MDIForm:=fform;
  1931.          break;
  1932.       end;
  1933.       hCtrl := GetNextWindow( hCtrl, GW_HWNDNEXT );
  1934.    end;
  1935. end;
  1936. procedure TWinSkinForm.WMNCCalcSize(Var Msg: TMessage);
  1937. var rgrc: PNCCalcSizeParams;
  1938.   WP: PWindowPos;
  1939.   wr,sr:Trect;
  1940.   s:string;
  1941.   style:uint;
  1942.   m_lLeft, m_lRight, m_lTop, m_lBottom: integer;
  1943. begin
  1944.   default(msg);
  1945.   if boolean(Msg.wParam) then begin
  1946.     rgrc := PNCCalcSizeParams(Msg.lParam);
  1947.     WP := rgrc^.lppos;
  1948. //    with rgrc^.rgrc[0] do
  1949. //      s:=format('%1d,%1d,%1d,%1d',[left,top,right,bottom]);
  1950.     if ((formstyle=sfsmdichild) and (windowstate <>swsnormal))
  1951.        or (formborder=sbsnone) then begin
  1952.        rgrc^.rgrc[1] := rgrc^.rgrc[0];
  1953.        Msg.lParam := longint(rgrc);
  1954.        Msg.Result := WVR_VALIDRECTS;
  1955. //       skinaddlog('Default WMNCCalcSize '+s);
  1956.        exit;
  1957.     end;
  1958.     with rgrc^.rgrc[0] do begin
  1959.       right := wp^.x+wp^.cx-bw.right;
  1960.       left := wp^.x+bw.left;
  1961.       top := wp^.y+bw.top+menuheight;
  1962.       bottom := wp^.y+wp^.cy-bw.bottom;
  1963. //      s:=format('%1d,%1d,%1d,%1d',[left,top,right,bottom]);
  1964.     end;
  1965. //    skinaddlog('*******Do WMNCCalcSize '+s);
  1966.     rgrc^.rgrc[1] := rgrc^.rgrc[0];
  1967.     Msg.lParam := longint(rgrc);
  1968.     Msg.Result := WVR_VALIDRECTS;
  1969.     Done:=true;
  1970.   end else begin
  1971.      Msg.Result:=0;
  1972.   end;
  1973. end;
  1974. function msgtostr(aMsg: Tmessage):string;
  1975. var s,s1:string;
  1976.     i:integer;
  1977. begin
  1978.   s:='';
  1979.   with amsg do
  1980.     case Msg of
  1981. //      WM_STYLECHANGED:s:='WM_STYLECHANGED';
  1982.       WM_DESTROY:s:='WM_DESTROY';
  1983.       WM_NCDESTROY:s:='WM_NCDESTROY';
  1984. //      WM_NCHITTEST: ok:=false;//dolog('WM_NCHITTEST');
  1985.       WM_NCPAINT: s:='WM_NCPAINT';
  1986.       WM_Paint: s:=format('WM_Paint %1x',[amsg.wparam]);
  1987.       WM_NCACTIVATE: begin
  1988.            s:='WM_NCACTIVATE';
  1989.            if BOOLean(wParam) then s:=s+'  avtive'
  1990.            else s:=s+' Deavtive';
  1991.          end;
  1992.       WM_NCCALCSIZE: s:='WM_NCCALCSIZE' ;
  1993.       WM_SIZE:begin
  1994.            s:='WM_SIZE ';
  1995.            i:= WParam;
  1996.            case i of
  1997.               SIZE_RESTORED   : s := s+'SIZE_RESTORED';
  1998.               SIZE_MINIMIZED  : s := s+'SIZE_MINIMIZED';
  1999.               SIZE_MAXIMIZED  : s := s+'SIZE_MAXIMIZED';
  2000.            end;
  2001.            s:=s+format(' (%1d,%1d)',[LParamLo,LParamhi]);
  2002.          end;
  2003.       WM_MENUCHAR : s:='WM_MENUCHAR';
  2004.       WM_WINDOWPOSCHANGED:begin
  2005.           s:='WM_WINDOWPOSCHANGED';
  2006.          end;
  2007.       WM_ACTIVATE:begin
  2008.            s:= 'WM_ACTIVATE';
  2009.            if LOWORD(amsg.wParam)=WA_INACTIVE then s:=s+'  Deavtive'
  2010.            else s:=s+' avtive';
  2011.          end;
  2012.       WM_LBUTTONUP:s:='WM_LBUTTONUP';
  2013.       WM_LBUTTONDOWN:s:='WM_LBUTTONDOWN';
  2014.       WM_NCLButtonDown:s:='WM_NCLButtonDown';
  2015.       WM_NCLButtonUp:s:='WM_NCLButtonUp';
  2016.       WM_NCRButtonDown:s:='WM_NCRButtonDown';
  2017.       WM_NCRButtonUp:s:='WM_NCRButtonUp';
  2018. //      WM_NCMOUSEMOVE:s:='WM_NCMOUSEMOVE';
  2019.       WM_ERASEBKGND:s:='WM_ERASEBKGND';
  2020.       WM_INITMENU :s:='WM_INITMENU';
  2021.       WM_INITMENUPOPUP:s:='WM_INITMENUPOPUP';
  2022.       WM_MENUSELECT:s:='WM_MENUSELECT';
  2023.       WM_PRINTCLIENT:s:='WM_PRINTCLIENT';
  2024.       WM_PRINT:s:='WM_PRINT';
  2025.       WM_MEASUREITEM:s:='WM_MEASUREITEM';
  2026.       WM_DRAWITEM:s:='WM_DRAWITEM';
  2027.       WM_CTLCOLORSTATIC :s:=format('WM_CTLCOLORSTATIC %1x',[amsg.wparam]);
  2028. //      WM_CTLCOLOREDIT :s:='WM_CTLCOLOREDIT';
  2029.       WM_CTLCOLOR:s:=format('WM_CTLCOLOR %1x',[amsg.wparam]);
  2030.       WM_CTLCOLORBTN:s:=format('WM_CTLCOLORBTN %1x',[amsg.wparam]);
  2031.       WM_HSCROLL :begin
  2032.             s:='WM_HSCROLL';
  2033.         end;
  2034.       WM_VSCROLL : begin
  2035.            s:='WM_VSCROLL';
  2036.          case amsg.WParamLo of
  2037.            SB_LINEUp: s:=s+' SB_LINEUp';
  2038.            SB_LINEDown:s:=s+' SB_LINEDown';
  2039.            SB_THUMBPOSITION: s:=s+' SB_THUMBPOSITION';
  2040.            SB_THUMBTRACK : s:=s+' SB_THUMBTRACK';
  2041.            SB_PAGEUp:s:=s+' SB_PAGEUp';
  2042.            SB_PAGEDown :s:=s+' SB_PAGEDown';
  2043.            SB_ENDSCROLL :s:=s+' SB_ENDSCROLL';
  2044.          end;
  2045.            s:=s+format(' Pos:%1d',[amsg.WParamhi]);
  2046.         end;
  2047.       WM_INITDIALOG:s:='WM_INITDIALOG';
  2048.       WM_SETTEXT :s:='WM_SETTEXT';
  2049.       WM_COMMAND :s:='WM_COMMAND';
  2050.       WM_MDIREFRESHMENU:s:='WM_MDIREFRESHMENU';
  2051.       WM_GETMINMAXINFO:s:='WM_GETMINMAXINFO';
  2052.       WM_CHILDACTIVATE:s:='WM_CHILDACTIVATE';
  2053.       CN_NewForm :s:='CN_SkinActive';
  2054.       CN_HSCROLL:s:='CN_HSCROLL';
  2055.       WM_MOVE:s:='WM_MOVE';
  2056.       WM_SETREDRAW:s:='WM_SETREDRAW';
  2057.       CM_MENUCHANGED:s:='CM_MENUCHANGED';
  2058.       WM_WINDOWPOSCHANGING:s:='WM_WINDOWPOSCHANGING';
  2059.       WM_MDIACTIVATE :s:=format('WM_MDIACTIVATE deactive:%1x, active:%1x',[amsg.wparam,amsg.lparam]);
  2060.       WM_PARENTNOTIFY:begin
  2061.             if WParamLo = WM_CREATE then s:=s+format('WM_PARENTNOTIFY WM_CREATE %1x',[amsg.lparam]);
  2062.             if WParamLo = WM_DESTROY then s:=s+format('WM_PARENTNOTIFY WM_DESTROY %1x',[amsg.lparam]);
  2063.          end;
  2064.       CBN_DROPDOWN:s:='CBN_DROPDOWN';
  2065.     end;
  2066. //  if s='' then
  2067. //     s:=format('%4.0x,%04x,%04x',[amsg.msg,amsg.wparam,amsg.lparam]);
  2068.   if s<>'' then
  2069.      s:=format('%s,%04x,%04x',[s,amsg.wparam,amsg.lparam]);
  2070.   result:=s;
  2071. end;
  2072. procedure DrawBGbmp(acanvas:Tcanvas;Dst:Trect;Bitmap:TBitmap;SrcRect: TRect);
  2073. var
  2074.   i, j: integer;
  2075.   W, H: integer;
  2076.   b:Tbitmap;
  2077. begin
  2078.   W := SrcRect.right-srcrect.left;
  2079.   H := srcrect.bottom-srcrect.top;
  2080.   if (w<0) or (h<0) or (W * H = 0) then Exit;
  2081.   b:=Tbitmap.create;
  2082.   b.width:=w;
  2083.   b.height:=h;
  2084.   b.canvas.copyrect(rect(0,0,w,h),bitmap.canvas,srcrect);
  2085.     i := dst.left;
  2086.     While i < (dst.right ) do
  2087.     begin
  2088.         j := dst.top;
  2089.         While j < (dst.Bottom) do
  2090.         begin
  2091.             aCanvas.Draw(i, j, b);
  2092.             Inc(j, h);
  2093.         end;
  2094.         Inc(i, w);
  2095.     end;
  2096.   b.free;
  2097. end;
  2098. procedure TWinSkinForm.ToolBarDrawBackground(Sender: TToolBar; const ARect: TRect; var DefaultDraw: Boolean);
  2099. var t:Ttoolbar;
  2100.     old:integer;
  2101. begin
  2102.    t:=TToolbar(sender);
  2103.    if  (fsd.Toolbar<>nil) and (not (xoToolbarBK in fsd.Options)) then begin
  2104.        old:=SetStretchBltMode(t.Canvas.Handle,STRETCH_DELETESCANS);
  2105.        StretchBlt(t.Canvas.Handle,
  2106.               arect.left,arect.top,arect.right-arect.left,arect.bottom-arect.top,
  2107.               fsd.Toolbar.map.canvas.handle,0,0,fsd.Toolbar.map.Width,fsd.Toolbar.map.Height,SRCCOPY);
  2108.        SetStretchBltMode(t.Canvas.Handle,old);
  2109.    end;
  2110. //    DefaultDraw:=true;
  2111. end;
  2112. procedure TWinSkinForm.MeasureItem(Sender: TObject; ACanvas: TCanvas;
  2113.   var Width, Height: Integer);
  2114. var item:TMenuItemAccess;
  2115.      me:TMenuMeasureItemEvent;
  2116.      ImageList: TCustomImageList;
  2117. begin
  2118.     item:=TMenuItemAccess(sender);
  2119.     ImageList := item.GetImageList;
  2120.     me:= item.OnMeasureItem;
  2121.     item.OnMeasureItem := nil;
  2122.     item.MeasureItem(acanvas,width,height);
  2123.     if fsd.MenuItem<>nil then inc(width,fsd.MenuItem.r.Left);
  2124.     if Assigned(ImageList) then inc(width,10)
  2125.     else inc(width,35);
  2126.     item.OnMeasureItem := me;
  2127. end;
  2128. {
  2129. var item:Tmenuitem;
  2130.     s:string;
  2131. begin
  2132.    item:=TMenuItem(sender);
  2133.   if item.ShortCut <> 0 then
  2134.     s := Concat(item.Caption, ShortCutToText(item.ShortCut))
  2135.   else s := item.Caption;
  2136.    width:= acanvas.TextWidth(s)+26;
  2137.   if (item.Caption <> cLineCaption) then inc(height,4)
  2138.   else height:=8;
  2139.   if (winversion >= $80000000) then
  2140.        inc(height,4);
  2141. end;}
  2142. procedure TWinSkinForm.MeasureItemPop(Sender: TObject; ACanvas: TCanvas;
  2143.   var Width, Height: Integer);
  2144. var item:TMenuItemAccess;
  2145.      ImageList: TCustomImageList;
  2146. begin
  2147.     if fsd=nil then exit;
  2148.     item:=TMenuItemAccess(sender);
  2149.     ImageList := item.GetImageList;
  2150. //    item.OnMeasureItem := nil;
  2151. //    item.MeasureItem(acanvas,width,height);
  2152. try
  2153.     if (not IsBadReadPtr(fsd, fsd.InstanceSize)) and (fsd.MenuItem<>nil) then
  2154.        inc(width,fsd.MenuItem.r.Left);
  2155. except
  2156. end;
  2157.     if Assigned(ImageList) then inc(width,12)
  2158.     else inc(width,35);
  2159. //    item.OnMeasureItem := MeasureItempop;
  2160. {     inc(width,28);
  2161.      if (winversion >= $80000000) and
  2162.         (Tmenuitem(sender).Caption <> cLineCaption) then
  2163.       inc(height,4);}
  2164. end;
  2165. function TWinSkinForm.GetMenuBG:Tbitmap;
  2166. var ahwnd:Thandle;
  2167.     pmenu:Twinskinpopmenu;
  2168. begin
  2169.    result:=nil;
  2170.    ahwnd:=GetTopWindow(0);
  2171.    pmenu := Twinskinpopmenu(GetProp(ahwnd, c_menuprop));
  2172.    if pmenu<>nil then
  2173.      result := pmenu.menubg;
  2174. end;
  2175. procedure TWinSkinForm.DrawMenuItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect;
  2176.       Selected: Boolean);
  2177. var i:integer;
  2178.     b,b1,temp:Tbitmap;
  2179.     rc,r1,r2:Trect;
  2180.     item:Tmenuitem;
  2181. begin
  2182.     skinmanager.setpopmenu;
  2183.     if fsd.menuitem= nil then begin
  2184.        DefaultMenuItem(sender,acanvas,arect,selected);
  2185.        exit;
  2186.     end;
  2187.     rc:=arect;
  2188.     r1:=arect;
  2189.     offsetrect(r1,3,3);
  2190.     item:=Tmenuitem(Sender);
  2191. {    if (newskinmenu<>nil) and assigned(item.parent) then begin
  2192.        newskinmenu.hmenu:=item.parent.handle;
  2193.        newskinmenu:=nil;
  2194.     end;}
  2195.     if assigned(item.parent) then begin
  2196.        skinmanager.sethmenu(item.parent.handle);
  2197.     end;
  2198.     offsetrect(rc,-rc.left,-rc.top);
  2199.     b:=Tbitmap.create;
  2200.     b.width:=rc.right;
  2201.     b.height:=rc.bottom;
  2202.     b.Canvas.Font := Screen.MenuFont;
  2203.     temp:=SkinManager.getmenubg(item.parent.handle);
  2204. //    temp:=getmenubg();
  2205.     if (temp<>nil) and (not temp.empty) then begin
  2206.       b.canvas.copyrect(rc,temp.canvas,r1) ;
  2207. //      fsd.DoDebug('DrawMenuItem');
  2208.     end else begin
  2209.        b.canvas.brush.color:=fsd.colors[csMenubg];
  2210.        b.canvas.fillrect(rc);
  2211.     end;
  2212.     i:=1;
  2213.     if selected then i:=4;
  2214.     if item.caption<>cLineCaption then begin
  2215.       DrawRect2(b.canvas.handle,rc,fsd.menuitem.map,
  2216.          fsd.menuitem.r,i,5,fsd.menuitem.trans,fsd.menuitem.tile);
  2217.       DrawItemText(Item,b.Canvas,rc,Selected);
  2218.       acanvas.draw(arect.left,arect.top,b);
  2219.     end else begin
  2220.       i:=2;
  2221.       acanvas.draw(arect.left,arect.top,b);
  2222.       DrawMenuCaption(ACanvas,arect);
  2223.     end;
  2224.     b.free;
  2225. end;
  2226. procedure TWinSkinForm.DrawMenuCaption(ACanvas: TCanvas; ARect: TRect);
  2227. var temp:Tbitmap;
  2228.     rc,r1,r2:Trect;
  2229.     w,h,x,y:integer;
  2230. begin
  2231.    temp:=Tbitmap.create;
  2232.    rc:=arect;
  2233.    offsetrect(rc,-rc.left,-rc.top);
  2234.    temp.width:=rc.right;
  2235.    temp.height:=rc.bottom;
  2236.    w:=fsd.menuitem.map.width div 5;
  2237.    h:= fsd.menuitem.map.height;
  2238.    if h>rc.bottom then y:= h-rc.bottom
  2239.    else y:=0;
  2240.    x:= w;
  2241.    //left
  2242.    r1:=rect(0,0,fsd.menuitem.r.left,rc.bottom);
  2243.    r2:=rect(x,y,x+fsd.menuitem.r.left,h);
  2244.    temp.canvas.copyrect(r1,fsd.menuitem.map.canvas,r2);
  2245.    //right
  2246.    r1:=rect(rc.right-fsd.menuitem.r.right,0,rc.right,rc.bottom);
  2247.    r2:=rect(w+x-fsd.menuitem.r.right,y,w+x,h);
  2248.    temp.canvas.copyrect(r1,fsd.menuitem.map.canvas,r2);
  2249.    //center
  2250.    r1:=rect(fsd.menuitem.r.left,0,rc.right-fsd.menuitem.r.right,rc.bottom);
  2251.    r2:=rect(x+fsd.menuitem.r.left,y,w+x-fsd.menuitem.r.right,h);
  2252.    temp.canvas.copyrect(r1,fsd.menuitem.map.canvas,r2);
  2253.    temp.Transparent:=true;
  2254.    temp.Transparentcolor:=clFuchsia;
  2255.    acanvas.draw(arect.left,arect.top,temp);
  2256.    temp.free;
  2257. end;
  2258. procedure TWinSkinForm.DrawHMenuItem2(Amenu:Hmenu;Sender:TObject; ACanvas: TCanvas; ARect: TRect;
  2259.       Selected: Boolean);
  2260. var i:integer;
  2261.     b,b1,temp:Tbitmap;
  2262.     rc,r1,r2:Trect;
  2263.     item:Tmenuitem;
  2264. begin
  2265.     if fsd.menuitem= nil then begin
  2266. //       Drawmymenuitem(sender,acanvas,arect,selected);
  2267.        DefaultMenuItem(sender,acanvas,arect,selected);
  2268.        exit;
  2269.     end;
  2270.     rc:=arect;
  2271.     r1:=arect;
  2272.     offsetrect(r1,3,3);
  2273.     item:=Tmenuitem(Sender);
  2274.     offsetrect(rc,-rc.left,-rc.top);
  2275.     b:=Tbitmap.create;
  2276.     b.width:=rc.right;
  2277.     b.height:=rc.bottom;
  2278.     b.Canvas.Font := Screen.MenuFont;
  2279.     temp:=SkinManager.getmenubg(amenu);
  2280.     //temp:=getmenubg();
  2281.     if temp<>nil then
  2282.       b.canvas.copyrect(rc,temp.canvas,r1)
  2283.     else begin
  2284.        b.canvas.brush.color:=fsd.colors[csMenubg];
  2285.        b.canvas.fillrect(rc);
  2286.     end;
  2287.     i:=1;
  2288.     if selected then i:=4;
  2289.     DrawRect2(b.canvas.handle,rc,fsd.menuitem.map,
  2290.        fsd.menuitem.r,i,5,fsd.menuitem.trans,fsd.menuitem.tile);
  2291.     DrawItemText(Item,b.Canvas,rc,Selected);
  2292.     acanvas.draw(arect.left,arect.top,b);
  2293.     b.free;
  2294. end;
  2295. procedure TWinSkinForm.DefaultMenuItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect;
  2296.       Selected: Boolean);
  2297. var i:integer;
  2298.     b,b1,temp:Tbitmap;
  2299.     rc,r1,r2:Trect;
  2300.     item:Tmenuitem;
  2301. begin
  2302.     rc:=arect;
  2303.     item:=Tmenuitem(Sender);
  2304.     offsetrect(rc,-rc.left,-rc.top);
  2305.     b:=Tbitmap.create;
  2306.     b.width:=rc.right;
  2307.     b.height:=rc.bottom;
  2308.     b.Canvas.Font := Screen.MenuFont;
  2309.     if selected then
  2310.        b.canvas.brush.color:= fsd.colors[csHilight]
  2311.     else b.canvas.brush.color:=fsd.colors[csMenuBG];//[csbuttonface];
  2312.     b.canvas.fillrect(rc);
  2313.     DrawItemText(Item,b.Canvas,rc,Selected);
  2314.     acanvas.draw(arect.left,arect.top,b);
  2315.     b.free;
  2316. end;
  2317. procedure TWinSkinForm.DoDrawText(item:Tmenuitem;ACanvas: TCanvas; const ACaption: widestring;
  2318.   var Rect: TRect; Selected: Boolean; Flags: Longint);
  2319. var Text: widestring;
  2320.   R: TRect;
  2321.   ParentMenu: TMenu;
  2322.   acolor:Tcolor;
  2323.   b:boolean;
  2324. begin
  2325. {  ParentMenu := Item.GetParentMenu;
  2326.   if (ParentMenu <> nil) and (ParentMenu.IsRightToLeft) then begin
  2327.     if Flags and DT_RIGHT = DT_RIGHT then
  2328.       Flags := Flags and (not DT_RIGHT) or DT_LEFT
  2329.     else if Flags and DT_LEFT = DT_LEFT then
  2330.       Flags := Flags and (not DT_LEFT) or DT_RIGHT;
  2331.     Flags := Flags or DT_RTLREADING;
  2332.   end;}
  2333.   Text := ACaption;
  2334.   if (Flags and DT_CALCRECT <> 0) and ((Text = '') or
  2335.     (Text[1] = cHotkeyPrefix) and (Text[2] = #0)) then Text := Text + ' ';
  2336.   with ACanvas do begin
  2337.     if Text = cLineCaption then  begin
  2338.       if Flags and DT_CALCRECT = 0 then begin
  2339.         R := Rect;
  2340.         Inc(R.Top, 4);
  2341.         inc(r.left,0);
  2342.         DrawEdge(Handle, R, EDGE_ETCHED, BF_TOP);
  2343.       end;
  2344.     end else begin
  2345.       Brush.Style := bsClear;
  2346.       if item.Default then
  2347.         Font.Style := Font.Style + [fsBold];
  2348. //      b:=item.Enabled;
  2349. //      if item.Action.
  2350.       if not item.Enabled then  begin
  2351.           if fsd.colors[csbuttonshadow]<>fsd.colors[csMenuText] then
  2352.             Font.Color := fsd.colors[csbuttonshadow]
  2353.           else
  2354.             Font.Color := clBtnShadow;
  2355.       end else begin
  2356.          if Selected then begin
  2357.            Font.Color := fsd.colors[csHilightText];
  2358.          end else begin
  2359.            Font.Color := fsd.colors[csMenuText];
  2360.          end;
  2361.       end;
  2362. //      DrawText(Handle, PChar(Text), Length(Text), Rect, Flags);
  2363.       Tnt_DrawTextW(Handle,Text, Rect, Flags);
  2364.     end;
  2365.   end;
  2366. end;
  2367. procedure TWinSkinForm.DrawItemText(Item:TMenuitem;ACanvas: TCanvas;
  2368.                  ARect: TRect;Selected:boolean);
  2369. const
  2370.   Alignments: array[TPopupAlignment] of Word = (DT_LEFT, DT_RIGHT, DT_CENTER);
  2371.   EdgeStyle: array[Boolean] of Longint = (BDR_RAISEDINNER, BDR_SUNKENOUTER);
  2372. var
  2373.   ImageList: TCustomImageList;
  2374.   ParentMenu: TMenu;
  2375.   Alignment: TPopupAlignment;
  2376.   DrawImage, DrawGlyph: Boolean;
  2377.   GlyphRect, SaveRect: TRect;
  2378.   DrawStyle,DrawStyle2: Longint;
  2379.   Glyph: TBitmap;
  2380.   OldBrushColor: TColor;
  2381.   w:integer;
  2382.   text:widestring;
  2383.   
  2384.   procedure DrawItemRight;
  2385.   begin
  2386.    GlyphRect.right := ARect.right -1;
  2387.    GlyphRect.Top := ARect.Top + 1;
  2388.    if fsd.MenuItem<>nil then glyphrect.right:=glyphrect.right-fsd.MenuItem.r.Left;
  2389.    if item.Caption = cLineCaption then begin
  2390.         GlyphRect.Left := ARect.right;
  2391.         GlyphRect.Right := ARect.right;//-2;
  2392.         DrawGlyph := False;
  2393.    end else begin
  2394.         GlyphRect.left := GlyphRect.right - w;
  2395.         GlyphRect.Bottom := GlyphRect.Top + w;
  2396.         if (ImageList<>nil) and (item.ImageIndex > -1) and (item.ImageIndex < ImageList.Count) then begin
  2397.             if item.checked then begin
  2398.               OldBrushColor := Acanvas.Brush.Color;
  2399.               Acanvas.Brush.Bitmap := AllocPatternBitmap(clBtnFace, clBtnHighlight);
  2400.               acanvas.FillRect(GlyphRect);
  2401.               //acanvas.FrameRect(GlyphRect);
  2402.               Acanvas.Brush.Color:=OldBrushColor;
  2403.               DrawEdge(acanvas.Handle,GlyphRect,BDR_SUNKENOUTER, BF_RECT);
  2404.             end ;
  2405.             ImageList.Draw(ACanvas, GlyphRect.Left, GlyphRect.Top, item.ImageIndex,
  2406.                 item.Enabled);
  2407.         end else if item.checked then begin
  2408. //              { Draw a menu check
  2409.             Glyph := TBitmap.Create;
  2410.             try
  2411.                 Glyph.Transparent := True;
  2412.                 Glyph.Handle := LoadBitmap(0, PChar(OBM_CHECK));
  2413.                 OldBrushColor := acanvas.Font.Color;
  2414.                 acanvas.Font.Color := clBtnText;
  2415.                 acanvas.Draw(GlyphRect.Left + (GlyphRect.Right - GlyphRect.Left - Glyph.Width) div 2 + 1,
  2416.                   GlyphRect.Top + (GlyphRect.Bottom - GlyphRect.Top - Glyph.Height) div 2 + 1, Glyph);
  2417.                 acanvas.Font.Color := OldBrushColor;
  2418.             finally
  2419.                 Glyph.Free;
  2420.             end;
  2421.       end;
  2422.    end;
  2423.    ARect.right := GlyphRect.left - 1;
  2424.    Inc(ARect.Left, 1);
  2425.    Dec(ARect.Right, 2);
  2426. //   DrawStyle := DT_EXPANDTABS or DT_SINGLELINE or Alignments[Alignment];
  2427.    DrawStyle := DT_EXPANDTABS or DT_SINGLELINE or DT_RIGHT or DT_RTLREADING;
  2428.    DrawStyle2 := DT_Left;
  2429. //       Calculate vertical layout
  2430.    SaveRect := ARect;
  2431.    DoDrawText(item,ACanvas, text, ARect, Selected, DrawStyle or DT_CALCRECT or DT_NOCLIP);
  2432.    OffsetRect(ARect, 0, ((SaveRect.Bottom - SaveRect.Top) - (ARect.Bottom - ARect.Top)) div 2);
  2433.    arect.Left := saverect.left;arect.right:=saverect.Right;
  2434.    DoDrawText(item,ACanvas, text, ARect, Selected, DrawStyle);
  2435.    if (item.ShortCut <> 0) then begin
  2436.         //ARect.Right := ARect.left-2;
  2437.         ARect.Left := Saverect.left+10;
  2438.         //ARect.Right := SaveRect.Right - 2;
  2439.         DoDrawText(item,ACanvas, ShortCutToText(item.ShortCut), ARect, Selected, DrawStyle2);
  2440.    end;
  2441.   end;
  2442. begin
  2443. //    if Assigned(item.Action) then item.Action.Update;
  2444.     text:=GetStringProp(item,'Caption');
  2445.     ParentMenu := item.GetParentMenu;
  2446.     ImageList := item.GetImageList;
  2447.     if (parentmenu = nil) and (menu<>nil) then
  2448.       parentmenu:=menu.menu;
  2449.     Alignment := paLeft;
  2450.     if ParentMenu is TMenu then
  2451.         Alignment := paLeft
  2452.     else if ParentMenu is TPopupMenu then
  2453.         Alignment := TPopupMenu(ParentMenu).Alignment
  2454.     else Alignment := paLeft;
  2455.     w:=16;
  2456.     if (ImageList<>nil) then w:=ImageList.Width ;
  2457.     //else w:=2;
  2458.     if item.checked and (w<16) then w:=16;
  2459.     if ParentMenu.IsRightToLeft then begin
  2460.        DrawitemRight;
  2461.        exit;
  2462.     end;
  2463.    GlyphRect.Left := ARect.Left + 1;
  2464.    GlyphRect.Top := ARect.Top + 1;
  2465.    if fsd.MenuItem<>nil then glyphrect.Left:=glyphrect.Left+fsd.MenuItem.r.Left;
  2466.    if item.Caption = cLineCaption then begin
  2467.         GlyphRect.Left := 0;
  2468.         GlyphRect.Right := 0;//-2;
  2469.         DrawGlyph := False;
  2470.    end else begin
  2471.         GlyphRect.Right := GlyphRect.Left + w;
  2472.         GlyphRect.Bottom := GlyphRect.Top + w;
  2473.         if (ImageList<>nil) and (item.ImageIndex > -1) and (item.ImageIndex < ImageList.Count) then begin
  2474.             if item.checked then begin
  2475.               OldBrushColor := Acanvas.Brush.Color;
  2476.               Acanvas.Brush.Bitmap := AllocPatternBitmap(clBtnFace, clBtnHighlight);
  2477.               acanvas.FillRect(GlyphRect);
  2478.               //acanvas.FrameRect(GlyphRect);
  2479.               Acanvas.Brush.Color:=OldBrushColor;
  2480.               GlyphRect.Top := arect.Top+((Arect.Bottom-arect.Top)-16) div 2;
  2481.               DrawEdge(acanvas.Handle,GlyphRect,BDR_SUNKENOUTER, BF_RECT);
  2482.             end else
  2483.               GlyphRect.Top := arect.Top+((Arect.Bottom-arect.Top)-imagelist.Height) div 2;
  2484.             ImageList.Draw(ACanvas, GlyphRect.Left, GlyphRect.Top, item.ImageIndex,
  2485.                 item.Enabled);
  2486.         end else if item.checked then begin
  2487. //              { Draw a menu check
  2488.             Glyph := TBitmap.Create;
  2489.             try
  2490.                 Glyph.Transparent := True;
  2491.                 Glyph.Handle := LoadBitmap(0, PChar(OBM_CHECK));
  2492.                 GlyphRect.Top := arect.Top+((Arect.Bottom-arect.Top)-glyph.Height) div 2;
  2493.                 OldBrushColor := acanvas.Font.Color;
  2494.                 acanvas.Font.Color := clBtnText;
  2495.                 acanvas.Draw(GlyphRect.Left + (GlyphRect.Right - GlyphRect.Left - Glyph.Width) div 2 + 1,
  2496.                   GlyphRect.Top + 1, Glyph);
  2497.                 acanvas.Font.Color := OldBrushColor;
  2498.             finally
  2499.                 Glyph.Free;
  2500.             end;
  2501.         end;
  2502.    end;
  2503.    ARect.Left := GlyphRect.Right + 1;
  2504.    Inc(ARect.Left, 2);
  2505.    Dec(ARect.Right, 1);
  2506. //   DrawStyle := DT_EXPANDTABS or DT_SINGLELINE or Alignments[Alignment];
  2507.       DrawStyle := DT_EXPANDTABS or DT_SINGLELINE or DT_Left;
  2508.       DrawStyle2 := DT_Right;
  2509. //       Calculate vertical layout
  2510.    SaveRect := ARect;
  2511.    DoDrawText(item,ACanvas, text, ARect, Selected, DrawStyle or DT_CALCRECT or DT_NOCLIP);
  2512.    OffsetRect(ARect, 0, ((SaveRect.Bottom - SaveRect.Top) - (ARect.Bottom - ARect.Top)) div 2);
  2513. //   arect.Left := saverect.left;arect.right:=saverect.Right;
  2514.    DoDrawText(item,ACanvas, text, ARect, Selected, DrawStyle);
  2515.    if (item.ShortCut <> 0) then begin
  2516.         ARect.Left := ARect.Right;
  2517.         ARect.Right := SaveRect.Right - 10;
  2518.         DoDrawText(item,ACanvas, ShortCutToText(item.ShortCut), ARect, Selected, DrawStyle2);
  2519.    end;
  2520. end;
  2521. procedure TWinSkinForm.ToolBarDrawButton(Sender: TToolBar;
  2522.   Button: TToolButton; State: TCustomDrawState; var DefaultDraw: Boolean);
  2523. var i:integer;
  2524.     r1:Trect;
  2525. begin
  2526.     if (fsd.button=nil) or (skinstate<>Skin_Active) or
  2527.      (xoToolbarButton in fsd.Options) then exit;
  2528.     i:=0;
  2529.     if cdsSelected in state then i:=2
  2530.     else if cdsFocused in state then i:=4
  2531.     else if cdsHot in State  then i:=4
  2532.     else if cdsGrayed in state then i:=0
  2533.     else if cdsDisabled in state then i:=0
  2534.     else if cdsDefault in state then i:=1;
  2535.     if i=0 then exit;
  2536.     
  2537.     if (i=1) and (fsd.button.newnormal) then
  2538.        sender.canvas.Font.Color:= fsd.button.normalcolor2;
  2539.     if (i=4) and (fsd.button.newover) then
  2540.        sender.canvas.Font.Color:= fsd.button.overcolor2;
  2541.     if (i=2) and (fsd.Button.newdown) then
  2542.        sender.canvas.Font.Color:= fsd.button.downcolor2;
  2543.     r1:=Button.BoundsRect;
  2544.     InflateRect(r1,-1,-1);
  2545. //    clientRgn :=CreateRectRgn(r1.left,r1.top,r1.right,r1.bottom);
  2546. //    SelectClipRgn(sender.canvas.HANDLE, clientRgn);
  2547.     if fsd.button<>nil then
  2548.     DrawRect2(sender.canvas.handle,r1,fsd.button.map,
  2549.        fsd.button.r,i,5,fsd.button.trans);
  2550. {    if cdsSelected in state then i:=2
  2551.     else if cdsFocused in state then i:=4
  2552.     else if cdsHot in State  then i:=4
  2553.     else if cdsGrayed in state then i:=3
  2554.     else if cdsDisabled in state then i:=3
  2555.     else if cdsDefault in state then i:=5;
  2556.     r1:=Button.BoundsRect;
  2557.     if fsd.toolbar<>nil then
  2558.     DrawRect2(sender.canvas.handle,r1,fsd.toolbar.map,
  2559.        fsd.toolbar.r,i,5,fsd.toolbar.trans);}
  2560. //    DefaultDraw:=false;
  2561. end;
  2562. procedure TWinSkinForm.InitDlg(afsd:Tskindata);
  2563. begin
  2564.    InitSkin(afsd);
  2565. end;
  2566. destructor TWinSkinSpy.Destroy;
  2567. begin
  2568. //  skinaddlog('TWinSkinSpy Destory');
  2569.   inherited destroy;
  2570. end;
  2571. procedure TWinSkinSpy.Notification(AComponent: TComponent;
  2572.                                           Operation: TOperation);
  2573. var j:integer;
  2574.     sc:Tskincontrol;
  2575. begin
  2576.   inherited Notification(AComponent, Operation);
  2577.   //do nothing
  2578. //  if (Operation = opRemove) and (AComponent <> nil) and
  2579. //     (AComponent is TGraphicControl) then begin
  2580. //  end;
  2581. end;
  2582. function BitmapToRegion(bmp: TBitmap; xx,yy:integer;TransparentColor: TColor=clFuchsia;
  2583.   RedTol: Byte=1; GreenTol: Byte=1; BlueTol: Byte=1): HRGN;
  2584. const
  2585.   AllocUnit = 500;
  2586. type
  2587.   PRectArray = ^TRectArray;
  2588.   TRectArray = Array[0..(MaxInt div SizeOf(TRect))-1] of TRect;
  2589. var
  2590.   pr: PRectArray;    // used to access the rects array of RgnData by index
  2591.   h: HRGN;           // Handles to regions
  2592.   RgnData: PRgnData; // Pointer to structure RGNDATA used to create regions
  2593.   lr, lg, lb, hr, hg, hb: Byte; // values for lowest and hightest trans. colors
  2594.   x,y, x0: Integer;  // coordinates of current rect of visible pixels
  2595.   b: PByteArray;     // used to easy the task of testing the byte pixels (R,G,B)
  2596.   ScanLinePtr: Pointer; // Pointer to current ScanLine being scanned
  2597.   ScanLineInc: Integer; // Offset to next bitmap scanline (can be negative)
  2598.   maxRects: Cardinal;   // Number of rects to realloc memory by chunks of AllocUnit
  2599. begin
  2600.   Result := 0;
  2601.   { Keep on hand lowest and highest values for the "transparent" pixels }
  2602.   lr := GetRValue(TransparentColor);
  2603.   lg := GetGValue(TransparentColor);
  2604.   lb := GetBValue(TransparentColor);
  2605.   hr := Min($ff, lr + RedTol);
  2606.   hg := Min($ff, lg + GreenTol);
  2607.   hb := Min($ff, lb + BlueTol);
  2608.   { ensures that the pixel format is 32-bits per pixel }
  2609.   bmp.PixelFormat := pf32bit;
  2610.   { alloc initial region data }
  2611.   maxRects := AllocUnit;
  2612.   GetMem(RgnData,SizeOf(RGNDATAHEADER) + (SizeOf(TRect) * maxRects));
  2613.   try
  2614.     with RgnData^.rdh do
  2615.     begin
  2616.       dwSize := SizeOf(RGNDATAHEADER);
  2617.       iType := RDH_RECTANGLES;
  2618.       nCount := 0;
  2619.       nRgnSize := 0;
  2620.       SetRect(rcBound, MAXLONG, MAXLONG, 0, 0);
  2621.     end;
  2622.     { scan each bitmap row - the orientation doesn't matter (Bottom-up or not) }
  2623.     ScanLinePtr := bmp.ScanLine[0];
  2624.     ScanLineInc := Integer(bmp.ScanLine[1]) - Integer(ScanLinePtr);
  2625.     for y := 0 to bmp.Height - 1 do begin
  2626.       x := 0;
  2627.       while x < bmp.Width do begin
  2628.         x0 := x;
  2629.         while x < bmp.Width do begin
  2630.           b := @PByteArray(ScanLinePtr)[x*SizeOf(TRGBQuad)];
  2631.           // BGR-RGB: Windows 32bpp BMPs are made of BGRa quads (not RGBa)
  2632.           if (b[2] >= lr) and (b[2] <= hr) and
  2633.              (b[1] >= lg) and (b[1] <= hg) and
  2634.              (b[0] >= lb) and (b[0] <= hb) then
  2635.             Break; // pixel is transparent
  2636.           Inc(x);
  2637.         end;
  2638.         { test to see if we have a non-transparent area in the image }
  2639.         if x > x0 then begin
  2640.           { increase RgnData by AllocUnit rects if we exceeds maxRects }
  2641.           if RgnData^.rdh.nCount >= maxRects then begin
  2642.             Inc(maxRects,AllocUnit);
  2643.             ReallocMem(RgnData,SizeOf(RGNDATAHEADER) + (SizeOf(TRect) * MaxRects));
  2644.           end;
  2645.           { Add the rect (x0, y)-(x, y+1) as a new visible area in the region }
  2646.           pr := @RgnData^.Buffer; // Buffer is an array of rects
  2647.           with RgnData^.rdh do begin
  2648.             SetRect(pr[nCount], x0+xx, y+yy, x+xx, y+1+yy);
  2649.             { adjust the bound rectangle of the region if we are "out-of-bounds" }
  2650.             if x0 < rcBound.Left then rcBound.Left := x0;
  2651.             if y < rcBound.Top then rcBound.Top := y;
  2652.             if x > rcBound.Right then rcBound.Right := x;
  2653.             if y+1 > rcBound.Bottom then rcBound.Bottom := y+1;
  2654.             Inc(nCount);
  2655.           end;
  2656.         end; // if x > x0
  2657.         { Need to create the region by muliple calls to ExtCreateRegion, 'cause }
  2658.         { it will fail on Windows 98 if the number of rectangles is too large   }
  2659.         if RgnData^.rdh.nCount = 2000 then
  2660.         begin
  2661.           h := ExtCreateRegion(nil, SizeOf(RGNDATAHEADER) + (SizeOf(TRect) * maxRects), RgnData^);
  2662.           if Result > 0 then
  2663.           begin // Expand the current region
  2664.             CombineRgn(Result, Result, h, RGN_OR);
  2665.             DeleteObject(h);
  2666.           end
  2667.           else  // First region, assign it to Result
  2668.             Result := h;
  2669.           RgnData^.rdh.nCount := 0;
  2670.           SetRect(RgnData^.rdh.rcBound, MAXLONG, MAXLONG, 0, 0);
  2671.         end;
  2672.         Inc(x);
  2673.       end; // scan every sample byte of the image
  2674.       Inc(Integer(ScanLinePtr), ScanLineInc);
  2675.     end;
  2676.     { need to call ExCreateRegion one more time because we could have left    }
  2677.     { a RgnData with less than 2000 rects, so it wasn't yet created/combined  }
  2678.     h := ExtCreateRegion(nil, SizeOf(RGNDATAHEADER) + (SizeOf(TRect) * MaxRects), RgnData^);
  2679.     if Result > 0 then
  2680.     begin
  2681.       CombineRgn(Result, Result, h, RGN_OR);
  2682.       DeleteObject(h);
  2683.     end
  2684.     else
  2685.       Result := h;
  2686.   finally
  2687.     FreeMem(RgnData,SizeOf(RGNDATAHEADER) + (SizeOf(TRect) * MaxRects));
  2688.   end;
  2689. end;
  2690. procedure DrawRect2(DC:HDC;Dst:Trect;Bmp:TBitmap;Src: TRect;I,N:integer;
  2691.         Trans:integer=0;Tile:integer=0;Spliter:integer=0);
  2692. var temp:Tbitmap;
  2693. begin
  2694.     if  (dst.right<dst.left) or (dst.bottom<dst.top) then exit;
  2695.     temp:= GetHMap(Dst,Bmp,Src,I,N,tile,spliter);
  2696.     if trans=0 then
  2697.       BitBlt(dc,dst.left,dst.top,dst.right-dst.left,dst.bottom-dst.top,
  2698.                  temp.Canvas.Handle ,0 ,0 ,SrcCopy)
  2699.     else DrawTranmap(DC,Dst,temp);
  2700.     temp.free;
  2701. end;
  2702. procedure DrawRectTile(acanvas:Tcanvas;Dst:Trect;Bmp:TBitmap;Src: TRect;I,N:integer;
  2703.         Trans:integer=0;Spliter:integer=1);
  2704. var temp:Tbitmap;
  2705.   x0,y0,x,y,w,h ,w1,h1,m:integer;
  2706. begin
  2707.     if  (dst.right<dst.left) or (dst.bottom<dst.top) then exit;
  2708.     temp:=Tbitmap.create;
  2709.     w:=dst.right-dst.left;
  2710.     h:=dst.bottom-dst.top;
  2711.     temp.width:=w;
  2712.     temp.height:=h;
  2713.     if Spliter=0 then begin
  2714.        w1:=bmp.width div n;
  2715.        h1:=bmp.height;
  2716.        x0:=(i-1)*w1;
  2717.        y0:=0;
  2718.     end else begin
  2719.        w1:=bmp.width ;
  2720.        h1:=bmp.height div N;
  2721.        y0:=(i-1)*h1;
  2722.        x0:=0;
  2723.     end;
  2724.     SetStretchBltMode(temp.canvas.handle,STRETCH_DELETESCANS);
  2725.     temp.canvas.copyrect(rect(0,0,src.left,h),bmp.canvas,
  2726.                  rect(x0,y0,x0+src.left,y0+h1));
  2727.     x:=src.left;
  2728.     m:= w1-src.left-src.right;
  2729.     while x<(w-src.right) do begin
  2730.      temp.canvas.copyrect(rect(x,0,x+m,h),bmp.canvas,
  2731.                  rect(x0+src.left,y0,x0+src.left+m,y0+h1));
  2732.      inc(x,m);
  2733.     end;
  2734.     temp.canvas.copyrect(rect(w-src.right,0,w,h),bmp.canvas,
  2735.                  rect(x0+w1-src.right,y0,x0+w1,y0+h1));
  2736.     if trans=0 then
  2737.       BitBlt(acanvas.handle,dst.left,dst.top,dst.right-dst.left,dst.bottom-dst.top,
  2738.                  temp.Canvas.Handle ,0 ,0 ,SrcCopy)
  2739.     else begin
  2740. //      DrawTranmap(DC,Dst,temp);
  2741.         temp.transparent:=true;
  2742.         temp.transparentcolor:=clFuchsia;
  2743.         acanvas.draw(dst.left,dst.top,temp)
  2744.     end;
  2745.     temp.free;
  2746. end;
  2747. function GetHMap(Dst:Trect;Bmp:TBitmap;Src:TRect;I,N:integer;
  2748.          Tile:integer=0;Spliter:integer=0):Tbitmap;
  2749. var r1,r2:Trect;
  2750.     x,y,w,h,w2,h2:integer;
  2751.     color,c1,c2 :Tcolor;
  2752.     temp: Tbitmap;
  2753.     b1,b2:boolean;
  2754. begin
  2755.     if Spliter=0 then begin
  2756.        w:=bmp.width div n;
  2757.        h:=bmp.height;
  2758.        x:=(i-1)*w;
  2759.        y:=0;
  2760.     end else begin
  2761.        w:=bmp.width ;
  2762.        h:=bmp.height div N;
  2763.        y:=(i-1)*h;
  2764.        x:=0;
  2765.     end;
  2766.     temp:=Tbitmap.create;
  2767.     w2:=dst.right-dst.left;
  2768.     h2:=dst.bottom-dst.top;
  2769.     temp.width:=w2;
  2770.     temp.height:=h2;
  2771.     b1:= w2<(src.left+src.right);
  2772.     b2:= h2<(src.top+src.bottom);
  2773.     if b1 then begin
  2774.        src.left:=0; src.right:=0;
  2775.     end;
  2776.     if b2 then begin
  2777.        src.top:=0; src.bottom:=0;
  2778.     end;
  2779.     //left-top-corner
  2780.     SetStretchBltMode(temp.canvas.handle,STRETCH_DELETESCANS);
  2781.     if  (src.left*src.top>0) then begin
  2782.        r1:=rect(0,0,src.left,src.top);
  2783.        r2:=rect(x,y,x+src.left,y+src.top);
  2784.        temp.canvas.copyrect(r1,bmp.canvas,r2);
  2785.     end;
  2786.     //left-bottom-corner
  2787.     if (src.left*src.bottom>0) then begin
  2788.       r1:=rect(0,h2-src.bottom,src.left,h2);
  2789.       r2:=rect(x,y+h-src.bottom,x+src.left,y+h);
  2790.       temp.canvas.copyrect(r1,bmp.canvas,r2);
  2791.     end;
  2792.     //right-top-corner
  2793.     if src.right*src.top>0 then begin
  2794.       r1:=rect(w2-src.right,0,w2,src.top);
  2795.       r2:=rect(x+w-src.right,y,x+w,src.top+y);
  2796.       temp.canvas.copyrect(r1,bmp.canvas,r2);
  2797.     end;
  2798.     //left
  2799.     if src.left>0 then begin
  2800.       r1:=rect(0,src.top,src.left,h2-src.bottom);
  2801.       r2:=rect(x,y+src.top,x+src.left,y+h-src.bottom);
  2802.       temp.canvas.copyrect(r1,bmp.canvas,r2);
  2803.     end;
  2804.     //top
  2805.     if src.top>0 then begin
  2806.        r1:=rect(src.left,0,w2-src.right,src.top);
  2807.        r2:=rect(x+src.left,y,x+w-src.right,y+src.top);
  2808.        temp.canvas.copyrect(r1,bmp.canvas,r2);
  2809.     end;
  2810.     //center
  2811.     r1:=rect(src.left,src.top,w2-src.right,h2-src.bottom);
  2812.     r2:=rect(x+src.left,y+src.top,x+w-src.right,y+h-src.bottom);
  2813. //    temp.canvas.copyrect(r1,bmp.canvas,r2);
  2814.     if tile=0 then begin
  2815. //       temp.canvas.copyrect(r1,bmp.canvas,r2)
  2816.        StretchBlt(temp.canvas.handle,r1.left,r1.top,r1.right-r1.left,r1.bottom-r1.top,
  2817.          bmp.canvas.handle,r2.left,r2.top,r2.right-r2.left,r2.bottom-r2.top,SRCCOPY);
  2818.      end else
  2819.        DrawBGbmp(temp.canvas,r1,bmp,r2);
  2820.     //right-bottom-corner
  2821.     if src.right*src.bottom>0 then begin
  2822.       r1:=rect(w2-src.right,h2-src.bottom,w2,h2);
  2823.       r2:=rect(x+w-src.right,y+h-src.bottom,x+w,y+h);
  2824.       temp.canvas.copyrect(r1,bmp.canvas,r2);
  2825.     end;
  2826.     //right
  2827.     if src.right>0 then begin
  2828.        r1:=rect(w2-src.right,src.top,w2,h2-src.bottom);
  2829.        r2:=rect(x+w-src.right,y+src.top,x+w,y+h-src.bottom);
  2830.        temp.canvas.copyrect(r1,bmp.canvas,r2);
  2831.     end;
  2832.     //bottom
  2833.     if src.bottom>0 then begin
  2834.        r1:=rect(src.left,h2-src.bottom,w2-src.right,h2);
  2835.        r2:=rect(x+src.left,y+h-src.bottom,x+w-src.right,y+h);
  2836.        temp.canvas.copyrect(r1,bmp.canvas,r2);
  2837.     end;
  2838.     result:=temp;
  2839. end;
  2840. procedure DrawBorder(Dc:HDC;Dst:Trect;Bmp:TBitmap;Src:TRect;I,N:integer;
  2841.          Tile:integer=0;Spliter:integer=0);
  2842. var r1,r2:Trect;
  2843.     x,y,w,h,w2,h2:integer;
  2844.     b1,b2:boolean;
  2845. begin
  2846.     if Spliter=0 then begin
  2847.        w:=bmp.width div n;
  2848.        h:=bmp.height;
  2849.        x:=(i-1)*w;
  2850.        y:=0;
  2851.     end else begin
  2852.        w:=bmp.width ;
  2853.        h:=bmp.height div N;
  2854.        y:=(i-1)*h;
  2855.        x:=0;
  2856.     end;
  2857.     w2:=dst.right-dst.left;
  2858.     h2:=dst.bottom-dst.top;
  2859.     b1:= w2<(src.left+src.right);
  2860.     b2:= h2<(src.top+src.bottom);
  2861.     if b1 then begin
  2862.        src.left:=0; src.right:=0;
  2863.     end;
  2864.     if b2 then begin
  2865.        src.top:=0; src.bottom:=0;
  2866.     end;
  2867.     //left-top-corner
  2868.     SetStretchBltMode(dc,STRETCH_DELETESCANS);
  2869.     if  (src.left*src.top>0) then begin
  2870.        r1:=rect(0,0,src.left,src.top);
  2871.        offsetrect(r1,dst.left,dst.top);
  2872.        r2:=rect(x,y,x+src.left,y+src.top);
  2873.        StretchBlt(dc,r1.left,r1.top,r1.right-r1.left,r1.bottom-r1.top,
  2874.          bmp.Canvas.Handle ,r2.left,r2.top,r2.right-r2.left,r2.bottom-r2.top,SrcCopy);
  2875.     end;
  2876.     //left-bottom-corner
  2877.     if (src.left*src.bottom>0) then begin
  2878.       r1:=rect(0,h2-src.bottom,src.left,h2);
  2879.       OffsetRect(r1,dst.left,dst.top);
  2880.       r2:=rect(x,y+h-src.bottom,x+src.left,y+h);
  2881.       StretchBlt(dc,r1.left,r1.top,r1.right-r1.left,r1.bottom-r1.top,
  2882.          bmp.Canvas.Handle ,r2.left,r2.top,r2.right-r2.left,r2.bottom-r2.top,SrcCopy);
  2883.     end;
  2884.     //right-top-corner
  2885.     if src.right*src.top>0 then begin
  2886.       r1:=rect(w2-src.right,0,w2,src.top);
  2887.       OffsetRect(r1,dst.left,dst.top);
  2888.       r2:=rect(x+w-src.right,y,x+w,src.top+y);
  2889.       StretchBlt(dc,r1.left,r1.top,r1.right-r1.left,r1.bottom-r1.top,
  2890.          bmp.Canvas.Handle ,r2.left,r2.top,r2.right-r2.left,r2.bottom-r2.top,SrcCopy);
  2891.     end;
  2892.     //left
  2893.     if src.left>0 then begin
  2894.       r1:=rect(0,src.top,src.left,h2-src.bottom);
  2895.       OffsetRect(r1,dst.left,dst.top);
  2896.       r2:=rect(x,y+src.top,x+src.left,y+h-src.bottom);
  2897.       StretchBlt(dc,r1.left,r1.top,r1.right-r1.left,r1.bottom-r1.top,
  2898.          bmp.Canvas.Handle ,r2.left,r2.top,r2.right-r2.left,r2.bottom-r2.top,SrcCopy);
  2899.     end;
  2900.     //top
  2901.     if src.top>0 then begin
  2902.        r1:=rect(src.left,0,w2-src.right,src.top);
  2903.        OffsetRect(r1,dst.left,dst.top);
  2904.        r2:=rect(x+src.left,y,x+w-src.right,y+src.top);
  2905.        StretchBlt(dc,r1.left,r1.top,r1.right-r1.left,r1.bottom-r1.top,
  2906.          bmp.Canvas.Handle ,r2.left,r2.top,r2.right-r2.left,r2.bottom-r2.top,SrcCopy);
  2907.     end;
  2908.     //right-bottom-corner
  2909.     if src.right*src.bottom>0 then begin
  2910.       r1:=rect(w2-src.right,h2-src.bottom,w2,h2);
  2911.       OffsetRect(r1,dst.left,dst.top);
  2912.       r2:=rect(x+w-src.right,y+h-src.bottom,x+w,y+h);
  2913.       StretchBlt(dc,r1.left,r1.top,r1.right-r1.left,r1.bottom-r1.top,
  2914.          bmp.Canvas.Handle ,r2.left,r2.top,r2.right-r2.left,r2.bottom-r2.top,SrcCopy);
  2915.     end;
  2916.     //right
  2917.     if src.right>0 then begin
  2918.        r1:=rect(w2-src.right,src.top,w2,h2-src.bottom);
  2919.        OffsetRect(r1,dst.left,dst.top);
  2920.        r2:=rect(x+w-src.right,y+src.top,x+w,y+h-src.bottom);
  2921.        StretchBlt(dc,r1.left,r1.top,r1.right-r1.left,r1.bottom-r1.top,
  2922.          bmp.Canvas.Handle ,r2.left,r2.top,r2.right-r2.left,r2.bottom-r2.top,SrcCopy);
  2923.     end;
  2924.     //bottom
  2925.     if src.bottom>0 then begin
  2926.        r1:=rect(src.left,h2-src.bottom,w2-src.right,h2);
  2927.        OffsetRect(r1,dst.left,dst.top);
  2928.        r2:=rect(x+src.left,y+h-src.bottom,x+w-src.right,y+h);
  2929.        StretchBlt(dc,r1.left,r1.top,r1.right-r1.left,r1.bottom-r1.top,
  2930.          bmp.Canvas.Handle ,r2.left,r2.top,r2.right-r2.left,r2.bottom-r2.top,SrcCopy);
  2931.     end;
  2932. end;
  2933. function GetThumbMap(Dst:Trect;Bmp:TBitmap;Src:TRect;I,N:integer;
  2934.          Tile:integer=0;Spliter:integer=0):Tbitmap;
  2935. var r1,r2:Trect;
  2936.     x,y,w,h,w2,h2:integer;
  2937.     color,c1,c2 :Tcolor;
  2938.     temp: Tbitmap;
  2939.     b1,b2:boolean;
  2940. begin
  2941.     w:=bmp.width div n;
  2942.     h:=bmp.height;
  2943.     x:=(i-1)*w;
  2944.     y:=0;
  2945.     temp:=Tbitmap.create;
  2946.     w2:=dst.right-dst.left;
  2947.     h2:=dst.bottom-dst.top;
  2948.     temp.width:=w2;
  2949.     temp.height:=h2;
  2950.     SetStretchBltMode(temp.canvas.handle,STRETCH_DELETESCANS);
  2951. {    b1:= w2<(src.left+src.right);
  2952.     b2:= h2<(src.top+src.bottom);
  2953.     if b1 then begin
  2954.        src.left:=0; src.right:=0;
  2955.     end;
  2956.     if b2 then begin
  2957.        src.top:=0; src.bottom:=0;
  2958.     end;}
  2959.     if Spliter=0 then begin//vscrollbar
  2960.     //top
  2961.     if src.top>0 then begin
  2962.        r1:=rect(0,0,w2,src.top);
  2963.        r2:=rect(x,y,x+w,y+src.top);
  2964.        temp.canvas.copyrect(r1,bmp.canvas,r2);
  2965.     end;
  2966.     //Center
  2967.     r1:=rect(0,src.top,w2,h2-src.bottom);
  2968.     r2:=rect(x,y+src.top,x+w,y+h-src.bottom);
  2969.     temp.canvas.copyrect(r1,bmp.canvas,r2);
  2970.     //bottom
  2971.     if src.bottom>0 then begin
  2972.        r1:=rect(0,h2-src.bottom,w2,h2);
  2973.        r2:=rect(x,y+h-src.bottom,x+w,y+h);
  2974.        temp.canvas.copyrect(r1,bmp.canvas,r2);
  2975.     end;
  2976.     end;
  2977.     result:=temp;
  2978. end;
  2979. {function SBCustomDraw(SB:Tskinscrollbar;PDraw:pNMCSBCUSTOMDRAW):integer;
  2980. var  rc,r1:Trect;
  2981.      OldBrush,Brush: HBrush;
  2982.      i:integer;
  2983.    procedure DrawArrow(bmp:Tbitmap;j,N:integer);
  2984.    var temp:Tbitmap;
  2985.     w,h,x:integer;
  2986.    begin
  2987.     w:=bmp.width div n;
  2988.     h:=bmp.height;
  2989.     x:=(j-1)*w;
  2990.     r1:= rect(x,0,x+w,h);
  2991.     StretchBlt(pDraw^.hdc,rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top,
  2992. bmp.canvas.handle, r1.left, r1.top, w,h, SRCCOPY);
  2993.   end;
  2994.   procedure DrawBar(bmp:Tbitmap;rt:Trect;j,N:integer);
  2995.    var temp:Tbitmap;
  2996.     w,h,x:integer;
  2997.   begin
  2998.     w:=bmp.width div n;
  2999.     h:=bmp.height;
  3000.     x:=(j-1)*w;
  3001.     if(pDraw^.nBar = SB_HORZ) then begin
  3002.        if (rc.right-rc.left)<(rt.left+rt.right+2) then  begin
  3003.           r1:= rect(x,0,x+w,h);
  3004.           StretchBlt(pDraw^.hdc,rc.left,rc.top,rc.right-rc.left, rc.bottom-rc.top,
  3005.   bmp.canvas.handle, r1.left, r1.top, w,h, SRCCOPY);
  3006.        end else begin
  3007.           StretchBlt(pDraw^.hdc,rc.left,rc.top,rt.left, rc.bottom-rc.top,
  3008.   bmp.canvas.handle, x, 0,rt.left,h, SRCCOPY);
  3009.           StretchBlt(pDraw^.hdc,rc.left+rt.left,rc.top,rc.right-rc.left-rt.right-rt.left, rc.bottom-rc.top,
  3010.   bmp.canvas.handle, x+rt.left, 0,w-rt.left-rt.right,h, SRCCOPY);
  3011.           StretchBlt(pDraw^.hdc,rc.right-rt.right,rc.top,rt.right, rc.bottom-rc.top,
  3012.   bmp.canvas.handle, w+x-rt.right, 0,rt.right,h, SRCCOPY);
  3013.        end;
  3014.     end else begin
  3015.        if (rc.bottom-rc.top)<(rt.top+rt.bottom+2) then  begin
  3016.           r1:= rect(x,0,x+w,h);
  3017.           StretchBlt(pDraw^.hdc,rc.left,rc.top,rc.right-rc.left, rc.bottom-rc.top,
  3018.   bmp.canvas.handle, r1.left, r1.top, w,h, SRCCOPY);
  3019.        end else begin
  3020.           StretchBlt(pDraw^.hdc,rc.left,rc.top,rc.right-rc.left, rt.top,
  3021.   bmp.canvas.handle, x, 0,w,rt.top, SRCCOPY);
  3022.           StretchBlt(pDraw^.hdc,rc.left,rc.top+rt.top,rc.right-rc.left, rc.bottom-rc.top-rt.top-rt.bottom,
  3023.   bmp.canvas.handle, x, rt.top,w,h-rt.top-rt.bottom, SRCCOPY);
  3024.           StretchBlt(pDraw^.hdc,rc.left,rc.bottom-rt.bottom,rc.right-rc.left, rt.bottom,
  3025.   bmp.canvas.handle, x, h-rt.bottom,w,rt.bottom, SRCCOPY);
  3026.        end;
  3027.     end;
  3028.   end;
  3029. begin
  3030.     if(pDraw^.dwDrawStage = CDDS_PREPAINT) then begin
  3031.       result := CDRF_SKIPDEFAULT;
  3032.       exit;
  3033.     end;
  3034.     //the sizing gripper in the bottom-right corner
  3035.     if(pDraw^.nBar = SB_BOTH) then begin
  3036.         Brush := CreateSolidBrush(sb.fsd.colors[csButtonFace]);
  3037.         fillrect(pdraw^.hdc,pDraw^.rc,brush);
  3038.         DeleteObject(Brush);
  3039.         result:= CDRF_SKIPDEFAULT;
  3040.     end else if(pDraw^.nBar = SB_HORZ) then begin
  3041. if(pDraw^.uState=CDIS_HOT) then  i:=2
  3042. else if(pDraw^.uState=CDIS_SELECTED) then i:=1
  3043. else i:=0;
  3044.         rc:=pDraw^.rc;
  3045.         rc.Bottom:=rc.top+16;
  3046.         case pdraw^.uItem of
  3047.           SB_LINELEFT:begin
  3048.                 inc(i,1);
  3049.                 Drawarrow(sb.fsd.SArrow.map,i,23);
  3050.              end;
  3051.           SB_LINERIGHT:begin
  3052.                 inc(i,5);
  3053.                 Drawarrow(sb.fsd.SArrow.map,i,23);
  3054.              end;
  3055.           SB_PAGELEFT: begin
  3056. //               DrawRect2(pDraw^.hdc,pDraw^.rc,sb.fsd.HBar.map,
  3057. //                   sb.fsd.HBar.r,1,4,sb.fsd.Hbar.trans,sb.fsd.Hbar.tile);
  3058. //               DrawBar(sb.fsd.HBar.map,sb.fsd.HBar.r,1,4);
  3059. //               skinaddlog(format('PAGELEFT %1d %1d',[rc.right,rc.left]));
  3060.              end;
  3061.           SB_PAGERIGHT:begin
  3062.                DrawBar(sb.fsd.HBar.map,sb.fsd.HBar.r,1,4);
  3063. //               DrawRect2(pDraw^.hdc,pDraw^.rc,sb.fsd.HBar.map,
  3064. //                   sb.fsd.HBar.r,1,4,sb.fsd.Hbar.trans,sb.fsd.Hbar.tile);
  3065. //               skinaddlog(format('PAGERight %1d %1d',[rc.right,rc.left]));
  3066.              end;
  3067.           SB_THUMBTRACK:begin
  3068.                rc.Bottom:=rc.top+16;
  3069.                inc(i,1);
  3070.                DrawRect2(pDraw^.hdc,rc,sb.fsd.hSlider.map,
  3071.                    sb.fsd.hslider.r,i,sb.fsd.hslider.frame,sb.fsd.hslider.trans);
  3072. //               DrawBar(sb.fsd.hslider.map,sb.fsd.hslider.r,i,sb.fsd.hslider.frame);
  3073.              end;
  3074.         end;
  3075. result:=CDRF_SKIPDEFAULT;
  3076.     end else if(pDraw^.nBar=SB_VERT) then begin
  3077. if(pDraw^.uState=CDIS_HOT) then  i:=2
  3078. else if(pDraw^.uState=CDIS_SELECTED) then i:=1
  3079. else i:=0;
  3080.         rc:=pDraw^.rc;
  3081.         rc.right:=rc.left+16;
  3082.         case pdraw^.uItem of
  3083.           SB_LINEUP:begin
  3084.                 inc(i,9);
  3085.                 Drawarrow(sb.fsd.SArrow.map,i,23);
  3086.             end;
  3087.           SB_LINEDOWN:begin
  3088.                 inc(i,13);
  3089.                 Drawarrow(sb.fsd.SArrow.map,i,23);
  3090.             end;
  3091.           SB_PAGEUP:begin
  3092. //               DrawRect2(pDraw^.hdc,pDraw^.rc,sb.fsd.VBar.map,
  3093. //                   sb.fsd.VBar.r,1,4,sb.fsd.Vbar.trans,sb.fsd.Vbar.tile);
  3094. //               DrawBar(sb.fsd.VBar.map,sb.fsd.VBar.r,1,4);
  3095.              end;
  3096.           SB_PAGEDOWN:begin
  3097.                DrawBar(sb.fsd.VBar.map,sb.fsd.VBar.r,1,4);
  3098.              end;
  3099.           SB_THUMBTRACK:begin
  3100.                inc(i,1);
  3101.                rc.right:=rc.left+16;
  3102.                DrawRect2(pDraw^.hdc,rc,sb.fsd.VSlider.map,
  3103.                    sb.fsd.Vslider.r,i,sb.fsd.vslider.frame,sb.fsd.vslider.trans);
  3104. //               DrawBar(sb.fsd.vslider.map,sb.fsd.vslider.r,i,sb.fsd.vslider.frame);
  3105.              end;
  3106.         end;
  3107. result:= CDRF_SKIPDEFAULT;
  3108.     end else begin
  3109. result:= CDRF_DODEFAULT;
  3110.     end;
  3111. end;}
  3112. function Max(const A, B: Integer): Integer;
  3113. begin
  3114.   if A > B then
  3115.     Result := A
  3116.   else
  3117.     Result := B;
  3118. end;
  3119. function Min(const A, B: Integer): Integer;
  3120. begin
  3121.   if A < B then
  3122.     Result := A
  3123.   else
  3124.     Result := B;
  3125. end;
  3126. procedure Bitmapdraw(DC:HDC;Dst:Trect;Bmp:TBitmap);
  3127. var OldPalette: HPalette;
  3128.   RestorePalette: Boolean;
  3129. begin
  3130.     OldPalette := 0;
  3131.     RestorePalette := False;
  3132.     TACBitmap(bmp).PaletteNeeded;
  3133.     if bmp.Palette <> 0 then
  3134.     begin
  3135.       OldPalette := SelectPalette(dc, bmp.Palette, True);
  3136.       RealizePalette(dc);
  3137.       RestorePalette := True;
  3138.     end;
  3139.     BitBlt(dc,dst.left,dst.top,dst.right-dst.left,dst.bottom-dst.top,
  3140.                  bmp.Canvas.Handle ,0 ,0 ,SrcCopy);
  3141.     if RestorePalette then
  3142.         SelectPalette(Dc, OldPalette, True);
  3143. end;
  3144. procedure DrawRect1(DC:HDC;Dst:Trect;Bmp:TBitmap;I,N:integer;Trans:integer=0);
  3145. var r1,r2:Trect;
  3146.     x,w,h,w1:integer;
  3147.     color,c1,c2 :Tcolor;
  3148.     temp : Tbitmap;
  3149. begin
  3150.     if  (dst.right<dst.left) or (dst.bottom<dst.top) then exit;
  3151.     temp:=Tbitmap.create;
  3152.     w:=dst.right-dst.left;
  3153.     h:=dst.bottom-dst.top;
  3154.     temp.width:=w;
  3155.     temp.height:=h;
  3156.     w1:=bmp.width div n;
  3157.     x:=(i-1)*w1;
  3158.     temp.canvas.copyrect(rect(0,0,w,h),bmp.canvas,rect(x,0,x+w1,bmp.height));
  3159.     if trans=0 then
  3160.       BitBlt(dc,dst.left,dst.top,dst.right-dst.left,dst.bottom-dst.top,
  3161.                  temp.Canvas.Handle ,0 ,0 ,SrcCopy)
  3162.     else DrawTranmap(DC,dst,temp);
  3163.     temp.free;
  3164. end;
  3165. procedure DrawRect3(DC:HDC;Dst:Trect;Bmp:TBitmap;I,N:integer;Trans:integer=0);
  3166. var r1,r2:Trect;
  3167.     x,y,w,h,w1:integer;
  3168.     color,c1,c2 :Tcolor;
  3169.     temp : Tbitmap;
  3170. begin
  3171.     if  (dst.right<dst.left) or (dst.bottom<dst.top) then exit;
  3172.     temp:=Tbitmap.create;
  3173.     w := bmp.width div n;
  3174.     h := bmp.Height;
  3175.     temp.width:=w;
  3176.     temp.height:=h;
  3177.     x:=(i-1)*w;
  3178.     BitBlt(temp.Canvas.handle,0,0,w,h,
  3179.                  bmp.Canvas.Handle ,x,0 ,SrcCopy);
  3180.     x:= dst.Left+(dst.right-dst.Left-w) div 2;
  3181.     y:= dst.top+(dst.bottom-dst.top-h) div 2;
  3182.     if trans=0 then
  3183.       BitBlt(dc,x,y,w,h,
  3184.                  temp.Canvas.Handle ,0 ,0 ,SrcCopy)
  3185.     else DrawTranmap(DC,rect(x,y,x+w,y+h),temp);
  3186.     temp.free;
  3187. end;
  3188. procedure DrawRectH(DC:HDC;Dst:Trect;Bmp:TBitmap;Src:TRect;I,N:integer;
  3189.          Tile:integer=0;Spliter:integer=0);
  3190. var x,y,w,h,x1,y1:integer;
  3191. begin
  3192.     if Spliter=0 then begin
  3193.        w:=bmp.width div n;
  3194.        h:=bmp.height;
  3195.        x:=(i-1)*w;
  3196.        y:=0;
  3197.     end else begin
  3198.        w:=bmp.width ;
  3199.        h:=bmp.height div N;
  3200.        y:=(i-1)*h;
  3201.        x:=0;
  3202.     end;
  3203. //    if (dst.Bottom-dst.Top)>h then
  3204. //      dst.Top:=dst.Top+(dst.Bottom-dst.Top-h) div 2;
  3205.     if (dst.Right-dst.Left)<w then begin
  3206.         StretchBlt(dc,dst.left,dst.top,dst.right-dst.left,dst.Bottom-dst.Top,
  3207.             bmp.canvas.handle,x,y,x+w,y+h,SRCCOPY);
  3208.     end else begin
  3209.     StretchBlt(dc,dst.Left,dst.Top,src.Left,dst.Bottom-dst.Top,
  3210.          bmp.canvas.handle,x,y,src.Left,h,SRCCOPY);
  3211.     StretchBlt(dc,dst.Left+src.Left,dst.Top,dst.Right-dst.Left-src.Left-src.Right,dst.Bottom-dst.Top,
  3212.          bmp.canvas.handle,x+src.Left,y,w-src.Left-src.Right,h,SRCCOPY);
  3213.     StretchBlt(dc,dst.Right-src.Right,dst.Top,src.Right,dst.Bottom-dst.Top,
  3214.          bmp.canvas.handle,x+w-src.Right,y,src.Right,h,SRCCOPY);
  3215.     end;
  3216. end;
  3217. procedure DrawRectV(DC:HDC;Dst:Trect;Bmp:TBitmap;Src:TRect;I,N:integer;
  3218.          Tile:integer=0;Spliter:integer=0);
  3219. var x,y,w,h:integer;
  3220. begin
  3221.     if Spliter=0 then begin
  3222.        w:=bmp.width div n;
  3223.        h:=bmp.height;
  3224.        x:=(i-1)*w;
  3225.        y:=0;
  3226.     end else begin
  3227.        w:=bmp.width ;
  3228.        h:=bmp.height div N;
  3229.        y:=(i-1)*h;
  3230.        x:=0;
  3231.     end;
  3232. //    if (dst.Right-dst.left)>w then
  3233. //      dst.Left:=dst.Left+(dst.Right-dst.Left-w) div 2;
  3234.     if (dst.Bottom-dst.Top)<h then begin
  3235.         StretchBlt(dc,dst.left,dst.top,dst.Right-dst.Left,dst.Bottom-dst.Top,
  3236.             bmp.canvas.handle,x,y,x+w,y+h,SRCCOPY);
  3237.     end else begin
  3238.     StretchBlt(dc,dst.Left,dst.Top,dst.Right-dst.Left,src.Top,
  3239.          bmp.canvas.handle,x,y,w,src.Top,SRCCOPY);
  3240.     StretchBlt(dc,dst.Left,dst.Top+src.Top,dst.Right-dst.Left,dst.Bottom-dst.Top-src.Top-src.Bottom,
  3241.          bmp.canvas.handle,x,y+src.Top,w,h-src.Top-src.Bottom,SRCCOPY);
  3242.     StretchBlt(dc,dst.Left,dst.Bottom-src.Bottom,dst.Right-dst.Left,src.Bottom,
  3243.          bmp.canvas.handle,x,y+h-src.Bottom,w,src.Bottom,SRCCOPY);
  3244.     end;
  3245. end;
  3246. procedure DrawParentImage( Control: TControl; DC: HDC; InvalidateParent: Boolean = False );
  3247. var
  3248.   SaveIndex: Integer;
  3249.   P: TPoint;
  3250.   r:Trect;
  3251. begin
  3252.   if Control.Parent = nil then
  3253.     Exit;
  3254.   r:=control.ClientRect;
  3255.   SaveIndex := SaveDC( DC );
  3256.   GetViewportOrgEx( DC, P );
  3257.   SetViewportOrgEx( DC, P.X - Control.Left, P.Y - Control.Top, nil );
  3258.   offsetrect(r,control.Left,control.Top);
  3259.   IntersectClipRect( DC, r.Left, r.Top, r.Right,r.Bottom);
  3260. //  IntersectClipRect( DC, 0, 0, Control.Parent.ClientWidth, Control.Parent.ClientHeight );
  3261.   if not ( csDesigning in Control.ComponentState ) then
  3262.   begin
  3263.     Control.Parent.Perform( wm_EraseBkgnd, DC, 0 );
  3264.     Control.Parent.Perform( wm_Paint, DC, 0 );
  3265.   end  else  begin
  3266.     try
  3267.       Control.Parent.Perform( wm_EraseBkgnd, DC, 0 );
  3268.       Control.Parent.Perform( wm_Paint, DC, 0 );
  3269.     except
  3270.     end;
  3271.   end;
  3272.   RestoreDC( DC, SaveIndex );
  3273. {  if InvalidateParent then  begin
  3274.     if not ( Control.Parent is TCustomControl ) and
  3275.        not ( Control.Parent is TCustomForm ) and
  3276.        not ( csDesigning in Control.ComponentState ) then
  3277.     begin
  3278.       Control.Parent.Invalidate;
  3279.     end;
  3280.   end; }
  3281. end;
  3282. {procedure DrawTranmap(DC:HDC;Dst:Trect;temp:TBitmap;transcolor:Tcolor=clFuchsia);
  3283. var color,c1,c2 :Tcolor;
  3284.     mask : Tbitmap;
  3285.     w,h:integer;
  3286. begin
  3287.     if  (dst.right<dst.left) or (dst.bottom<dst.top) then exit;
  3288.     c1:=SetBkColor(dc,clwhite);
  3289.     c2:=SetTextColor(dc,clblack);
  3290.     mask:=Tbitmap.create;
  3291.     mask.assign(temp);
  3292.     mask.mask(transcolor);
  3293. //    mask.mask(temp.Canvas.Pixels[0, 0]);
  3294.     w:=dst.right-dst.left;
  3295.     h:=dst.bottom-dst.top;
  3296.     BitBlt(dc,dst.left ,dst.top,w,h,
  3297.                  temp.Canvas.Handle ,0 ,0 ,SrcInvert);
  3298.     BitBlt(dc,dst.left ,dst.top,w,h,
  3299.                  mask.Canvas.Handle ,0 ,0 ,SrcAnd);
  3300.     BitBlt(dc,dst.left ,dst.top,w,h,
  3301.                  temp.Canvas.Handle ,0 ,0 ,SrcInvert);
  3302.     SetBkColor(dc,c1);
  3303.     SetTextColor(dc,c2);
  3304.     mask.free;
  3305. end;}
  3306. procedure DrawTranmap(DC:HDC;Dst:Trect;temp:TBitmap;transcolor:Tcolor=clFuchsia);
  3307. var color,c1,c2 :Tcolor;
  3308.     mask : Tbitmap;
  3309.     w,h:integer;
  3310. begin
  3311.   if  (dst.right<dst.left) or (dst.bottom<dst.top) then exit;
  3312.   mask:=Tbitmap.create;
  3313.   mask.assign(temp);
  3314.   mask.mask(transcolor);
  3315.   try
  3316.      if (Win32Platform = VER_PLATFORM_WIN32_NT) then  begin
  3317.         MaskBlt(DC, Dst.left, Dst.top, Dst.Right-dst.left, Dst.Bottom-dst.top,
  3318.              temp.Canvas.handle,0,0,mask.handle,0,0, MakeRop4($00AA0029, SrcCopy));
  3319.      end else begin
  3320.        c1:=SetBkColor(dc,clwhite);
  3321.        c2:=SetTextColor(dc,clblack);
  3322.        w:=dst.right-dst.left;
  3323.        h:=dst.bottom-dst.top;
  3324.        BitBlt(dc,dst.left ,dst.top,w,h,
  3325.                  temp.Canvas.Handle ,0 ,0 ,SrcInvert);
  3326.        BitBlt(dc,dst.left ,dst.top,w,h,
  3327.                  mask.Canvas.Handle ,0 ,0 ,SrcAnd);
  3328.        BitBlt(dc,dst.left ,dst.top,w,h,
  3329.                  temp.Canvas.Handle ,0 ,0 ,SrcInvert);
  3330.        SetBkColor(dc,c1);
  3331.        SetTextColor(dc,c2);
  3332.      end;
  3333.   finally
  3334.       mask.Free;
  3335.   end;
  3336. end;
  3337. procedure SkinAddLog(msg:string);
  3338. begin
  3339.   {$IFDEF test}
  3340.     if msg='' then exit;
  3341.     if logstring<>nil then Logstring.add(msg);
  3342.   {$ENDIF}
  3343. end;
  3344. {procedure  SetProperty(control: TObject;aprop,value:string);
  3345. var PropInfo:PPropInfo;
  3346. begin
  3347.    if  control<>nil then begin
  3348.       PropInfo:=GetPropInfo(control,aprop);
  3349.       if PropInfo<>nil then  begin
  3350.          if propinfo^.PropType^.Kind= tkEnumeration then
  3351.           SetEnumProp(control,PropInfo,value);
  3352.       end;
  3353.    end;
  3354. end;}
  3355. initialization
  3356.   bg:=Tbitmap.create;
  3357.   SetStretchBltMode(bg.canvas.handle,STRETCH_DELETESCANS);
  3358.   Logstring :=Tstringlist.create;
  3359. finalization
  3360.   {$IFDEF test}
  3361.     logstring.savetofile(ExtractFilePath(ParamStr(0))+
  3362.         ExtractFileName(ParamStr(0))+'.txt');
  3363.   {$ENDIF}
  3364.   Logstring.free;
  3365.   bg.free;
  3366.   bg:=nil;
  3367. end.