📄 sskinprovider.pas
字号:
CaptionHeight +
LinesCount * MenuHeight * integer(MenuPresent) +
Form.BorderWidth + 1
);
end;
end
else begin
DropSysMenu(Form.Left + BorderWidth, Form.Top + BorderHeight + HeightOf(IconRect));
end;
end
else begin
if IsIconic(Form.Handle) then begin
Message.Result := 1;
Form.Perform(WM_SYSCOMMAND, $F012, 0);
SendMessage(Form.Handle, WM_NCLBUTTONUP, 0, 0);
end
else begin
SetHotHT(0);
if (Form.WindowState <> WSMAXIMIZED) or (CursorToPoint(0, TWMNCLButtonDown(Message).YCursor).y > BorderHeight + CaptionHeight) then begin
Message.Result := CallWindowProc(pointer(OldInstance), Form.Handle, Message.Msg, Message.wParam, Message.lParam);
end;
end;
end
end;
end;
WM_NCRBUTTONDOWN : begin
Message.Result := 1;
if not (TWMNCLButtonUp(Message).HitTest in [HTCAPTION, HTSYSMENU]) then begin
Message.Result := CallWindowProc(pointer(OldInstance), Form.Handle, Message.Msg, Message.wParam, Message.lParam);
end;
end;
WM_NCRBUTTONUP : begin
case TWMNCLButtonUp(Message).HitTest of
HTCAPTION, HTSYSMENU : begin
SetHotHT(0);
DropSysMenu(TWMNCLButtonUp(Message).XCursor, TWMNCLButtonUp(Message).YCursor);
end
end;
Message.Result := 1;
end;
WM_NCLBUTTONUP, WM_LBUTTONUP: begin
Message.Result := 1;
case TWMNCHitMessage(Message).HitTest of
HTCLOSE : begin
ButtonClose.State := 0;
SendMessage(Form.Handle, WM_SYSCOMMAND, SC_CLOSE, 0);
end;
HTMAXBUTTON : begin
if Form.WindowState = WSMAXIMIZED then begin
SendMessage(Form.Handle, WM_SYSCOMMAND, SC_RESTORE, 0);
end
else begin
SendMessage(Form.Handle, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
end;
SetHotHT(0);
SystemMenu.UpdateItems;
end;
HTMINBUTTON : begin
SetHotHT(0);
Form.WindowState := wsMinimized;
{ if (Application.MainForm = Form) or (fsModal in Form.FormState) then begin
end else begin
Form.WindowState := wsMinimized;
end;}
SystemMenu.UpdateItems;
// if Form.FormStyle = fsMDIChild then begin
BGChanged := True;
SendMessage(Form.Handle, WM_PAINT, 0, 0);
SendMessage(Form.Handle, WM_NCPAINT, 0, 0);
BGChanged := True;
// end;
end;
HTHELP : begin
SendMessage(Form.Handle, WM_SYSCOMMAND, SC_CONTEXTHELP, 0);
SetHotHT(0);
SystemMenu.UpdateItems;
end;
// MDI child buttons
HTCHILDCLOSE : begin
SendMessage(Form.ActiveMDIChild.Handle, WM_SYSCOMMAND, SC_CLOSE, 0);
end;
HTCHILDMAX : begin
SendMessage(Form.ActiveMDIChild.Handle, WM_SYSCOMMAND, SC_RESTORE, 0);
SetHotHT(0);
end;
HTCHILDMIN : begin
SendMessage(Form.ActiveMDIChild.Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
SetHotHT(0);
end
else begin
if IsIconic(Form.Handle) then begin
if Assigned(MDISkinProvider) then begin
DropSysMenu(Mouse.CursorPos.x, Mouse.CursorPos.y);
end;
end
else begin
Message.Result := CallWindowProc(pointer(OldInstance), Form.Handle, Message.Msg, Message.wParam, Message.lParam);
end;
end
end;
end;
SM_GETCACHE : begin
if (csLoading in ComponentState) then Exit; //Tries to copy of cache in loading??
GlobalCacheInfo.Bmp := FsStyle.FCacheBmp;
GlobalCacheInfo.X := OffsetX;// + TForm(Form).BorderWidth;
GlobalCacheInfo.Y := OffsetY + 1;// + TForm(Form).BorderWidth;
GlobalCacheInfo.Ready := True;
end;
WM_NCPAINT : begin
if not Form.Visible or (csLoading in ComponentState) then Exit;
if RgnChanged and (Form.BorderStyle <> bsNone) then begin
SetLength(ArOR, 0);
i := GetSkinIndex(FormTitle);
i := GetMaskIndex(i, FormTitle, BordersMask);
if i > -1 then begin
if IsIconic(Form.Handle) then begin
AddRgn(ArOR, ma[i].Bmp, IconicWidth);
end
else begin
AddRgn(ArOR, ma[i].Bmp, Form.Width);
end;
end;
RgnChanged := False;
end;
if not RgnChanging then begin
UpdateRgn;
end;
DC := GetWindowDC(Form.Handle);
SavedDC := SaveDC(DC);
try
PaintCaption(DC);
finally
RestoreDC(DC, SavedDC);
ReleaseDC(Form.Handle, DC);
end;
RgnChanging := False;
Message.Result := 1;
end;
WM_PAINT : begin
Form.ControlState := Form.ControlState + [csCustomPaint];
if Form.Visible then OurPaintHandler(TWMPaint(Message)); //!!!1
Message.Result := 1;
Form.ControlState := Form.ControlState - [csCustomPaint];
end;
WM_CREATE : begin
Message.Result := CallWindowProc(pointer(OldInstance), Form.Handle, Message.Msg, Message.wParam, Message.lParam);
if Assigned(Form.Menu) then begin
for i := 0 to Form.Menu.Items.Count - 1 do begin
SkinManager.SkinableMenus.InitItem(Form.Menu.Items[i], sSkinData.Active);
end;
end;
end;
SM_REFRESH : begin
if (csLoading in ComponentState) then Exit;
Form.Repaint;
SendMessage(Form.ClientHandle, WM_SIZE, 0, 0);
SendMessage(Form.ClientHandle, WM_NCPAINT, 0, 0);
if Form.Menu <> nil then begin
// UpdateMenu;!!!
end;
end;
WM_NCACTIVATE : begin
Message.Result := CallWindowProc(pointer(OldInstance), Form.Handle, Message.Msg, Message.wParam, Message.lParam);
if csCreating in Form.ControlState then Exit;
SendMessage(Form.Handle, WM_NCPAINT, 0, 0); // Quick caption repaint for reduction of blinking
if not Activated then begin // Patch by Kim
Activated := True;
RefreshScrolls;
end;
if (Form.BorderStyle <> bsNone) then begin
if MDIButtonsNeeded then begin
if (TWMActivate(Message).Active <> WA_INACTIVE) or (Form.ActiveMDIChild.Active) then begin
FormActive := (TWMActivate(Message).Active <> WA_INACTIVE) or (Form.ActiveMDIChild.Active);
BGChanged := True;
end;
end
else begin
if FormActive <> (TWMActivate(Message).Active <> WA_INACTIVE) then begin
FormActive := TWMActivate(Message).Active <> WA_INACTIVE;
BGChanged := True;
end;
end;
end;
if Form.FormStyle = fsMDIChild then begin// !!!!System calling enables blinking
// Message.Result := CallWindowProc(pointer(OldInstance), Form.Handle, Message.Msg, Message.wParam, Message.lParam);
for i := 0 to TsSkinProvider(MDISkinProvider).Form.MDIChildCount - 1 do begin
if (TsSkinProvider(MDISkinProvider).Form.MDIChildren[i] <> Form) and (TsSkinProvider(MDISkinProvider).Form.MDIChildren[i].Visible) then begin
SendMessage(TsSkinProvider(MDISkinProvider).Form.MDIChildren[i].Handle, WM_NCPAINT, 0, 0);
end;
end;
TsSkinProvider(MDISkinProvider).BGChanged := True;
SendMessage(Form.Handle, WM_NCPAINT, 0, 0);
end;
if (Form.BorderStyle <> bsNone) {and not (Form.WindowState <> wsMinimized)} then begin
SendMessage(Form.Handle, WM_NCPAINT, 0, 0);
m := MakeMessage(SM_SETBGCHANGED, 0, 1, 0);
BroadCasts(Form, m);
SkinManager.SkinableMenus.InitItems(sSkinData.Active);
end;
if Form.FormStyle = fsMDIForm then begin
TsMDIForm(MDIForm).RefreshScrolls;
end
else begin
RefreshScrolls;
end;
if not MenusInitialized then begin
UpdateMenu;
MenusInitialized := True;
end;
end;
WM_ACTIVATE : begin
// Message.Result := CallWindowProc(pointer(OldInstance), Form.Handle, Message.Msg, Message.wParam, Message.lParam);
if csCreating in Form.ControlState then Exit;
if not Activated then begin // Patch by Kim
Activated := True;
RefreshScrolls;
end;
BGChanged := True;
{
if (Form.BorderStyle <> bsNone) then begin
if MDIButtonsNeeded then begin
if (TWMActivate(Message).Active <> WA_INACTIVE) or (Form.ActiveMDIChild.Active) then begin
FormActive := (TWMActivate(Message).Active <> WA_INACTIVE) or (Form.ActiveMDIChild.Active);
BGChanged := True;
end;
end
else begin
if FormActive <> (TWMActivate(Message).Active <> WA_INACTIVE) then begin
FormActive := TWMActivate(Message).Active <> WA_INACTIVE;
BGChanged := True;
end;
end;
end;
}
if Form.FormStyle = fsMDIChild then begin// !!System calling enables blinking
// Message.Result := CallWindowProc(pointer(OldInstance), Form.Handle, Message.Msg, Message.wParam, Message.lParam);
for i := 0 to TsSkinProvider(MDISkinProvider).Form.MDIChildCount - 1 do begin
if (TsSkinProvider(MDISkinProvider).Form.MDIChildren[i] <> Form) and (TsSkinProvider(MDISkinProvider).Form.MDIChildren[i].Visible) then begin
SendMessage(TsSkinProvider(MDISkinProvider).Form.MDIChildren[i].Handle, WM_NCPAINT, 0, 0);
end;
end;
TsSkinProvider(MDISkinProvider).BGChanged := True;
SendMessage(Form.Handle, WM_NCPAINT, 0, 0);
end;
if (Form.BorderStyle <> bsNone) {and not (Form.WindowState <> wsMinimized)} then begin
SendMessage(Form.Handle, WM_NCPAINT, 0, 0);
m := MakeMessage(SM_SETBGCHANGED, 0, 1, 0);
BroadCasts(Form, m);
SkinManager.SkinableMenus.InitItems(sSkinData.Active);
end;
if Form.FormStyle = fsMDIForm then begin
TsMDIForm(MDIForm).RefreshScrolls;
end
else begin
RefreshScrolls;
end;
// UpdateMenu;!!!
end;
WM_NCLBUTTONDBLCLK : begin
Message.Result := 1;
case TWMNCHitMessage(Message).HitTest of
HTSYSMENU : begin Form.Close; end;
HTCAPTION : begin
if (SystemMenu.EnabledMax) or (SystemMenu.EnabledRestore) then begin
if (Form.WindowState = WSMAXIMIZED) then begin
Form.WindowState := WSNormal;
end
else begin
SendMessage(Form.Handle, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
end;
SystemMenu.UpdateItems;
end;
end;
end;
end;
WM_MEASUREITEM : begin
if (Form.FormStyle = fsMDIForm) and not (csDesigning in ComponentState) and (MDISkinProvider = Self) then begin
MDISkinProvider := Self;
end;
if not (Form.FormStyle = fsMDIChild) and Assigned(Form.Menu) and Assigned(SkinManager) and (PMeasureItemStruct(Message.LParam)^.CtlType = ODT_MENU) then begin
mi := Form.Menu.FindItem(PMeasureItemStruct(Message.LParam)^.itemID, fkCommand);
if mi <> nil then begin
SkinManager.SkinableMenus.InitItem(mi, True);
end;
end;
Message.Result := CallWindowProc(pointer(OldInstance), Form.Handle, Message.Msg, Message.wParam, Message.lParam);
end;
SM_GETPROVIDER : begin Message.Result := integer(Self); end;
WM_SYSCOMMAND : begin
if Form.FormStyle = fsMDIChild then begin
UpdateClient := (Form.WindowState = wsMaximized) and (Message.WParam <> SC_MAXIMIZE);
Message.Result := CallWindowProc(pointer(OldInstance), Form.Handle, Message.Msg, Message.wParam, Message.lParam);
case Message.WParam of
SC_CLOSE, SC_MAXIMIZE, SC_RESTORE, SC_MINIMIZE : begin
Application.ProcessMessages;
TsMDIForm(TsSkinProvider(MDISkinProvider).MDIForm).UpdateMDIIconItem;
TsSkinProvider(MDISkinProvider).BGChanged := True;
SendMessage(TsSkinProvider(MDISkinProvider).Form.Handle, WM_NCPAINT, 0, 0);
if UpdateClient then begin
R := Rect(0, 0,
TsMDIForm(TsSkinProvider(MDISkinProvider).MDIForm).Width,
TsMDIForm(TsSkinProvider(MDISkinProvider).MDIForm).Height
);
InvalidateRect(TsSkinProvider(MDISkinProvider).Form.ClientHandle, @R, True);
end;
TsMDIForm(TsSkinProvider(MDISkinProvider).MDIForm).RefreshScrolls;
end;
end;
end
else Message.Result := CallWindowProc(pointer(OldInstance), Form.Handle, Message.Msg, Message.wParam, Message.lParam);
end;
WM_WINDOWPOSCHANGING : begin
Message.Result := CallWindowProc(pointer(OldInstance), Form.Handle, Message.Msg, Message.wParam, Message.lParam);
RangeY := Range(sbVertical);
RangeX := Range(sbHorizontal);
end;
WM_ERASEBKGND : begin
Message.Result := 1;
end;
// CM_TEXTCHANGED, WM_SETTEXT : alert;
WM_EXITSIZEMOVE, WM_WINDOWPOSCHANGED : begin
Message.Result := CallWindowProc(pointer(OldInstance), Form.Handle, Message.Msg, Message.wParam, Message.lParam);
if FormChanged then begin
if not (csCreating in Form.ControlState) then BGChanged := True;
SendMessage(Form.Handle, WM_PAINT, 0, 0);
SendMessage(Form.Handle, WM_NCPAINT, 0, 0);
for i := 0 to Form.ControlCount - 1 do begin
if (Form.Controls[i] is TWinControl) then begin
SendMessage(TWinControl(Form.Controls[i]).Handle, SM_REPAINTSMOOTH, 0, 0); // Repaints of transparent controls | 2.01.04 Serge
end;
end;
end;
end;
// Caption changing
WM_SETCURSOR : begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -