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

📄 winskindlg.pas

📁 超级报表系统软件VclSkin.v2.60.4.29.完整源代码版.rar
💻 PAS
📖 第 1 页 / 共 2 页
字号:
   if atform<>nil then begin
      aform:=Twinskinform.create(atform);
      aform.hwnd:=ahwnd;
      aform.InitTform(adata,atform)
   end else begin
      aform:=Twinskinform.create(nil);
      aform.hwnd:=ahwnd;
      aform.initskin(adata);
   end;

   flist.add(aform);
   postMessage(ahwnd, CN_NewForm, 0, 1000);
   result:=true;
end;

function TSkinManage.DeleteForm(aHwnd:THandle):boolean;
var i: integer;
    sf :TWinSkinform;
begin
   result:=false;
   for i:=0 to flist.count-1 do begin
      sf:=TWinSkinform(flist[i]);
      if sf.hwnd=ahwnd then begin
         if sf.FForm = nil then exit;
         sf.Skinstate:=skin_Destory;
         sf.unsubclass;
         flist.delete(i);
         sf.free;
         sf:=nil;
         result:=true;
         break;
      end;
   end;
end;

procedure TSkinManage.DeleteForm2(aHwnd:THandle);
var i: integer;
    sf :TWinSkinform;
begin
   for i:=0 to flist.count-1 do begin
      sf:=TWinSkinform(flist[i]);
      if sf.hwnd=ahwnd then begin
         flist.delete(i);
         break;
      end;
   end;
end;

procedure TSkinManage.DeleteDeleted;
var i: integer;
    sf :TWinSkinform;
begin
   for i:=flist.count-1 downto 0 do begin
      sf:=TWinSkinform(flist[i]);
      if sf.skinstate=skin_Deleted then begin
         flist.delete(i);
         sf.free;
      end;
   end;
end;

procedure TSkinManage.DeleteAllForms;
var i: integer;
    sf :TWinSkinform;
begin
   for i:=flist.count-1  downto 0 do begin
      sf:=TWinSkinform(flist[i]);
      sf.Skinstate:=skin_Destory;
      sf.unsubclass3;
      flist.delete(i);
      sf.free;
   end;
   flist.free;
end;

procedure TSkinManage.DeleteForm3;
var i: integer;
    sf :TWinSkinform;
begin
   for i:=flist.count-1 downto 0 do begin
      sf:=TWinSkinform(flist[i]);
      if sf.skinstate=skin_deleted then begin
         flist.delete(i);
         sf.free;
      end;
   end;
end;

procedure TSkinManage.AddSkinData(adata: Pointer);
begin
   dlist.add(adata);
end;

procedure TSkinManage.RemoveSkinData(adata: Pointer);
var i:integer;
begin
   i:= dlist.indexof(adata);
   if i<>-1 then begin
     dlist[i]:=nil;
     dlist.delete(i);
   end;
end;

procedure TSkinManage.DeleteAllMenus;
var i: integer;
    sm :TWinSkinPopMenu;
begin
   for i:=0 to mlist.count-1 do begin
      sm:=TWinSkinPopMenu(mlist[i]);
      sm.free;
   end;
   mlist.clear;
   mlist.free;
end;

procedure TSkinManage.SetMenu;
var i: integer;
    sm :TWinSkinPopMenu;
begin
//   i:= mlist.count;
//   if i=0 then exit;
   for i:=0 to mlist.count-1 do begin
      sm:=TWinSkinPopMenu(mlist[i]);
      sm.ownerdraw:=true;
   end;
end;

function  TSkinManage.FindSkinForm(aHwnd:THandle):dword;
var i: integer;
    sf :TWinSkinform;
begin
   result:=0;
   for i:=0 to flist.count-1 do begin
      sf:=TWinSkinform(flist[i]);
      if sf.hwnd=ahwnd then begin
         result:=dword(sf);
         break;
      end;
   end;
end;

function TSkinManage.AddMenu(aHwnd:THandle):boolean;
var amenu:TWinSkinPopMenu;
    s:string;
    adata:Tskindata;
    aptr:pointer;
    isskin:integer;
begin
   result:=false;
   if not active then exit;
   isskin:=sendmessage(ahwnd,CN_IsSkined,0,0);
   if isskin=1 then exit;

   if findskinMenu(ahwnd) then exit;

   FindSkindata(aptr,ahwnd);
   if aptr=nil then exit;

   adata:=Tskindata(aptr);
   if (adata.empty) or (not(xcMainmenu in adata.SkinControls)) then exit;

   amenu:=TWinSkinPopMenu.create;
   amenu.InitSkin(ahwnd,adata,0);
   Mlist.add(amenu);
   if menuactive then amenu.ownerdraw:=true;
end;

function TSkinManage.DeleteMenu(aHwnd:THandle):boolean;
var i: integer;
    sm :TWinSkinPopMenu;
begin
   result:=false;
   for i:=0 to mlist.count-1 do begin
      sm:=TWinSkinPopMenu(mlist[i]);
      if sm.hwnd=ahwnd then begin
         sm.unsubclass;
         mlist.delete(i);
         sm.free;
         result:=true;
         break;
      end;
   end;
   if mlist.count=0 then menuactive:=false;
end;

function  TSkinManage.FindSkinMenu(aHwnd:THandle):boolean;
var i: integer;
    sm :TWinSkinPopMenu;
begin
   result:=false;
   for i:=0 to mlist.count-1 do begin
      sm:=TWinSkinPopMenu(mlist[i]);
      if sm.hwnd=ahwnd then begin
         result:=true;
         break;
      end;
   end;
end;

procedure TSkinManage.UpdateSkinMenu(amenu:Hmenu);
var i: integer;
    mh:Thandle;
begin
{   mh:=FindWindowex(0,0,'#32768',nil);
   if (mh<>0) and (mh<>smenu.hwnd) then begin
      smenu.InitSkin(mh,GSkinData,amenu);
   end;}
end;

function  TSkinManage.GetMenuBg(amenu:Hmenu):Tbitmap;
var i: integer;
begin
   result:=nil;
   for I:= 0 to mlist.count-1 do
      if TWinSkinPopMenu(mlist[i]).hmenu=amenu then begin
         result:=TWinSkinPopMenu(mlist[i]).menubg;
         break;
      end;
end;

procedure  TSkinManage.FindPopupMenu(amenu:Hmenu);
var i: integer;
begin
   for I:= 0 to PopupList.count-1 do
      if TPopupMenu(PopupList[i]).handle=amenu then begin
         menuactive:=true;
         break;
      end;
end;

procedure  TSkinManage.SetMDIMax(b:boolean);
var i: integer;
    sf:Twinskinform;
begin
   if mdimax=b then exit;
   mdimax:=b;
   for I:= 0 to flist.count-1 do begin
      sf:=TWinSkinform(flist[i]);
      if sf.formstyle=sfsmdichild then  begin
        if b then begin
           if sf.crop then sf.Uncropwindow;
           sf.EnableSysbtn(b);
        end else begin
          if sf.windowstate<>swsmin then begin
            sf.windowstate:=swsnormal;
            sf.cropwindow;
            sf.EnableSysbtn(b);
            if not sf.crop then sf.refresh;
          end else sf.EnableSysbtn(true);
        end;
      end;
   end;
   if b then skinaddlog('***** SetMdiMax True')
   else skinaddlog('***** SetMdiMax Flase');
end;

procedure  TSkinManage.SetCaption(b:boolean);
var i: integer;
    sf:Twinskinform;
    dwstyle:Dword;
begin
   for I:= 0 to flist.count-1 do begin
      sf:=TWinSkinform(flist[i]);
      if sf.formstyle=sfsmdichild then  begin
        dwstyle := GetWindowLong( sf.hwnd, GWL_STYLE );
        dwstyle := dwstyle or WS_CAPTION;
        SetWindowLong( sf.hwnd, GWL_STYLE, dwstyle );
      end;
   end;
end;

function  TSkinManage.GetMDIChildNum:integer;
var i: integer;
    sf:Twinskinform;
begin
   result:=0;
   for I:= 0 to flist.count-1 do begin
      sf:=TWinSkinform(flist[i]);
      if sf.formstyle=sfsmdichild then
        inc(result);
   end;
end;

function TSkinManage.FindTForm(ahwnd:Thandle):Tform;
var i:integer;
begin
  result:=nil;
  for I := 0 to Screen.FormCount - 1 do  begin
    if Screen.Forms[I].handle=ahwnd then  begin
      Result := Screen.Forms[I];
      exit;
    end;
  end;
end;

procedure TSkinManage.SetAction(acode:integer;Interval:integer=250);
begin
   action:=acode;
   timer.Interval:=interval;
   if (state=skin_creating) then begin
     if acode=skin_Active then active:=true
     else if acode=skin_uninstall then active:=false;
   end else
      timer.enabled:=true;
end;

function EnumWindow(ahwnd :HWND;lParam: LPARAM):boolean;stdcall;
var s:string;
    r:Trect;
begin
   result:=false;
//   if (GetParent(ahwnd)= lparam) then begin
      s:=getwindowclassname(ahwnd);
      getwindowrect(ahwnd,r);
      skinaddlog(format('***enumWindow %1x,%s (%1d,%1d,%1d,%1d)',
             [ahwnd,s,r.left,r.top,r.right,r.bottom]));
      result:=true;
//   end;
end;

function EnumAddWindow(ahwnd :HWND;lParam: LPARAM):boolean;stdcall;
var s:string;
    r:Trect;
begin
   result:=true;
   Skinmanager.addform(ahwnd);
end;

procedure TSkinManage.DeleteSysbtn;
var i: integer;
    sf :TWinSkinform;
begin
   for i:= 0 to flist.count-1 do begin
      sf:=TWinSkinform(flist[i]);
      sf.DeleteSysbtn;
   end;
end;

function TSkinManage.initsb(ahwnd:Thandle):boolean;
begin
   result:=false;
   if SBinstall and (@pinitsb<>nil) then
       result := boolean(pinitsb(ahwnd));
end;

function TSkinManage.Uninitsb(ahwnd:Thandle):boolean;
begin
   result:=false;
   if SBinstall and (@pUninitsb<>nil) then
       result := boolean(pUninitsb(ahwnd));
end;

procedure TSkinManage.OnTimer(Sender: TObject);
var i: integer;
    sf :TWinSkinform;
    sd: TSkindata;
begin
   if UpdateData=nil then exit;
   sd := TSkindata(updateData);
   timer.enabled:=false;
   if sd.SkinFormtype = sfOnlyThisForm then begin
      case action of
        skin_uninstall:begin
          active:=false;
          DeleteDeleted;
          for i:= flist.count-1 downto 0 do begin
             sf:=TWinSkinform(flist[i]);
             if sf.fsd = sd then begin
                 sf.unsubclass;
                 sf.repaint(sf.hwnd);
                 flist.delete(i);
                 sf.free;
                 break;
             end;
          end;
        end;
       skin_change:begin
          DeleteDeleted;
          for i:= 0 to flist.count-1 do begin
             sf:=TWinSkinform(flist[i]);
             if sf.fsd = sd then begin
                sf.DeleteSysbtn;
                sf.InitSkinData;
                sf.skinchange;
                break;
             end;
          end;
        end;
       skin_Active: begin
         active:=true;
         skinchildform:=true;
//         EnumThreadWindows(GetCurrentThreadId,@EnumAddWindow,0);
         for I := Screen.FormCount - 1 downto 0 do  begin

              if Screen.Forms[I]=sd.Owner then begin
                activeform(Screen.Forms[I]);
                break;
              end;
         end;
         skinchildform:=false;
        end;
       skin_deleted : deleteform3;
      end;//endcase
      sd.doskinchanged;
      UpdateData:=nil;
   end else begin
   case action of
     skin_Active: begin
         active:=true;
         skinchildform:=true;
//         EnumThreadWindows(GetCurrentThreadId,@EnumAddWindow,0);
         DeleteDeleted;
         for I := Screen.FormCount - 1 downto 0 do  begin
              ActiveForm(Screen.Forms[I]);
         end;
         skinchildform:=false;
      end;
      skin_uninstall:begin
          active:=false;
          DeleteDeleted;
          for i:= flist.count-1 downto 0 do begin
             sf:=TWinSkinform(flist[i]);
             sf.unsubclass;
             sf.repaint(sf.hwnd);
             flist.delete(i);
             sf.free;
          end;
      end;
      skin_change:begin
          DeleteDeleted;
          for i:= 0 to flist.count-1 do begin
             sf:=TWinSkinform(flist[i]);
             if sf.fsd = sd then begin
               sf.DeleteSysbtn;
               sf.InitSkinData;
             end;
          end;
          {for i:= 0 to flist.count-1 do begin
             sf:=TWinSkinform(flist[i]);
             sf.Uncropwindow;
          end;}
          for i:= 0 to  flist.count-1 do begin
             sf:=TWinSkinform(flist[i]);
             if sf.fsd = sd then
               sf.skinchange;
          end;
      end;
      skin_deleted : deleteform3;
   end;//endcase
   sd.doskinchanged;
   UpdateData:=nil;
   end;
end;

initialization
finalization
  if skinmanager<>nil then
      SkinManager.free;
  SkinManager:=nil;
end.

⌨️ 快捷键说明

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