📄 winskindlg.pas
字号:
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 + -