Ignore:
Timestamp:
May 21, 2020, 6:42:45 PM (4 years ago)
Author:
chronos
Message:
  • Added: TDpiPopupMenu and TDpiMenuItem support.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/highdpi/Packages/DpiControls/UDpiControls.pas

    r216 r244  
    88  Classes, SysUtils, LCLProc, LResources, Forms, FormEditingIntf, ProjectIntf,
    99  Controls, StdCtrls, fgl, Graphics, ComCtrls, ExtCtrls, LCLType, GraphType,
    10   Types, CustApp, LMessages, LCLIntf;
     10  Types, CustApp, LMessages, LCLIntf, Menus;
    1111
    1212type
     
    483483    function GetVclForm: TForm; virtual;
    484484    procedure UpdateVclControl; override;
    485     procedure AfterConstruction; override;
    486485  public
    487486    VclForm: TForm;
     487    procedure AfterConstruction; override;
    488488    property ModalResult: TModalResult read GetModalResult write SetModalResult;
    489489    function ShowModal: Integer; virtual;
     
    796796  end;
    797797
     798  { TDpiMenuItem }
     799
     800  TDpiMenuItem = class(TComponent)
     801  private
     802    FItems: TList;
     803    FParent: TDpiMenuItem;
     804    FOnClick: TNotifyEvent;
     805    function GetCaption: TTranslateString;
     806    function GetChecked: Boolean;
     807    function GetCount: Integer;
     808    function GetEnabled: Boolean;
     809    function GetGroupIndex: Byte;
     810    function GetItem(Index: Integer): TDpiMenuItem;
     811    function GetOnClick: TNotifyEvent;
     812    function GetRadioItem: Boolean;
     813    function GetShortCut: TShortCut;
     814    function GetVisible: Boolean;
     815    function IsCaptionStored: Boolean;
     816    function IsCheckedStored: Boolean;
     817    function IsEnabledStored: Boolean;
     818    function IsShortCutStored: Boolean;
     819    function IsVisibleStored: Boolean;
     820    procedure SetCaption(AValue: TTranslateString);
     821    procedure SetChecked(AValue: Boolean);
     822    procedure SetEnabled(AValue: Boolean);
     823    procedure SetGroupIndex(AValue: Byte);
     824    procedure SetOnClick(AValue: TNotifyEvent);
     825    procedure SetRadioItem(AValue: Boolean);
     826    procedure SetShortCut(AValue: TShortCut);
     827    procedure SetVisible(AValue: Boolean);
     828    procedure OnClickHandler(Sender: TObject);
     829  protected
     830    function GetVclMenuItem: TMenuItem; virtual;
     831    procedure SetParentComponent(AValue: TComponent); override;
     832  public
     833    VclMenuItem: TMenuItem;
     834    constructor Create(AOwner: TComponent); override;
     835    destructor Destroy; override;
     836    procedure Delete(Index: Integer);
     837    procedure Add(Item: TDpiMenuItem);
     838    procedure Insert(Index: Integer; Item: TDpiMenuItem);
     839    function IndexOf(Item: TDpiMenuItem): Integer;
     840    procedure Remove(Item: TDpiMenuItem);
     841    property Items[Index: Integer]: TDpiMenuItem read GetItem; default;
     842    property Count: Integer read GetCount;
     843  published
     844    property RadioItem: Boolean read GetRadioItem write SetRadioItem default False;
     845    property ShortCut: TShortCut read GetShortCut write SetShortCut
     846      stored IsShortCutStored default 0;
     847    property Enabled: Boolean read GetEnabled write SetEnabled
     848      stored IsEnabledStored default True;
     849    property Visible: Boolean read GetVisible write SetVisible
     850      stored IsVisibleStored default True;
     851    property Checked: Boolean read GetChecked write SetChecked
     852      stored IsCheckedStored default False;
     853    property Caption: TTranslateString read GetCaption write SetCaption
     854      stored IsCaptionStored;
     855    property OnClick: TNotifyEvent read GetOnClick write SetOnClick;
     856    property GroupIndex: Byte read GetGroupIndex write SetGroupIndex default 0;
     857  end;
     858
     859  TDpiMenu = class(TComponent)
     860  private
     861    FItems: TDpiMenuItem;
     862  protected
     863    function GetVclMenu: TMenu; virtual;
     864  public
     865    property Items: TDpiMenuItem read FItems;
     866    constructor Create(AOwner: TComponent); override;
     867    destructor Destroy; override;
     868  end;
     869
     870  { TDpiPopupMenu }
     871
     872  TDpiPopupMenu = class(TDpiMenu)
     873  private
     874    function GetAutoPopup: Boolean;
     875    procedure SetAutoPopup(AValue: Boolean);
     876  protected
     877    function GetVclMenu: TMenu; override;
     878    function GetVclPopupMenu: TPopupMenu; virtual;
     879  public
     880    VclPopupMenu: TPopupMenu;
     881    procedure PopUp;
     882    procedure PopUp(X, Y: Integer); virtual;
     883    constructor Create(AOwner: TComponent); override;
     884    destructor Destroy; override;
     885  published
     886    property AutoPopup: Boolean read GetAutoPopup write SetAutoPopup default True;
     887  end;
     888
    798889var
    799890  DpiFormFileDesc: TDpiFormFileDesc;
     
    818909implementation
    819910
     911uses
     912  LCLStrConsts;
     913
    820914resourcestring
    821915  SDpiFormTitle = 'DpiForm form';
     
    827921  DpiFormFileDesc := TDpiFormFileDesc.Create;
    828922  RegisterProjectFileDescriptor(DpiFormFileDesc);
    829   RegisterComponents('DpiControls', [TDpiButton, TDpiImage, TDpiPaintBox, TDpiListBox]);
     923  RegisterComponents('DpiControls', [TDpiButton, TDpiImage, TDpiPaintBox,
     924    TDpiListBox, TDpiPopupMenu]);
    830925end;
    831926
     
    897992  Result := BitBlt(DestDC, ScaleToVcl(X), ScaleToVcl(Y), ScaleToVcl(Width),
    898993    ScaleToVcl(Height), SrcDC, ScaleToVcl(XSrc), ScaleToVcl(YSrc), Rop);
     994end;
     995
     996{ TDpiMenu }
     997
     998function TDpiMenu.GetVclMenu: TMenu;
     999begin
     1000  Result := nil;
     1001end;
     1002
     1003constructor TDpiMenu.Create(AOwner: TComponent);
     1004begin
     1005  inherited;
     1006  FItems := TDpiMenuItem.Create(Self);
     1007end;
     1008
     1009destructor TDpiMenu.Destroy;
     1010begin
     1011  FreeAndNil(FItems);
     1012  inherited;
     1013end;
     1014
     1015{ TDpiMenuItem }
     1016
     1017function TDpiMenuItem.GetCaption: TTranslateString;
     1018begin
     1019  Result := GetVclMenuItem.Caption;
     1020end;
     1021
     1022function TDpiMenuItem.GetChecked: Boolean;
     1023begin
     1024  Result := GetVclMenuItem.Checked;
     1025end;
     1026
     1027function TDpiMenuItem.GetCount: Integer;
     1028begin
     1029  Result := FItems.Count;
     1030end;
     1031
     1032function TDpiMenuItem.GetEnabled: Boolean;
     1033begin
     1034  Result := GetVclMenuItem.Enabled;
     1035end;
     1036
     1037function TDpiMenuItem.GetGroupIndex: Byte;
     1038begin
     1039  Result := GetVclMenuItem.GroupIndex;
     1040end;
     1041
     1042function TDpiMenuItem.GetItem(Index: Integer): TDpiMenuItem;
     1043begin
     1044  Result := TDpiMenuItem(FItems[Index]);
     1045end;
     1046
     1047function TDpiMenuItem.GetOnClick: TNotifyEvent;
     1048begin
     1049  Result := FOnClick;
     1050end;
     1051
     1052function TDpiMenuItem.GetRadioItem: Boolean;
     1053begin
     1054  Result := GetVclMenuItem.RadioItem;
     1055end;
     1056
     1057function TDpiMenuItem.GetShortCut: TShortCut;
     1058begin
     1059  Result := GetVclMenuItem.ShortCut;
     1060end;
     1061
     1062function TDpiMenuItem.GetVisible: Boolean;
     1063begin
     1064  Result := GetVclMenuItem.Visible;
     1065end;
     1066
     1067function TDpiMenuItem.IsCaptionStored: Boolean;
     1068begin
     1069  Result := False;
     1070end;
     1071
     1072function TDpiMenuItem.IsCheckedStored: Boolean;
     1073begin
     1074  Result := False;
     1075end;
     1076
     1077function TDpiMenuItem.IsEnabledStored: Boolean;
     1078begin
     1079  Result := False;
     1080end;
     1081
     1082function TDpiMenuItem.IsShortCutStored: Boolean;
     1083begin
     1084  Result := False;
     1085end;
     1086
     1087function TDpiMenuItem.IsVisibleStored: Boolean;
     1088begin
     1089  Result := False;
     1090end;
     1091
     1092procedure TDpiMenuItem.SetCaption(AValue: TTranslateString);
     1093begin
     1094  GetVclMenuItem.Caption := AValue;
     1095end;
     1096
     1097procedure TDpiMenuItem.SetChecked(AValue: Boolean);
     1098begin
     1099  GetVclMenuItem.Checked := AValue;
     1100end;
     1101
     1102procedure TDpiMenuItem.SetEnabled(AValue: Boolean);
     1103begin
     1104  GetVclMenuItem.Enabled := AValue;
     1105end;
     1106
     1107procedure TDpiMenuItem.SetGroupIndex(AValue: Byte);
     1108begin
     1109  GetVclMenuItem.GroupIndex := AValue;
     1110end;
     1111
     1112procedure TDpiMenuItem.SetOnClick(AValue: TNotifyEvent);
     1113begin
     1114  FOnClick := AValue;
     1115end;
     1116
     1117procedure TDpiMenuItem.SetRadioItem(AValue: Boolean);
     1118begin
     1119  GetVclMenuItem.RadioItem := AValue;
     1120end;
     1121
     1122procedure TDpiMenuItem.SetShortCut(AValue: TShortCut);
     1123begin
     1124  GetVclMenuItem.ShortCut := AValue;
     1125end;
     1126
     1127procedure TDpiMenuItem.SetVisible(AValue: Boolean);
     1128begin
     1129  GetVclMenuItem.Visible := AValue;
     1130end;
     1131
     1132procedure TDpiMenuItem.OnClickHandler(Sender: TObject);
     1133begin
     1134  if Assigned(FOnClick) then
     1135    FOnClick(Self);
     1136end;
     1137
     1138procedure TDpiMenuItem.Delete(Index: Integer);
     1139begin
     1140  FItems.Delete(Index);
     1141  GetVclMenuItem.Delete(Index);
     1142end;
     1143
     1144procedure TDpiMenuItem.Add(Item: TDpiMenuItem);
     1145begin
     1146  Insert(GetCount, Item);
     1147end;
     1148
     1149procedure TDpiMenuItem.Insert(Index: Integer; Item: TDpiMenuItem);
     1150begin
     1151  FItems.Insert(Index, Item);
     1152  GetVclMenuItem.Insert(Index, Item.GetVclMenuItem);
     1153end;
     1154
     1155function TDpiMenuItem.IndexOf(Item: TDpiMenuItem): Integer;
     1156begin
     1157  if FItems = nil then
     1158    Result := -1
     1159  else
     1160    Result := FItems.IndexOf(Item);
     1161end;
     1162
     1163procedure TDpiMenuItem.Remove(Item: TDpiMenuItem);
     1164var
     1165  I: Integer;
     1166begin
     1167  I := IndexOf(Item);
     1168  if I < 0 then
     1169    raise EMenuError.Create(SMenuNotFound);
     1170  Delete(I);
     1171end;
     1172
     1173function TDpiMenuItem.GetVclMenuItem: TMenuItem;
     1174begin
     1175  if not Assigned(VclMenuItem) then begin
     1176    VclMenuItem := TMenuItem.Create(nil);
     1177    VclMenuItem.Name := 'Vcl' + Name;
     1178    VclMenuItem.OnClick := @OnClickHandler;
     1179  end;
     1180  Result := VclMenuItem;
     1181end;
     1182
     1183procedure TDpiMenuItem.SetParentComponent(AValue: TComponent);
     1184begin
     1185  if (FParent = AValue) then Exit;
     1186  if Assigned(FParent) then FParent.Remove(Self);
     1187  if Assigned(AValue) then
     1188  begin
     1189    if (AValue is TDpiMenu)
     1190      then TDpiMenu(AValue).Items.Add(Self)
     1191    else if (AValue is TDpiMenuItem)
     1192      then TDpiMenuItem(AValue).Add(Self)
     1193    else
     1194      raise Exception.Create('TDpiMenuItem.SetParentComponent: suggested parent not of type TDpiMenu or TDpiMenuItem');
     1195   end;
     1196end;
     1197
     1198constructor TDpiMenuItem.Create(AOwner: TComponent);
     1199begin
     1200  inherited;
     1201  FItems := TList.Create;
     1202end;
     1203
     1204destructor TDpiMenuItem.Destroy;
     1205begin
     1206  FreeAndNil(FItems);
     1207  inherited Destroy;
     1208end;
     1209
     1210{ TDpiPopupMenu }
     1211
     1212procedure TDpiPopupMenu.PopUp;
     1213var
     1214  Pos: TPoint;
     1215begin
     1216  Pos := DpiMouse.CursorPos;
     1217  Popup(Pos.X, Pos.Y);
     1218end;
     1219
     1220procedure TDpiPopupMenu.PopUp(X, Y: Integer);
     1221begin
     1222  GetVclPopupMenu.PopUp(ScaleToVcl(X), ScaleToVcl(Y));
     1223end;
     1224
     1225constructor TDpiPopupMenu.Create(AOwner: TComponent);
     1226begin
     1227  inherited;
     1228  GetVclPopupMenu;
     1229end;
     1230
     1231function TDpiPopupMenu.GetAutoPopup: Boolean;
     1232begin
     1233  Result := GetVclPopupMenu.AutoPopup;
     1234end;
     1235
     1236procedure TDpiPopupMenu.SetAutoPopup(AValue: Boolean);
     1237begin
     1238  GetVclPopupMenu.AutoPopup := AValue;
     1239end;
     1240
     1241function TDpiPopupMenu.GetVclMenu: TMenu;
     1242begin
     1243  Result := GetVclPopupMenu;
     1244end;
     1245
     1246function TDpiPopupMenu.GetVclPopupMenu: TPopupMenu;
     1247begin
     1248  if not Assigned(VclPopupMenu) then begin
     1249    VclPopupMenu := TPopupMenu.Create(nil);
     1250    if Assigned(Items.VclMenuItem) then Items.VclMenuItem.Free;
     1251    Items.VclMenuItem := VclPopupMenu.Items;
     1252  end;
     1253  Result := VclPopupMenu;
     1254end;
     1255
     1256destructor TDpiPopupMenu.Destroy;
     1257begin
     1258  if Assigned(VclPopupMenu) then FreeAndNil(VclPopupMenu);
     1259  inherited Destroy;
    8991260end;
    9001261
     
    22132574procedure TDpiScreen.UpdateScreen;
    22142575begin
    2215   Dpi := 96 * 2; //Screen.PixelsPerInch;
     2576//  Dpi := 96 * 2;
     2577  Dpi := Screen.PixelsPerInch;
    22162578end;
    22172579
Note: See TracChangeset for help on using the changeset viewer.