type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
File1: TMenuItem;
// * * * * Элемент для Menu Bar * * * * /
Open1: TMenuItem;
// * * * * Элемент для Menu file * * * * /
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{private declarations}
public
{public declarations}
Icn, Txt, MnuItm: TBitmap;
end;
procedure TForm2.FormCreate(Sender: TObject);
var
R: TRect;
HIcn: HIcon;
Ic: TIcon;
Index: Word;
FileName: PChar;
begin
// * * Получаем иконку определенного приложения * * /
Ic := TIcon.Create;
Ic.Handle := ExtractAssociatedIcon(Hinstance, // * задаем путь и имя файла * /
, Index);
// * * Создаем для текста изображение * * /
Txt := TBitmap.Create;
with Txt do
begin
Width := Canvas.TextWidth(' Тест');
Height := Canvas.TextHeight(' Тест');
Canvas.TextOut(0, 0, ' Тест');
end;
// * * Копируем иконку в bitmap для изменения его размера.
Вы не можете менять размер иконки * * /
Icn := TBitmap.Create;
with Icn do
begin
Width := 32;
Height := 32;
Brush.Color := clBtnFace;
Canvas.Draw(0, 0, Ic);
end;
// * * Создаем окончательное изображение, куда мы помещаем иконку и текст * * /
MnuItm := TBitmap.Create;
with MnuItm do
begin
Width := Txt.Width + 18;
Height := 18;
with Canvas do
begin
Brush.Color := clBtnFace;
Pen.Color := clBtnFace;
Brush.Style := bsSolid;
Rectangle(0, 0, Width, Height);
CopyMode := cmSrcAnd;
StretchDraw(Rect(0, 0, 16, 16), Icn);
CopyMode := cmSrcAnd;
Draw(16, 8 - (Txt.Height div 2), Txt);
end;
end;
end;
procedure TForm2.FormShow(Sender: TObject);
var
ItemInfo: TMenuItemInfo;
hBmp1: THandle;
begin
HBmp1 := MnuItm.Handle;
with ItemInfo do
begin
cbSize := SizeOf(ItemInfo);
fMask := MIIM_TYPE;
fType := MFT_BITMAP;
dwTypeData := PChar(MakeLong(hBmp1, 0));
end;
// * * Заменяем MenuItem Open1 законченным изображением * *
SetMenuItemInfo(GetSubMenu(MainMenu1.Handle, File1.MenuIndex),
Open1.MenuIndex, true, ItemInfo);
end;
{
В меню существуют некоторые проблемы масштабированием и палитрой иконки.
Я также ищу лучшее решение, но это все, что я вам могу сейчас дать.
Листинг был изменен для того, чтобы помещать иконки в "чЕкнутое"
состояние меню(просто это делает Win95).Это позволяет вам иметь
"чЕкнутое" и "нечЕкнутое" состояние.
}
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus, ShellAPI;
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
File1: TMenuItem;
Open1: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
Icn, MnuItm: TBitmap;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
var
R: TRect;
HIcn: HIcon;
Ic: TIcon;
Index: Word;
begin
{ /** Получаем иконку некоторого приложения **/}
Index := 0; { 11-я иконка в файле }
Ic := TIcon.Create;
Ic.Handle := ExtractAssociatedIcon(Hinstance,
'c:\win95\system\shell32.dll', Index);
{ /** Копируем иконку в bitmap для изменения его размера.
Вы не можете менять размер иконки **/}
Icn := TBitmap.Create;
with Icn do
begin
Width := 32;
Height := 32;
Canvas.Brush.Color := clbtnface;
Canvas.Draw(0, 0, Ic);
end;
{ /** Создаем окончательное изображение, куда мы помещаем иконку и текст **/}
MnuItm := TBitmap.Create;
with MnuItm do
begin
Width := 18;
Height := 18;
with Canvas do
begin
Brush.Color := clbtnface;
Pen.Color := clbtnface;
CopyMode := cmSrcAnd;
StretchDraw(Rect(0, 0, 16, 16), Icn);
end;
end;
end;
procedure TForm1.FormShow(Sender: TObject);
var
ItemInfo: TMenuItemInfo;
hBmp1: THandle;
begin
HBmp1 := MnuItm.Handle;
with ItemInfo do
begin
cbSize := SizeOf(ItemInfo);
fMask := MIIM_CHECKMARKS;
fType := MFT_BITMAP;
hBmpunChecked := HBmp1; { Неотмеченное (Unchecked) состояние }
hBmpChecked := HBmp1; { Отмеченное (Checked) состояние }
end;
{ /** Заменяем MenuItem Open1 законченным изображением **/}
SetMenuItemInfo(GetSubMenu(MainMenu1.Handle, File1.MenuIndex),
Open1.MenuIndex, true, ItemInfo);
end;
end.
|