📄 acdials.pas
字号:
else if ((dwStyle and DS_MODALFRAME) > 0) then BorderStyle := acbsDialog;
PrepareTitleGlyph;
if TitleFont <> nil then FreeAndNil(TitleFont);
TitleFont := TFont.Create;
NonClientMetrics.cbSize := SizeOf(NonClientMetrics);
if SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @NonClientMetrics, 0) then begin
f := CreateFontIndirect(NonClientMetrics.lfCaptionFont);
if f <> 0 then TitleFont.Handle := f
end;
SetWindowLong(CtrlHandle, GWL_STYLE, GetWindowLong(CtrlHandle, GWL_STYLE) and not WS_SYSMENU);
end;
procedure TacDialogWnd.MakeTitleBG;
begin
if TitleBG <> nil then FreeAndNil(TitleBG);
TitleBG := TBitmap.Create;
TitleBG.Width := SkinData.FCacheBmp.Width;
TitleBG.Height := CaptionHeight + SysBorderHeight;
TitleBG.PixelFormat := pf24bit;
BitBlt(TitleBG.Canvas.Handle, 0, 0, TitleBG.Width, TitleBG.Height, SkinData.FCacheBmp.Canvas.Handle, 0, 0, SRCCOPY);
end;
function TacDialogWnd.OffsetX: integer;
var
i : integer;
begin
if Assigned(sBarVert) and sBarVert.fScrollVisible then i := GetScrollMetric(sBarVert, SM_CXVERTSB) else i := 0;
Result := (GetWindowWidth(CtrlHandle) - GetClientWidth(CtrlHandle) - i) div 2
end;
function TacDialogWnd.OffsetY: integer;
var
i : integer;
begin
if Assigned(sBarHorz) and sBarHorz.fScrollVisible then i := GetScrollMetric(sBarHorz, SM_CYHORZSB) else i := 0;
Result := GetWindowHeight(CtrlHandle) - GetClientHeight(CtrlHandle) - BorderWidth * integer(CaptionHeight <> 0) - i;
end;
procedure TacDialogWnd.PaintAll;
var
i, CY : integer;
h : integer;
{$IFDEF TNTUNICODE}
// s : WideString;
{$ELSE}
s : string;
{$ENDIF}
r : TRect;
ci : TCacheInfo;
begin
CY := SysBorderHeight;
h := 2 * CY + CaptionHeight;
if SkinData.BGChanged then begin
if False {!!!} and
SkinData.SkinManager.gd[SkinData.SkinIndex].ReservedBoolean and
(TitleBG <> nil) and (TitleBG.Width = WndSize.cx) and (SkinData.FCacheBmp.Height = WndSize.cy) {and (CaptionHeight <> 0)} then begin
// Drawn only caption
ci := MakeCacheInfo(SkinData.FCacheBmp);
BitBlt(SkinData.FCacheBmp.Canvas.Handle, 0, 0, TitleBG.Width, TitleBG.Height, TitleBG.Canvas.Handle, 0, 0, SRCCOPY);
end
else begin
RgnChanged := True;
ci.Ready := False;
SkinData.FCacheBmp.Width := WndSize.cx;
SkinData.FCacheBmp.Height := WndSize.cy;
if SkinData.SkinManager.IsValidSkinIndex(SkinData.SkinIndex) then begin
// Paint body
PaintItem(SkinData, EmptyCI, False, integer(FormActive), Rect(0, 0, WndSize.cx, WndSize.cy), Point(0, 0), SkinData.FCacheBmp, False);
if (BorderStyle = acbsSizeable) or (BorderStyle = acbsSizeToolWin) then begin // PaintGrip
i := SkinData.SkinManager.GetMaskIndex(SkinData.SkinManager.ConstData.IndexGLobalInfo, s_GlobalInfo, s_GripImage);
if SkinData.SkinManager.IsValidImgIndex(i) then DrawSkinGlyph(SkinData.FCacheBmp, RBGripPoint(i), 0, 1, SkinData.SkinManager.ma[i]);
end;
if SkinData.SkinManager.gd[SkinData.SkinIndex].ReservedBoolean and ((TitleBG = nil) or (TitleBG.Width <> WndSize.cx)) then MakeTitleBG;
ci := MakeCacheInfo(SkinData.FCacheBmp, OffsetX, OffsetY); // Prepare cache info
if (CaptionHeight <> 0) then begin // Paint title
i := SkinData.SkinManager.GetSkinIndex(s_FormTitle);
if SkinData.SkinManager.IsValidSkinIndex(i) then if IsIconic(CtrlHandle)
then PaintItem(i, s_FormTitle, ci, True, integer(FormActive),
Rect(0, 0, WndSize.cx, WndSize.cy), Point(0, 0), SkinData.FCacheBmp, SkinData.SkinManager)
else PaintItem(i, s_FormTitle, ci, True, integer(FormActive),
Rect(0, 0, WndSize.cx, h - CY), Point(0, 0), SkinData.FCacheBmp, SkinData.SkinManager);
DrawAppIcon(Self); // Draw app icon
if dwStyle and WS_SYSMENU = WS_SYSMENU then begin // Paint title toolbar if exists
i := SkinData.SkinManager.GetMaskIndex(SkinData.SkinIndex, SkinData.SkinSection, s_NormalTitleBar);
if SkinData.SkinManager.IsValidImgIndex(i) then DrawSkinRect(SkinData.FCacheBmp,
Rect(WndSize.cx - BarWidth(i), 0, SkinData.FCacheBmp.Width, h - CY),
True, EmptyCI, SkinData.SkinManager.ma[i], integer(FormActive), True);
end;
// Store bg for buttons
TempBmp.Width := TitleBtnsWidth + SysBorderWidth;
TempBmp.Height := HeaderHeight;
BitBlt(TempBmp.Canvas.Handle, 0, 0, TempBmp.Width, TempBmp.Height, SkinData.FCacheBmp.Canvas.Handle, WndSize.cx - TempBmp.Width - 1, 0, SRCCOPY);
// Paint buttons
PaintBorderIcons;
// Out the title text
SkinData.FCacheBmp.Canvas.Font.Assign(TitleFont);
R := Rect(SysBorderWidth + GetSystemMetrics(SM_CXSMICON) * integer(TitleIcon <> 0) + 4, CY, WndSize.cx - TitleBtnsWidth - 6, CaptionHeight);
if not IsRectEmpty(R) then begin
{$IFDEF TNTUNICODE}
WriteTextExW(SkinData.FCacheBmp.Canvas, PWideChar(Caption), True, R, DT_LEFT or DT_END_ELLIPSIS or DT_SINGLELINE or DT_VCENTER, SkinData.SkinManager.GetSkinIndex(s_FormTitle), boolean(FormActive));
{$ELSE}
s := CutText(SkinData.FCacheBmp.Canvas, Caption, WndSize.cx - GetSystemMetrics(SM_CXSMICON) - SysBorderWidth - TitleBtnsWidth - 6);
WriteTextEx(SkinData.FCacheBmp.Canvas, PChar(s), True, R, DT_LEFT or DT_SINGLELINE or DT_VCENTER, SkinData.SkinManager.GetSkinIndex(s_FormTitle), boolean(FormActive));
{$ENDIF}
end;
end;
end;
end;
SkinData.BGChanged := False
end;
end;
procedure TacDialogWnd.PaintBorderIcons;
var
i, b, Offset : integer;
procedure PaintButton(var Btn : TsCaptionButton; var Index : integer; SkinIndex : integer; BtnEnabled : boolean; UserBtn : TsTitleButton = nil);
var
w, btnH : integer;
begin
w := SysButtonWidth(Btn);
Btn.Rect.Left := Btn.Rect.Right - w;
btnH := ButtonHeight(Btn.ImageIndex);
Btn.Rect.Top := (CaptionHeight - btnH + SysBorderHeight) div 2;
if btnH < 16 then inc(Btn.Rect.Top, 2);
Btn.Rect.Bottom := Btn.Rect.Top + btnH;
if SkinIndex > -1 then DrawSkinGlyph(SkinData.FCacheBmp, Point(Btn.Rect.Left, Btn.Rect.Top),
Btn.State, 1 + integer(not boolean(FormActive) or not BtnEnabled), SkinData.SkinManager.ma[SkinIndex]);
inc(Index);
end;
begin
b := 1;
Offset := WndSize.cx - SysBorderWidth;
if (dwStyle and WS_SYSMENU = WS_SYSMENU) then begin // Accommodation of a buttons in a special order...
if SkinData.SkinManager.IsValidImgIndex(ButtonClose.ImageIndex) then begin
ButtonClose.Rect.Right := Offset;
PaintButton(ButtonClose, b, ButtonClose.ImageIndex, EnabledClose);
Offset := ButtonClose.Rect.Left;
end;
if VisibleMax then begin
if not IsZoomed(CtrlHandle) then begin
if SkinData.SkinManager.IsValidImgIndex(ButtonMax.ImageIndex) then begin
ButtonMax.Rect.Right := Offset;
PaintButton(ButtonMax, b, ButtonMax.ImageIndex, EnabledMax);
Offset := ButtonMax.Rect.Left;
end;
end
else begin
i := SkinData.SkinManager.GetMaskIndex(SkinData.SkinManager.ConstData.IndexGLobalInfo, s_GlobalInfo, s_BorderIconNormalize);
if i < 0 then i := SkinData.SkinManager.GetMaskIndex(SkinData.SkinIndex, SkinData.SkinSection, s_BorderIconNormalize); // For compatibility
if i > -1 then begin
ButtonMax.Rect.Right := Offset;
PaintButton(ButtonMax, b, i, EnabledRestore);
Offset := ButtonMax.Rect.Left;
end;
end;
end;
if VisibleMin then begin
if IsIconic(CtrlHandle) then begin // If form is minimized then changing to Normalize
i := SkinData.SkinManager.GetMaskIndex(SkinData.SkinManager.ConstData.IndexGLobalInfo, s_GlobalInfo, s_BorderIconNormalize);
if i < 0 then i := SkinData.SkinManager.GetMaskIndex(SkinData.SkinIndex, SkinData.SkinSection, s_BorderIconNormalize);
if SkinData.SkinManager.IsValidImgIndex(i) then begin
ButtonMin.Rect.Right := Offset;
PaintButton(ButtonMin, b, i, EnabledRestore); // For compatibility
Offset := ButtonMin.Rect.Left;
end;
end
else begin
if SkinData.SkinManager.IsValidImgIndex(ButtonMin.ImageIndex) then begin
ButtonMin.Rect.Right := Offset;
PaintButton(ButtonMin, b, ButtonMin.ImageIndex, EnabledMin);
Offset := ButtonMin.Rect.Left;
end;
end;
end;
if VisibleHelp then begin
if SkinData.SkinManager.IsValidImgIndex(ButtonHelp.ImageIndex) then begin
ButtonHelp.Rect.Right := Offset;
PaintButton(ButtonHelp, b, ButtonHelp.Imageindex, True);
// Offset := ButtonHelp.Rect.Left;
end;
end;
end;
end;
procedure TacDialogWnd.PaintForm(DC: hdc; SendUpdated : boolean = True);
begin
PaintAll;
CopyHwndCache(CtrlHandle, SkinData, Rect(BorderWidth, OffsetY, 0, 0),
Rect(0, 0, WndSize.cx, WndSize.cy), DC, False, BorderWidth, HeaderHeight);
SetParentUpdated(CtrlHandle);
end;
procedure TacDialogWnd.PrepareTitleGlyph;
var
SmallIcon: HIcon;
cx, cy: Integer;
Bmp : TBitmap;
begin
Bmp := TBitmap.Create;
cx := GetSystemMetrics(SM_CXSMICON);
cy := GetSystemMetrics(SM_CYSMICON);
Bmp.Width := cx;
Bmp.Height := cy;
Bmp.Canvas.Brush.Color := clFuchsia;
TitleIcon := hIcon(SendMessage(CtrlHandle, WM_GETICON, ICON_SMALL, 0));
if TitleIcon = 0 then TitleIcon := hIcon(SendMessage(CtrlHandle, WM_GETICON, ICON_BIG, 0));
if TitleIcon <> 0 then begin
SmallIcon := Windows.CopyImage(TitleIcon, IMAGE_ICON, cx, cy, LR_COPYFROMRESOURCE);
DrawIconEx(Bmp.Canvas.Handle, 0, 0, SmallIcon, cx, cy, 0, 0, DI_NORMAL);
DestroyIcon(SmallIcon);
if TitleGlyph = nil then TitleGlyph := TBitmap.Create;
TitleGlyph.Assign(Bmp);
end;
FreeAndNil(Bmp);
end;
function TacDialogWnd.RBGripPoint(ImgIndex: integer): TPoint;
begin
if SkinData.SkinManager.ma[ImgIndex].Bmp = nil then begin
Result := Point(SkinData.FCacheBmp.Width - WidthOf(SkinData.SkinManager.ma[ImgIndex].R) div SkinData.SkinManager.ma[ImgIndex].ImageCount - SysBorderWidth,
SkinData.FCacheBmp.Height - HeightOf(SkinData.SkinManager.ma[ImgIndex].R) div (1 + SkinData.SkinManager.ma[ImgIndex].MaskType) - SysBorderHeight
);
end
else begin
Result := Point(SkinData.FCacheBmp.Width - SkinData.SkinManager.ma[ImgIndex].Bmp.Width div 3 - SysBorderWidth,
SkinData.FCacheBmp.Height - SkinData.SkinManager.ma[ImgIndex].Bmp.Height div 2 - SysBorderHeight
);
end;
end;
function TacDialogWnd.SysBorderHeight: integer;
begin
Result := 0;
if BorderStyle = acbsnone then Exit;
if BorderStyle in [acbsToolWindow, acbsSingle, acbsDialog]
then Result := GetSystemMetrics(SM_CYFIXEDFRAME)
else Result := GetSystemMetrics(SM_CYSIZEFRAME);
end;
function TacDialogWnd.SysBorderWidth: integer;
begin
Result := 0;
if BorderStyle = acbsnone then Exit;
if BorderStyle in [acbsToolWindow, acbsSingle, acbsDialog]
then Result := GetSystemMetrics(SM_CXFIXEDFRAME)
else Result := GetSystemMetrics(SM_CXSIZEFRAME);
end;
function TacDialogWnd.SysButtonWidth(Btn: TsCaptionButton): integer;
begin
if SkinData.SkinManager.IsValidImgIndex(Btn.ImageIndex) then begin
if SkinData.SkinManager.ma[Btn.ImageIndex].Bmp = nil
then Result := WidthOf(SkinData.SkinManager.ma[Btn.ImageIndex].R) div SkinData.SkinManager.ma[Btn.ImageIndex].ImageCount
else Result := SkinData.SkinManager.ma[Btn.ImageIndex].Bmp.Width div SkinData.SkinManager.ma[Btn.ImageIndex].ImageCount;
end
else Result := 21;
end;
function TacDialogWnd.TitleBtnsWidth: integer;
begin
Result := 0;
if VisibleClose then begin
inc(Result, SysButtonWidth(ButtonClose));
if VisibleMax then inc(Result, SysButtonWidth(ButtonMax));
if VisibleMin then inc(Result, SysButtonWidth(ButtonMin));
if VisibleHelp then inc(Result, SysButtonWidth(ButtonHelp));
end;
end;
function TacDialogWnd.VisibleClose: boolean;
begin
Result := dwStyle and WS_SYSMENU = WS_SYSMENU
end;
function TacDialogWnd.VisibleHelp: boolean;
begin
Result := dwExStyle and WS_EX_CONTEXTHELP = WS_EX_CONTEXTHELP
end;
function TacDialogWnd.VisibleMax: boolean;
begin
Result := dwStyle and WS_MAXIMIZEBOX = WS_MAXIMIZEBOX
end;
function TacDialogWnd.VisibleMin: boolean;
begin
Result := dwStyle and WS_MINIMIZEBOX = WS_MINIMIZEBOX
end;
procedure TacDialogWnd.Ac_WMNCPaint(var Message: TMessage);
var
DC, SavedDC : hdc;
i : integer;
begin
Provider.InitHwndControls(CtrlHandle);
SkinData.Updating := SkinData.Updating;
if SkinData.Updating then Exit;
GetWindowRect(CtrlHandle, WndRect);
WndSize.cx := WidthOf(WndRect);
WndSize.cy := HeightOf(WndRect);
if not RgnChanging and RgnChanged and ((BorderStyle <> acbsNone) or (dwStyle and WS_SIZEBOX = WS_SIZEBOX)) then begin
FillArOR(Self);
RgnChanged := False;
if not RgnChanging then UpdateRgn(Self);
end;
DC := GetWindowDC(CtrlHandle);
SavedDC := SaveDC(DC);
try
if (BorderStyle = acbsNone) and (dwStyle and WS_SIZEBOX = WS_SIZEBOX) then begin // v4.14
if SkinData.BGChanged then begin
PaintAll;
SkinData.BGChanged := False;
SkinData.Updating := False;
end;
i := 3;
// Title and menu line update
BitBlt(DC, 0, 0, WndSize.cx, i, SkinData.FCacheBmp.Canvas.Handle, 0, 0, SRCCOPY);
// Left border update
BitBlt(DC, 0, i, i, SkinData.FCacheBmp.Height, SkinData.FCacheBmp.Canvas.Handle, 0, i, SRCCOPY);
// Bottom border update
BitBlt(DC, i, WndSize.cy - i, WndSize.cx - i, i, SkinData.FCacheBmp.Canvas.Handle, i, WndSize.cy - i, SRCCOPY);
// Right border update
BitBlt(DC, SkinData.FCacheBmp.Width - i, i, i, SkinData.FCacheBmp.Height, SkinData.FCacheBmp.Canvas.Handle, SkinData.FCacheBmp.Width - i, i, SRCCOPY);
end
else PaintCaption(DC);
finally
RestoreDC(DC, SavedDC);
ReleaseDC(CtrlHandle, DC);
end;
RgnChanging := False;
end;
procedure TacDialogWnd.PaintCaption(dc: hdc);
var
h, bw, bh : integer;
begin
h := SysBorderHeight + CaptionHeight;
if IsIconic(CtrlHandle) then inc(h);
if SkinData.BGChanged then begin
if not SkinData.SkinManager.gd[SkinData.SkinIndex].ReservedBoolean or (TitleBG = nil) or (TitleBG.Width <> WndSize.cx) or (SkinData.FCacheBmp.Height <> WndSize.cy) or (BorderStyle = acbsNone) then begin
// ControlsChanged := not FirstInitialized;
end;
PaintAll;
SkinData.BGChanged := False;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -