如何在表单的系统菜单中添加带有图标的项目?

Lar*_*ref 2 windows delphi

这是我的代码,除了图标之外都有效

procedure TForm1.FormCreate(Sender: TObject);
var item : TMenuItemInfo;
begin
  with item do
  begin
    cbSize := SizeOf(MenuItemInfo);
    fMask := MIIM_TYPE or MIIM_ID;
    fType := MFT_STRING;
    wID := 180;
    dwTypeData := PChar('Test');
    cch := 4;
    hbmpItem := Image1.Picture.Bitmap.Handle;  //Image1 is TImage
  end;
  InsertMenuItem(GetSystemMenu(Handle, FALSE),0,true,item);
end;
Run Code Online (Sandbox Code Playgroud)

Tom*_*erg 5

有几个问题:

  1. 您在使用前没有清除TMenuItemInfo实例。进行调用时,未分配的字段可能包含无效或错误的数据。

    使用

    ZeroMemory(@item, SizeOf(item));

    在程序开始时。

  2. fMask您拥有的和成员的组合fType不正确。

    使用以下内容代替

    fMask := MIIM_STRING or MIIM_BITMAP or MIIM_ID;
    //  fType := MFT_STRING;
    
    Run Code Online (Sandbox Code Playgroud)

    也就是说,不分配fType

这是一个测试的示例片段,其中 aTImage 保存了橙色背景上描绘数字 2 的图像。这将作为图标添加到新菜单项中。(这是你的问题)

在此输入图像描述

根据要求添加测试代码:

// Note! Your `Image1` must have a bitmap loaded
procedure TForm39.AddSystemMenuItem;
var
  item : TMenuItemInfo;
begin
  ZeroMemory(@item, SizeOf(item));
  with item do
  begin
    cbSize := SizeOf(MenuItemInfo);
    fMask := MIIM_STRING or MIIM_BITMAP or MIIM_ID;
    // fType := MFT_STRING;
    wID := 180;
    dwTypeData := PChar('Test');
    cch := 4;
    hbmpItem := Image1.Picture.Bitmap.Handle;  //Image1 is TImage
  end;
  if not InsertMenuItem(GetSystemMenu(Handle, FALSE),0,true,item) then
    ShowMessage('Failed');
end;

procedure TForm39.Button1Click(Sender: TObject);
begin
  AddSystemMenuItem;
end;
Run Code Online (Sandbox Code Playgroud)

  • 好吧,您问如何将图标添加到菜单项。正如您从我的示例中看到的,它有效。 (2认同)