📄 suiform.pas
字号:
);
end;
if (
(Operation = opRemove) and
(AComponent = m_Panel)
)then
m_Panel := nil;
if (
(Operation = opRemove) and
(AComponent = m_Menu)
) then
DestroyMenuBar();
if (
(Operation = opRemove) and
(AComponent = self)
)then
begin
m_Form.Repaint();
if m_Menu <> nil then
begin
if m_Menu is TsuiMainMenu then
(m_Menu as TsuiMainMenu).Form := nil;
end;
end;
if (
(Operation = opRemove) and
(AComponent = m_FileTheme)
)then
begin
m_FileTheme := nil;
ContainerApplyUIStyle(self, SUI_THEME_DEFAULT, nil);
SetUIStyle(SUI_THEME_DEFAULT);
end;
end;
procedure TsuiForm.OnApplicationMessage(var Msg: TMsg;
var Handled: Boolean);
var
AMsg : TMessage;
begin
if Msg.message = WM_KEYDOWN then
begin
AMsg.Msg := Msg.message;
AMsg.WParam := Msg.wParam;
AMsg.LParam := Msg.lParam;
ProcessKeyPress(AMsg);
Handled := Boolean(AMsg.Result);
end;
end;
procedure TsuiForm.Paint;
var
Buf : TBitmap;
Bmp : TBitmap;
begin
if {$IFDEF RES_MACOS} (m_UIStyle = MacOS) {$ELSE} false {$ENDIF} or
{$IFDEF RES_PROTEIN} (m_UIStyle = Protein) {$ELSE} false {$ENDIF} then
begin
Buf := TBitmap.Create();
Bmp := TBitmap.Create();
try
Buf.Width := Width;
Buf.Height := Height;
{$IFDEF RES_MACOS}
if m_UIStyle = MacOS then
Bmp.LoadFromResourceName(hInstance, 'MACOS_FORM_BACKGROUND')
else
{$ENDIF}
Bmp.LoadFromResourceName(hInstance, 'PROTEIN_FORM_BACKGROUND');
Buf.Canvas.Brush.Bitmap := Bmp;
Buf.Canvas.FillRect(ClientRect);
BitBlt(Canvas.Handle, 0, 0, Width, Height, Buf.Canvas.Handle, 0, 0, SRCCOPY);
finally
Bmp.Free();
Buf.Free();
end;
end
else
begin
Canvas.Brush.Color := Color;
Canvas.FillRect(ClientRect);
end;
if csDesigning in ComponentState then
begin
AlignSelf();
PaintFormBorder();
end;
end;
procedure TsuiForm.PaintFormBorder();
var
R : TRect;
begin
if m_Form.FormStyle = fsMDIChild then
begin
m_Form.Canvas.Pen.Color := m_Color;
m_Form.Canvas.Pen.Width := m_Width;
m_Form.Canvas.Pen.Style := psSolid;
m_Form.Canvas.Brush.Color := m_Color;
R := Rect(0, 0, m_Width, m_Form.ClientHeight - 2);
m_Form.Canvas.FillRect(R);
R := Rect(0, m_Form.ClientHeight - m_Width - 3, m_Form.ClientWidth, m_Form.ClientHeight);
m_Form.Canvas.FillRect(R);
R := Rect(m_Form.ClientWidth - m_Width - 3, m_Form.ClientHeight, m_Form.ClientWidth, 0);
m_Form.Canvas.FillRect(R);
m_Form.Canvas.Pen.Width := m_Width;
m_Form.Canvas.MoveTo(0, 0);
m_Form.Canvas.LineTo(m_Form.ClientWidth, 0);
end
else
begin
m_Form.Canvas.Pen.Color := m_Color;
m_Form.Canvas.Pen.Width := m_Width;
m_Form.Canvas.Pen.Style := psSolid;
m_Form.Canvas.Brush.Color := m_Color;
R := Rect(0, 0, m_Width, m_Form.ClientHeight);
m_Form.Canvas.FillRect(R);
R := Rect(0, m_Form.ClientHeight - m_Width, m_Form.ClientWidth, m_Form.ClientHeight);
m_Form.Canvas.FillRect(R);
R := Rect(m_Form.ClientWidth - m_Width, m_Form.ClientHeight, m_Form.ClientWidth, 0);
m_Form.Canvas.FillRect(R);
m_Form.Canvas.Pen.Width := m_Width;
m_Form.Canvas.MoveTo(0, 0);
m_Form.Canvas.LineTo(m_Form.ClientWidth, 0);
end;
end;
procedure TsuiForm.ProcessKeyPress(var Msg: TMessage);
begin
if (not FormHasFocus(m_Form)) or (not m_Form.Active) then
Msg.Result := 0
else if not Assigned(Menu) then
Msg.Result := 0
else if m_Menu.IsShortCut(TWMKEY(Msg)) then
Msg.Result := 1
else
Msg.Result := 0;
end;
procedure TsuiForm.RepaintMenuBar;
begin
if (m_MenuBar = nil) or (m_Menu = nil) then
Exit;
if m_Menu is TsuiMainMenu then
if (m_Menu as TsuiMainMenu).UseSystemFont then
Menu_GetSystemFont(m_MenuBar.Font)
else
begin
m_MenuBar.Font.Name := (m_Menu as TsuiMainMenu).FontName;
m_MenuBar.Font.Size := (m_Menu as TsuiMainMenu).FontSize;
m_MenuBar.Font.Charset := (m_Menu as TsuiMainMenu).FontCharset;
end;
m_MenuBar.Repaint();
end;
procedure TsuiForm.SetBorderWidth(const Value: Integer);
begin
m_Width := Value;
SetWidth(Width);
AlignSelf();
SetHeight(Height);
PaintFormBorder();
end;
procedure TsuiForm.SetButtons(const Value: TsuiTitleBarButtons);
begin
m_TitleBar.Buttons.Assign(Value);
end;
procedure TsuiForm.SetCaption(const Value: TCaption);
begin
m_TitleBar.Caption := Value;
m_Form.Caption := Value;
end;
procedure TsuiForm.SetColor(const Value: TColor);
begin
m_Color := Value;
AlignSelf();
PaintFormBorder();
end;
procedure TsuiForm.SetDrawAppIcon(const Value: Boolean);
begin
m_TitleBar.DrawAppIcon := Value;
end;
procedure TsuiForm.SetFileTheme(const Value: TsuiFileTheme);
begin
if m_FileTheme = Value then
Exit;
m_FileTheme := Value;
SetUIStyle(m_UIStyle);
end;
procedure TsuiForm.SetFont(const Value: TFont);
begin
m_TitleBar.Font := Value;
end;
procedure TsuiForm.SetHeight(const Value: Integer);
begin
if csDesigning in ComponentState then
m_Form.Height := Value + m_Width + m_Width div 2 + m_ClientAreaHeightDiff
else
m_Form.Height := Value + m_Width + m_Width div 2;
AlignSelf();
end;
procedure TsuiForm.SetMenu(const Value: TMainMenu);
begin
if m_Menu <> nil then
begin
if m_Menu is TsuiMainMenu then
(m_Menu as TsuiMainMenu).Form := nil;
end;
m_Menu := Value;
if m_Menu is TsuiMainMenu then
(m_Menu as TsuiMainMenu).Form := self;
if m_Menu <> nil then
begin
if m_MenuBar = nil then
CreateMenuBar();
UpdateMenu();
end
else
DestroyMenuBar();
end;
procedure TsuiForm.SetMenuBarColor(const Value: TColor);
begin
m_MenuBarColor := Value;
if m_MenuBar <> nil then
m_MenuBar.Color := Value;
end;
procedure TsuiForm.SetMenuBarHeight(const Value: Integer);
var
i : Integer;
begin
m_MenuBarHeight := Value;
if m_MenuBar <> nil then
begin
m_MenuBar.Height := m_MenuBarHeight;
for i := 0 to m_MenuBar.ButtonCount - 1 do
m_MenuBar.Buttons[i].Height := m_MenuBarHeight;
end;
end;
procedure TsuiForm.SetOnBtnClick(
const Value: TsuiTitleBarButtonClickEvent);
begin
m_TitleBar.OnCustomBtnsClick := Value;
end;
procedure TsuiForm.SetOnHelpBtnClick(
const Value: TsuiTitleBarButtonClickEvent);
begin
m_TitleBar.OnHelpBtnClick := Value;
end;
procedure TsuiForm.SetPanel(const Value: TCustomPanel);
begin
if Value = self then
begin
MessageDlg('Sorry, you can''t select the Form assign to FormPanel property', mtError, [mbOK], 0);
Exit;
end;
m_Panel := Value;
if m_Panel = nil then
Exit;
m_Panel.Align := alClient;
if m_Panel is TPanel then
begin
TPanel(m_Panel).BevelOuter := bvNone;
TPanel(m_Panel).BevelInner := bvNone;
TPanel(m_Panel).BorderStyle := bsNone;
TPanel(m_Panel).Caption := '';
end
else if m_Panel is TsuiImagePanel then
TsuiImagePanel(m_Panel).Caption := '';
end;
procedure TsuiForm.SetRoundCorner(const Value: Integer);
begin
if m_Form.FormStyle <> fsMDIChild then
m_TitleBar.RoundCorner := Value;
end;
procedure TsuiForm.SetSections(const Value: TsuiTitleBarSections);
begin
m_TitleBar.Sections.Assign(Value);
end;
procedure TsuiForm.SetTitleBarCustom(const Value: Boolean);
begin
m_TitleBar.Custom := Value;
end;
procedure TsuiForm.SetTitleBarVisible(const Value: Boolean);
begin
if m_TitleBar.Visible = Value then
Exit;
m_TitleBar.Visible := Value;
m_TitleBar.Top := 0;
AlignSelf();
PaintFormBorder();
end;
procedure TsuiForm.SetUIStyle(const Value: TsuiUIStyle);
var
OutUIStyle : TsuiUIStyle;
Rect: TRect;
begin
Rect := m_Form.BoundsRect;
m_UIStyle := Value;
if UsingFileTheme(m_FileTheme, m_UIStyle, OutUIStyle) then
begin
BorderColor := m_FileTheme.GetColor(SUI_THEME_FORM_BORDER_COLOR);
BorderWidth := m_FileTheme.GetInt(SUI_THEME_FORM_BORDERWIDTH_INT);
Color := m_FileTheme.GetColor(SUI_THEME_FORM_BACKGROUND_COLOR);
end
else
begin
BorderColor := GetInsideThemeColor(OutUIStyle, SUI_THEME_FORM_BORDER_COLOR);
BorderWidth := GetInsideThemeInt(OutUIStyle, SUI_THEME_FORM_BORDERWIDTH_INT);
Color := GetInsideThemeColor(OutUIStyle, SUI_THEME_FORM_BACKGROUND_COLOR);
end;
MenuBarColor := Color;
m_TitleBar.FileTheme := m_FileTheme;
m_TitleBar.UIStyle := m_UIStyle;
if m_Form.FormStyle = fsMDIChild then
m_TitleBar.RoundCorner := 0;
if m_Menu <> nil then
begin
if m_Menu is TsuiMainMenu then
begin
(m_Menu as TsuiMainMenu).UIStyle := m_UIStyle;
(m_Menu as TsuiMainMenu).FileTheme := m_FileTheme;
end;
end;
if m_UIStyleAutoUpdateSub then
ContainerApplyUIStyle(self, m_UIStyle, FileTheme);
if M_Form.FormStyle = fsMDIChild then
M_Form.BoundsRect := Rect;
AlignSelf();
Repaint();
PaintFormBorder();
end;
procedure TsuiForm.SetVersion(const Value: String);
begin
// do nothing
end;
procedure TsuiForm.SetWidth(const Value: Integer);
begin
if csDesigning in ComponentState then
m_Form.Width := Value + m_Width * 2 + m_ClientAreaWidthDiff
else
m_Form.Width := Value + m_Width * 2;
AlignSelf();
end;
procedure TsuiForm.UpdateMenu;
var
i : Integer;
Button : TToolButton;
begin
if m_MenuBar = nil then
Exit;
if m_Menu = nil then
begin
DestroyMenuBar();
Exit;
end;
for i := 0 to m_MenuBar.ButtonCount - 1 do
m_MenuBar.Buttons[0].Free();
for i := m_Menu.Items.Count - 1 downto 0 do
begin
if m_Menu.Items[i].Parent <> m_Menu.Items then
continue;
Button := TToolButton.Create(self);
Button.Parent := m_MenuBar;
Button.Grouped := true;
Button.MenuItem := m_Menu.Items[i];
Button.AutoSize := true;
end;
end;
procedure TsuiForm.UpdateTopMenu;
var
i : Integer;
begin
if m_MenuBar = nil then
Exit;
for i := 0 to m_MenuBar.ButtonCount - 1 do
begin
if m_MenuBar.Buttons[i].MenuItem <> nil then
begin
m_MenuBar.Buttons[i].Caption := m_MenuBar.Buttons[i].MenuItem.Caption;
m_MenuBar.Buttons[i].Enabled := m_MenuBar.Buttons[i].MenuItem.Enabled;
end;
end;
end;
procedure TsuiForm.WMCREATE(var Msg: TMessage);
begin
AlignSelf();
PaintFormBorder();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -