![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
XP Иконки в менюшках [D7, WinXP]
Kinder © (2003-12-13 00:12:00)
Кто подскажет. Как сделать так, чтобы XP иконки (в самой XP) в менюшках отображались нормально, а не уродливо.
Kinder (2003-12-15 21:24:00) [1]
Пара вопросов есть
1
Почему не работает этот код?
procedure TForm1.Button1Click(Sender: TObject);
var
bitmap:TBitmap;
begin
bitmap:=TBitmap.Create;
DrawIconEx(bitmap.Canvas.Handle, 0, 0, LoadIcon(0, IDI_APPLICATION),
16, 16, 0, 0, DI_NORMAL);
Image1.Picture.Bitmap:=bitmap;
bitmap.Free;
end;
Второй
Есть ф-ция
function GetLnkIcon (const path:string):HBITMAP;
var
wcLinkName: array[0..MAX_PATH] of WideChar;
IconIndex: Integer;
hInstance:THandle;
obj: IUnknown;
isl: IShellLink;
ipf: IPersistFile;
PathBuffer, IconBuffer: array [0..MAX_PATH] of Char;
Win32FindData: TWin32FindData;
SmallIcon, HiIcon:HIcon;
ResultIcon:HBITMAP;
begin
ResultIcon:=0;
obj := CreateComObject(CLSID_ShellLink);
isl := obj as IShellLink;
ipf := obj as IPersistFile;
StringToWideChar(path, wcLinkName, SizeOf(wcLinkName));
ipf.Load(wcLinkName, STGM_READ);
isl.Resolve(0, SLR_ANY_MATCH);
isl.GetPath(PathBuffer, MAX_PATH, Win32FindData, SLGP_UNCPRIORITY);
isl.GetIconLocation(IconBuffer, MAX_PATH, IconIndex);
// Result:=ExtractIcon(hInstance,PathBuffer,IconIndex);
ExtractIconEx(PathBuffer, IconIndex, HiIcon, SmallIcon, 1);
if (SmallIcon<=0) and (HiIcon<=0) then
DrawIconEx(ResultIcon, 0, 0, LoadIcon(0, IDI_APPLICATION),
16, 16, 0, 0, DI_NORMAL)
else
if SmallIcon<=0 then
DrawIconEx(ResultIcon, 0, 0, HiIcon, 16, 16, 0, 0, DI_NORMAL)
else
DrawIconEx(ResultIcon, 0, 0, SmallIcon, 16, 16, 0, 0, DI_NORMAL);
Result:=ResultIcon;
beep;
end;
Она получает иконку ярлыка
теперь
procedure Tthe_main_form_1983.DrawItem(Sender: TObject;
ACanvas: TCanvas; ARect: TRect; Selected: Boolean);
var
LeftPos, LeftIcon: Integer;
TopPos, TopIcon: Integer;
Text: string;
bmp:TBitmap;
begin
bmp:=TBitmap.Create;
Text := (Sender as TMenuItem).Caption;
if Selected then begin
ACanvas.Brush.Color := clMenuHighlight;
ACanvas.Font.Color := clHighlightText;
// Draw right in the middle of the menu
end
else
begin
ACanvas.Brush.Color := clMenu;
ACanvas.Font.Color := clMenuText;
// Draw right in the middle of the menu
end;
ACanvas.FillRect(ARect);
LeftPos:=ARect.Left+16+6;
TopPos:=ARect.Top+1;
ACanvas.TextOut(LeftPos, TopPos, Text);
bmp.Handle:=GetLnkIcon("C:\windows\favico.ico");
ACanvas.Draw(LeftIcon, TopIcon, bmp);
bmp.Free;
end;
Однако икнка не прорисовывается. Почему? Т.е. первая ф-ция почему-то возвращает 0.
Kinder (2003-12-15 20:15:00) [2]
Так дело в том что cв-во OwnerDraw включено.
SPeller (2003-12-15 03:57:00) [3]
Менюхи можно OwnerDraw сделать. И в методе отрисовки преспокойно рисовать.
zxc (2003-12-14 21:15:00) [4]
вообще лучше бы ты перекрыл метод DrawItem, а там рисуй как хошь.
Kinder (2003-12-14 18:52:00) [5]
Причем тут 98? Я в XP и рисую.
zxc (2003-12-14 18:35:00) [6]
так а разве DrawIconEx в 98-м знает как рисовать 32-х битные иконки?
Kinder (2003-12-14 13:44:00) [7]
Вот код
procedure TForm1.Button1Click(Sender: TObject);
begin
DrawIconEx(N1231.Bitmap.Canvas.Handle, 0, 0, LoadIcon(0, IDI_APPLICATION),
16, 16, 0, 0, DI_NORMAL);
DrawIconEx(Canvas.Handle, 0, 0, LoadIcon(0, IDI_APPLICATION),
16, 16, 0, 0, DI_NORMAL);
end;
На форме всё отрисовывает, а в меню не хочет. Почему?
SPeller (2003-12-13 16:38:00) [8]
Рисовать самому с помощью DrawIconEx, которая нормально отрисовывает тени иконок.