Показать сообщение отдельно
  #3  
Старый 14.03.2008, 12:41
Rosenkrantz Rosenkrantz вне форума
Активный
 
Регистрация: 04.12.2007
Адрес: Москва
Сообщения: 234
Версия Delphi: Delphi 7
Репутация: 40
По умолчанию

В самом простом варианте - вот так.
Код:
unit asmMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  CM_ABOUT = WM_USER + 1;

procedure TForm1.FormCreate(Sender: TObject);
const
  SNewMenuItemCaption = 'About';
var
  Menu: HMENU;
  MenuItemInfo: TMenuItemInfo;
  lpszCapt: PChar;
begin
  // Получаем дескриптор системного меню
  Menu := GetSystemMenu(Handle, False);

  // Добавляем пункт "About"
  GetMem(lpszCapt, Length(SNewMenuItemCaption) + 1);
  StrPCopy(lpszCapt, SNewMenuItemCaption);
  FillChar(MenuItemInfo, SizeOf(MenuItemInfo), 0);
  with MenuItemInfo do begin
    cbSize        := SizeOf(MenuItemInfo);
    fMask         := MIIM_STRING + MIIM_ID;
    fType         := MFT_STRING;
    fState        := 0;
    wID           := CM_ABOUT;
    hSubMenu      := 0;
    hbmpChecked   := 0;
    hbmpUnchecked := 0;
    dwItemData    := 0;
    dwTypeData    := lpszCapt;
    cch           := Length(SNewMenuItemCaption);
  end;
  InsertMenuItem(Menu, 0, True, MenuItemInfo);
  FreeMem(lpszCapt);

  // Добавляем разделитель после нашего пункта
  FillChar(MenuItemInfo, SizeOf(MenuItemInfo), 0);
  with MenuItemInfo do begin
    cbSize        := SizeOf(MenuItemInfo);
    fType         := MFT_MENUBARBREAK;
  end;
  InsertMenuItem(Menu, 1, True, MenuItemInfo);
end;

procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
begin
  // Обрабатываем команду нашего пункта меню
  if Msg.CmdType = CM_ABOUT then
    ShowMessage('Insert item to system menu demo.');
  inherited;
end;

end.
Здесь в начало меню формы добавляется пункт "About" и отделяется чертой. Есть еще функция AppendMenu, она совсем простая, но она добавляет только в конец меню. С ней выглядело бы так:
Код:
AppendMenu(Menu, MF_STRING, SC_ABOUT, 'About');

Если вы хотите добавить подменю, то нужно его предварительно создать и указать его дескриптор в поле hSubMenu структуры TMenuItemInfo. Ну и флаги другие, конечно, выставить в fMask (MIIM_SUBMENU). Меню создается функцией CreateMenu
Ответить с цитированием