首页 > 其他分享 >lazarus menu组件

lazarus menu组件

时间:2024-10-30 09:19:44浏览次数:7  
标签:String menu MainMenu add lazarus TObject 组件 Array procedure

lazarus的menu控件在银河麒麟显示(GTK2)灰黑色背景,荆通大神通过修改gtk2源码可以修改背景但效果还是不理想。近日在GitHub找到一个LazarusMenu,经试用发现问题很多,其中还使用了bgracontrols控件。

我修改的版本删除bgracontrols控件,修正了大量的Bug,已可以使用。

修改TAdvancedMenu的menu背景及高亮颜色:
unit TAdvancedMenu;

{$mode ObjFPC}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, Menus, StdCtrls, ExtCtrls,
  dataTypes;

const
  MenuBackColor  = clWhite;              //menu背景颜色
  MenuItemTextColor  = clBlack;          // menu文字颜色
  MenuHighlightColor =clInactiveCaption; //激活时的颜色
  MenuItemHighlightTextColor = clBlack;  //激活时文字颜色

在unit添加TAdvancedMenu单元。
demo:

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, Menus,
  TAdvancedMenu, Themes,ActnList, LCLProc;

type
  { TForm1 }
  TForm1 = class(TForm)
    Action1: TAction;
    ActionList1: TActionList;
    Panel2: TPanel;
    procedure FormCreate(Sender: TObject);
    procedure FileClick(Sender: TObject);
    procedure quitApplication(Sender: TObject);
    procedure printData(Sender: TObject);
    procedure sendData(Sender: TObject);
  private

  public

  end;

var
  Form1         : TForm1;
  MainMenu      : TAdvancedMenu.TAdvancedMainMenu;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
var
  MainMenuItems : Array of String;
  MainMenuNames : Array of String;

  mForm         : TForm;
  mPanel        : TPanel;
  qa            : TAdvancedMenu.TProc;
  pa            : TAdvancedMenu.TProc;
  sa            : TAdvancedMenu.TProc;

  ids           : Integer;

  FileMenuItems : Array of String;
  FileMenuItemNames:Array of String;

  EditMenuItems : Array of String;
  EditMenuItemNames:Array of String;

  NewMenuItems  : Array of String;
  NewMenuItemNames:Array of String;

  ViewMenuItems:array of string;
  ViewMenuItemNames:array of string;


  OpenMenuItems : Array of String;
  OpenMenuItemNames:Array of String;

  recentMenuItems : Array of String;
  recentMenuItemNames:Array of String;

  closeMenuShortCut : String;
  quitMenuShortCut  : String;
  importMenuShortCut: String;

  blankDocumentMenuShortCut   :  String;
  fromTemplateMenuShortCut    :  String;

begin
  MainMenuItems := ['文件', 'Edit', 'View', '[Select Mode]', 'Tools', 'Help'];
  MainMenuNames := ['fileMenu', 'editMenu', 'viewMenu', 'selectMenu', 'toolMenu', 'helpMenu'];
  MainMenu      := TAdvancedMenu.TAdvancedMainMenu.Create();
  MainMenu.create_mainMenu(MainMenuItems, MainMenuNames);


  FileMenuItems := ['新建', '打开', '保存', '导入', '导出', '打印', 'Send', 'Close', 'Quit'];
  FileMenuItemNames:=['newMenu', 'openMenu', 'saveMenu', 'importMenu', 'exportMenu', 'printMenu', 'sendMenu', 'closeMenu', 'quitMenu' ];

  EditMenuItems := ['Undo', 'Redo', '-', 'Cut', 'Copy', 'Paste'];
  EditMenuItemNames:=['undoMenu', 'redoMenu','divider1' ,'cutMenu', 'copyMenu', 'pasteMenu'];

  ViewMenuItems:= ['view', 'Redo', '-', 'Cut1', 'Copy', 'Paste'];
  ViewMenuItemNames:=['viewMenu1', 'redoMenu1','divider11' ,'cutMenu1', 'copyMenu1', 'pasteMenu1'];

  MainMenu.set_BGColor('viewMenu', TColor($88DDBB));//$662244));
  MainMenu.set_FGColor('helpMenu', TColor($88DDBB));

  mForm         := Form1;

  MainMenu.add_mainMenuSubMenu_byName('fileMenu', FileMenuItems, FileMenuItemNames);  // SUBMENU ADDED BUT WILL NOT RENDER
  MainMenu.add_mainMenuSubMenu_byName('editMenu', EditMenuItems, EditMenuItemNames);  // SUBMENU ADDED BUT WILL NOT RENDER
  MainMenu.add_mainMenuSubMenu_byName('viewMenu', ViewMenuItems, ViewMenuItemNames);  // SUBMENU ADDED BUT WILL NOT RENDER


  MainMenu.add_subMenuCheckBox('newMenu', True);
  MainMenu.add_subMenuCheckBox('exportMenu', False);

  MainMenu.add_subMenuPicture('newMenu', 'new.png');
  MainMenu.add_subMenuPicture('openMenu', 'open.png');

  MainMenu.set_FGColor('closeMenu', TColor($88DDBB));


  NewMenuItems  := ['Blank Document', 'From Templates'];
  NewMenuItemNames:=['blankDocumentMenu', 'fromTemplateMenu'];

  OpenMenuItems := ['Open Recents', 'Open Existing Document', 'Open Remote'];
  OpenMenuItemNames:=['recentItemsMenu', 'existingItemMenu', 'RemoteItemMenu'];

  recentMenuItems := ['File A', 'File B', 'File C', 'File D'];
  recentMenuItemNames:=['fileA', 'fileB', 'fileC', 'fileD'];

  closeMenuShortCut := 'Strg + W';
  quitMenuShortCut  := ShortCutToText(Action1.ShortCut);
  importMenuShortCut:= 'Strg + Umschalt + I';

  fromTemplateMenuShortCut := 'Strg + Umschalt + N';
  blankDocumentMenuShortCut:= 'Strg + N' ;

  MainMenu.assign_subMenuShortCut('closeMenu', closeMenuShortCut);
  MainMenu.assign_subMenuShortCut('quitMenu', quitMenuShortCut);
  MainMenu.assign_subMenuShortCut('importMenu', importMenuShortCut);

  MainMenu.add_subMenuSubMenu_byName('newMenu', NewMenuItems, NewMenuItemNames);
  MainMenu.add_subMenuSubMenu_byName('openMenu', openMenuItems, openMenuItemNames);

  MainMenu.add_subMenuSubMenu_byName('recentItemsMenu', recentMenuItems, recentMenuItemNames);

  MainMenu.assign_subMenuShortCut('blankDocumentMenu', blankDocumentMenuShortCut); 
  MainMenu.assign_subMenuShortCut('fromTemplateMenu' , fromTemplateMenuShortCut);


  mPanel        := Panel2;
  MainMenu.render(mPanel);


  qa            := @quitApplication;
  MainMenu.add_clickAction_byName('quitMenu', qa);
  Action1.OnExecute:=@quitApplication;
  MainMenu.add_clickAction_byName('printMenu', @printData);
  MainMenu.add_clickAction_byName('sendMenu', @sendData);

end;

procedure TForm1.FileClick(Sender: TObject);
begin
  showMessage('file clicked');
end;

procedure TForm1.quitApplication(Sender: TObject);
begin
  Form1.Close;
end;

procedure TForm1.printData(Sender: TObject);
begin
  showMessage('print clicked');
end;

procedure TForm1.sendData(Sender: TObject);
begin
  showMessage('Sending data');
end;

end.

在银河麒麟运行截图:

在windows 11的截图:

 

标签:String,menu,MainMenu,add,lazarus,TObject,组件,Array,procedure
From: https://www.cnblogs.com/qiufeng2014/p/18515064

相关文章

  • Vue.js组件开发全面指南:从基础到高级应用
    1.Vue.js组件概述1.1什么是Vue.js组件Vue.js组件是Vue.js框架中的核心概念,它是一种封装了特定功能的可复用代码单元。每个组件可以包含自己的模板、逻辑和样式,使得开发者能够构建大型应用时,像搭积木一样组合这些独立的组件。组件基于自定义元素进行扩展,使得开发者能够创......
  • HarmonyOS:自定义组件冻结功能
    一、简介自定义组件冻结功能专为优化复杂UI页面的性能而设计,尤其适用于包含多个页面栈、长列表或宫格布局的场景。在这些情况下,当状态变量绑定了多个UI组件,其变化可能触发大量UI组件的刷新,进而导致界面卡顿和响应延迟。为了提升这类负载UI界面的刷新性能,开发者可以选择尝......
  • vue2基础组件通信案例练习:把案例Todo-list改写成本地缓存
    @目录概述前端代码本人其他相关文章链接概述前面文章案例已经练习了父子组件之间的通信,这一节讲述如何把todos数组放进本地缓存中,因为实际开发场景中频繁查询的数据很有可能会用到本地缓存技术。思考:如何改成使用本地缓存,是写一堆按钮每次触发就是往本地缓存种get和set?答案......
  • Vue组件化基础-全局组件-局部组件
    认识组件化开发组件化开发Vue的组件化注册组件的方式注册全局组件<divid="app"><!--使用product-item组件--><product-item></product-item><product-item></product-item><product-item></product-item>......
  • HarmonyOS NEXT 组件市场在DevEco Studio,安装出现Fail to load plugin descriptor fro
     HarmonyOSNEXT开源组件市场  https://gitee.com/harmonyos-cases/cases  根据gitee的下载连接,下载了cases-master.zip。如果在devstudio-settings-plugins-设置按钮-installfromdisk,会报错,说明这个不是真正的插件包。解压这个zip,在plugin文件夹下有个case_plug......
  • NextJS v13服务端组件和客户端组件及最佳实践
    NextJSv13服务端组件和客户端组件及最佳实践NextJS......
  • GaussDB DCS组件
    云原生数据库支持DCS一是为了DCS能够支持持久化能力,二是构建一站式的云数据库服务能力。DCS原来是一个sharenothing的分布式集群,有自己的通信管理,集群管理和客户端。在云原生数据库中,DCS是作为一个组件集成到整个服务中,主要提供字符串(String)、哈希(Hash)、列表(List)、集合结构(Set、S......
  • DRF-Serializers序列化器组件源码分析及改编su
    1.源码分析注意:以下代码片段为方便理解已进行简化,只保留了与序列化功能相关的代码序列化的源码中涉及到了元类的概念,我在这里简单说明一下:元类(metaclass)是一个高级概念,用于定义类的创建行为。简单来说,元类是创建类的类,它决定了类的创建方式和行为。在Python中一切皆为对象,包......
  • 鸿蒙开发-组件初体验
    ​......
  • Autofac 组件、服务、自动装配 《第二篇》
    Autofac组件、服务、自动装配《第二篇》 一、组件创建出来的对象需要从组件中来获取,组件的创建有如下4种(延续第一篇的Demo,仅仅变动所贴出的代码)方式:1、类型创建RegisterTypeAutoFac能够通过反射检查一个类型,选择一个合适的构造函数,创造这个对象的实例。......