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

📄 suimainmenu.pas

📁 SUIPack是一款为Delphi和C++Builder开发的所见即所得的界面增强VCL组件
💻 PAS
📖 第 1 页 / 共 2 页
字号:
////////////////////////////////////////////////////////////////////////////////
//
//
//  FileName    :   SUIMainMenu.pas
//  Creator     :   Shen Min
//  Date        :   2002-05-26 V1-V3
//                  2003-06-15 V4
//                  2006-06-14 V6
//  Comment     :
//
//  Copyright (c) 2002-2006 Sunisoft
//  http://www.sunisoft.com
//  Email: support@sunisoft.com
//
////////////////////////////////////////////////////////////////////////////////

unit SUIMainMenu;

interface

{$I SUIPack.inc}

uses Windows, Classes, Menus, Forms, Graphics, ImgList, Controls, ComCtrls, SysUtils,
     SUIForm, SUIThemes, SUIMgr, SUI2Define, Math;

type
    TsuiMainMenu = class(TMainMenu)
    private
        m_Images : TCustomImageList;
        m_UIStyle : TsuiUIStyle;
        m_Height : Integer;
        m_SeparatorHeight : Integer;
        m_BarColor : TColor;
        m_BarToColor : TColor;
        m_BarWidth : Integer;
        m_Color : TColor;
        m_SeparatorColor : TColor;
        m_SelectedBorderColor : TColor;
        m_SelectedColor : TColor;
        m_SelectedFontColor : TColor;
        m_FontColor : TColor;
        m_BorderColor : TColor;
        m_FlatMenu : Boolean;
        m_FontName : TFontName;
        m_FontSize : Integer;
        m_FontCharset : TFontCharset;
        m_UseSystemFont : Boolean;
        m_Form: TsuiForm;
        m_FileTheme : TsuiFileTheme;

        function GetImages() : TCustomImageList;
        procedure SetImages(const Value : TCustomImageList);
        function GetOwnerDraw() : Boolean;
        procedure SetOwnerDraw(const Value : Boolean);

        procedure DrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; Selected: Boolean);
        procedure MeasureItem(Sender: TObject; ACanvas: TCanvas; var Width, Height: Integer);

        procedure SetUIStyle(const Value: TsuiUIStyle);
        procedure SetHeight(const Value: Integer);
        procedure SetSeparatorHeight(const Value: Integer);
        procedure SetUseSystemFont(const Value: Boolean);
        procedure SetFileTheme(const Value: TsuiFileTheme);

    protected
        procedure MenuChanged(Sender: TObject; Source: TMenuItem; Rebuild: Boolean); override;
        procedure Loaded; override;
        procedure Notification(AComponent: TComponent; Operation: TOperation); override;        

    public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy(); override;

        procedure AfterConstruction(); override;
        procedure MenuAdded();

        property Form : TsuiForm read m_Form write m_Form;        

    published
        property Images read GetImages write SetImages;
        property OwnerDraw read GetOwnerDraw write SetOwnerDraw;
        property FileTheme : TsuiFileTheme read m_FileTheme write SetFileTheme;
        property UIStyle : TsuiUIStyle read m_UIStyle write SetUIStyle;
        property MenuItemHeight : Integer read m_Height write SetHeight;
        property SeparatorHeight : Integer read m_SeparatorHeight write SetSeparatorHeight;
        property BarWidth : Integer read m_BarWidth write m_BarWidth;
        property BarColor : TColor read m_BarColor write m_BarColor;
        property BarToColor : TColor read m_BarToColor write m_BarToColor;
        property Color : TColor read m_Color write m_Color;
        property SeparatorColor : TColor read m_SeparatorColor write m_SeparatorColor;
        property SelectedBorderColor : TColor read m_SelectedBorderColor write m_SelectedBorderColor;
        property SelectedColor : TColor read m_SelectedColor write m_SelectedColor;
        property SelectedFontColor : TColor read m_SelectedFontColor write m_SelectedFontColor;
        property FontColor : TColor read m_FontColor write m_FontColor;
        property BorderColor : TColor read m_BorderColor write m_BorderColor;
        property FlatMenu : Boolean read m_FlatMenu write m_FlatMenu;
        property FontName : TFontName read m_FontName write m_FontName;
        property FontSize : Integer read m_FontSize write m_FontSize;
        property FontCharset : TFontCharset read m_FontCharset write m_FontCharset;

        property UseSystemFont : Boolean read m_UseSystemFont write SetUseSystemFont;
    end;


implementation

uses SUIResDef, SUIPublic, SUIMenu;


{ TsuiMainMenu }

procedure TsuiMainMenu.AfterConstruction;
begin
    inherited;

    if not (Owner is TCustomForm) then
        Exit;
    (Owner as TCustomForm).Menu := nil;
end;

constructor TsuiMainMenu.Create(AOwner: TComponent);
var
    Bmp : TBitmap;
begin
    inherited;

    m_Images := TImageList.Create(self);
    Bmp := TBitmap.Create();
    Bmp.LoadFromResourceName(
        hInstance,
        'MENU_CHECKED'
    );
    Bmp.Transparent := True;
    m_Images.AddMasked(Bmp, clWhite);
    Bmp.Free();
    inherited Images := m_Images;

    m_Height := 21;
    m_SeparatorHeight := 21;
    m_BarColor := clBtnFace;
    m_BarToColor := clBtnFace;
    m_BarWidth := 0;
    m_Color := clWhite;
    m_SeparatorColor := clGray;
    m_SelectedBorderColor := clHighlight;
    m_SelectedColor := clHighlight;
    m_SelectedFontColor := clWhite;
    m_FontColor := clWhite;
    m_BorderColor := clBlack;
    m_FlatMenu := false;
    m_FontName := 'MS Sans Serif';
    m_FontSize := 8;
    m_FontCharset := DEFAULT_CHARSET;
    m_UseSystemFont := true;

    UIStyle := GetSUIFormStyle(AOwner);
end;

destructor TsuiMainMenu.Destroy;
begin
    m_Images.Free();
    m_Images := nil;

    inherited;
end;

procedure TsuiMainMenu.DrawItem(Sender: TObject; ACanvas: TCanvas;
  ARect: TRect; Selected: Boolean);
var
    OutUIStyle : TsuiUIStyle;
    R : TRect;
    Cap : String;
    ShortKey : String;
    nCharLength : Integer;
    nCharStart : Integer;
    Item : TMenuItem;
    HandleOfMenuWindow : HWND;
    L2R : Boolean;
    Style : Cardinal;
    X : Integer;
begin
    Item := Sender as TMenuItem;
    L2R := (BiDiMode = bdLeftToRight) or (not SysLocale.MiddleEast);
    if m_FlatMenu then
    begin
        HandleOfMenuWindow := WindowFromDC(ACanvas.Handle);
        if HandleOfMenuWindow <> 0 then
        begin
            if UsingFileTheme(m_FileTheme, m_UIStyle, OutUIStyle) then
                Menu_DrawWindowBorder(
                    HandleOfMenuWindow,
                    clBlack,
                    m_FileTheme.GetColor(SKIN2_FORMCOLOR)
                )
            else
                Menu_DrawWindowBorder(
                    HandleOfMenuWindow,
                    clBlack,
                    GetInsideThemeColor(OutUIStyle, SUI_THEME_FORM_BACKGROUND_COLOR)
                )
        end;
    end;

    // draw line
    if Item.Caption = '-' then
    begin
{$IFDEF RES_MACOS}
        if m_UIStyle = MacOS then
            Menu_DrawMacOSLineItem(ACanvas, ARect)
        else
{$ENDIF}        
        begin
            // draw Left bar
            if L2R then
            begin
                if m_BarWidth > 0 then
                begin
                    R := Rect(ARect.Left, ARect.Top, ARect.Left + m_BarWidth, ARect.Bottom);
                    if m_BarColor = m_BarToColor then
                        Menu_DrawBackGround(ACanvas, R, m_BarColor)
                    else
                        DrawVerticalGradient(ACanvas, R, m_BarColor, m_BarToColor);
                end;

                // draw right non-bar
                R := Rect(ARect.Left + m_BarWidth, ARect.Top, ARect.Right, ARect.Bottom);
            end
            else
            begin
                if m_BarWidth > 0 then
                begin
                    R := Rect(ARect.Right - m_BarWidth, ARect.Top, ARect.Right, ARect.Bottom);
                    if m_BarColor = m_BarToColor then
                        Menu_DrawBackGround(ACanvas, R, m_BarColor)
                    else
                        DrawVerticalGradient(ACanvas, R, m_BarColor, m_BarToColor);
                end;

                // draw right non-bar
                R := Rect(ARect.Left, ARect.Top, ARect.Right - m_BarWidth, ARect.Bottom);
            end;
            Menu_DrawBackGround(ACanvas, R, m_Color);

            // draw line
            Menu_DrawLineItem(ACanvas, ARect, m_SeparatorColor, m_BarWidth, L2R);
        end;

        Exit;
    end; // draw line

    // draw background
    if Selected and Item.Enabled then
    begin
{$IFDEF RES_MACOS}
        if m_UIStyle = MacOS then
            Menu_DrawMacOSSelectedItem(ACanvas, ARect)
        else
{$ENDIF}        
        begin
            Menu_DrawBackGround(ACanvas, ARect, m_SelectedColor);
            Menu_DrawBorder(ACanvas, ARect, m_SelectedBorderColor);
        end;
    end
    else
    begin
{$IFDEF RES_MACOS}
        if m_UIStyle = MacOS then
            Menu_DrawMacOSNonSelectedItem(ACanvas, ARect)
        else
{$ENDIF}
        begin
            // draw left bar
            if m_BarWidth > 0 then

⌨️ 快捷键说明

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