Ниже мы покажем вариант кода
Code: |
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; |
Code: |
{ В меню существуют некоторые проблемы масштабированием и палитрой иконки. Я также ищу лучшее решение, но это все, что я вам могу сейчас дать.
Листинг был изменен для того, чтобы помещать иконки в "чЕкнутое" состояние меню(просто это делает 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. |
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!