Форум: "Система";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.15;
Скачать: [xml.tar.bz2];




Вниз

Иконка в ListBox 


SVF   (2002-01-12 15:40) [0]

Привет мастера.

Кто нибудь знает, как можно отобразить значёк в 16 пикс. А то уменя только отображаются в 32 пикс.
Помогите плз!



Song   (2002-01-13 10:46) [1]

Это возможно, если самому рисовать весь компонент по событию onDrawItem. Для этого нужно поставить свойство style на lbOwnerDrawFxed и обрабатывать событие onDrawItem. Но перед этим как вариант (можно и по другому)ложишь на форму компонент TImage или TImageList. В последнем соотвественно выставляешь свои 32х32 и загружаешь его туда. Дальше выставляем высоту поля в TListBox на 32 пикселя (чтобы выводимая картинка уместилась в строчку) - свойство lbOwnerDrawFxed как раз этим числом и руководствуется. Дальше вставляешь приведённый код:

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;Rect: TRect; State: TOwnerDrawState);
Var BitMap:TBitMap;
begin
BitMap:=TBitMap.Create;
try
ImageList1.GetBitMap(1,BitMap);
With TListBox(Control) Do
Begin
Canvas.FillRect(Rect);
// рисуем твоё изображение
Canvas.Draw(Rect.Left+2,Rect.Top+2,BitMap);
// выводим строку текста
Canvas.TextOut(Rect.Left+20,Rect.Top+2,Items[Index]);
End;
finally
BitMap.Free;
end;
end;



SVF   (2002-01-14 17:33) [2]

Ну так это для 32 пикселя, но мне то надо, что бы отобразить 16 пикселей.



Song   (2002-01-16 21:27) [3]

Тебе нужно чтобы икона 32х32 отображалась как 16х16? Или я не понял?



Serghei   (2002-01-17 12:59) [4]

Делаешь то же что написал Song только вместо Canvas.Draw пишешь Canvas.StretchDraw с его параметрами (по хелпу) или StretchBlt (опять см. хелп только Win32.hlp)
procedure StretchDraw(const Rect: TRect; Graphic: TGraphic );
ili
BOOL StretchBlt(

HDC hdcDest, // handle of destination device context
int nXOriginDest, // x-coordinate of upper-left corner of dest. rect.
int nYOriginDest, // y-coordinate of upper-left corner of dest. rect.
int nWidthDest, // width of destination rectangle
int nHeightDest, // height of destination rectangle
HDC hdcSrc, // handle of source device context
int nXOriginSrc, // x-coordinate of upper-left corner of source rectangle
int nYOriginSrc, // y-coordinate of upper-left corner of source rectangle
int nWidthSrc, // width of source rectangle
int nHeightSrc, // height of source rectangle
DWORD dwRop // raster operation code
);



Serghei   (2002-01-17 14:32) [5]

Только выставь высоту поля в TListBox на 16 пикселя!

Удачи!



SVF   (2002-01-17 21:35) [6]

Чего то неполучается. Непойму что.
Отображается только в 32х32 пикселя. Но видно что Иконка 16х16
Хотя в Rect значения left=0,top=0,Bottom=16;

Вот исходник процедуры.

procedure TMainForm.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
Var
Ic: TIcon;
p:string;
begin
Ic:=TIcon.Create;
p:=ListBox1.Items[Index];
Ic.Handle:=GetFileIconByName(p);// получаем указатель на значёк 16х16 пикселей
ImageList1.GetIcon(1,Ic);
try
With TListBox(Control) Do
Begin
Canvas.FillRect(Rect);
// рисуем твоё изображение
Canvas.StretchDraw(Rect,Ic);
// выводим строку текста
Canvas.TextOut(Rect.Left+20,Rect.Top+2,Items[Index]);
End;
finally
Ic.Free;
end;
end;

function GetFileIconByName(FileName:String):hIcon;
var
FileInfo:TSHFileInfo;
attr:Integer;
begin
attr:=FileGetAttr(FileName);
SHGetFileInfo(PChar(FileName),attr,FileInfo,SizeOf(FileInfo),
SHGFI_SYSICONINDEX or
SHGFI_ICON or
SHGFI_SMALLICON or
SHGFI_OPENICON);
Result:=FileInfo.hIcon;
end;



Serghei   (2002-01-18 09:27) [7]

Попробуй
1. var tmp_r : TRect;
...
tmp_r:=rect;
tmp_r.right:=rect.left+16; (16x16)
...
Canvas.StretchDraw(tmp_r,Ic);

ili

2. Рисуй не иконку а битмап полученный из ImageList1 при помощи метода ImageList1.GetBitmap
bmp : TBitmap;
...
bmp:=TBitmap.Create;
bmp.width:=16;
bmp.height:=16;
ImageList1.GetBitmap(index, bmp)
...

Удачи



Song   (2002-01-19 13:48) [8]

А ты сделай TImageList c размерами 16х16 и загрузи туда твою большую иконку, она при загрузке сожмётся в 16х16 (возможны артефакты сжатия) и при отображении будет рисоваться 16х16



SVF   (2002-01-19 16:00) [9]

Что то с BitMap-ом невыходит иконка неотображается. А если как TIcon то всёравно 32х32.

С TImageList всё поставил 16х16.... получил 32х32.

Мне надо чтобы в ЛистБоксе отображались значки програм. 32х32 показывает хотя значки 16х16. Даже StretchDraw не помогает :(.



Song   (2002-01-20 10:44) [10]

Ты запихиваешь в TImageList файл ico или файл bmp?
Если ico, тогда нужно ImageList1.GetIcon(1,Icon).
Очень странно, что у тебя не получается... высоту поля в TImageList выставь 16, свойство Style lbOwnerDrawFixed.
Сейчас сам попробую набить процедурку, напишу позже



Song   (2002-01-20 10:46) [11]

перепутал =) в смысле размер TImageList 16x16, а высоту поля в TListBox 16



Song   (2002-01-20 11:01) [12]

Ну вот слушай.. у меня получилось....
Вот процедура тебе:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
Var BitMap:TBitMap;
begin
BitMap:=TBitMap.Create;
try
ImageList1.GetBitMap(0,BitMap);
With TListBox(Control) Do
Begin
Canvas.FillRect(Rect);
Canvas.TextOut(Rect.Left+18,Rect.Top+2,Items[Index]);
Canvas.Draw(Rect.Left+2,Rect.Top+2,BitMap);
End;
finally
BitMap.Free;
end;
end;

в TImageList забил bmp файл 32х32. Он сжался до 16. Если нужно могу весь код выслать. и всё отображается правильно..

Может у тебя ошибка вот в чём: ты забиваешь в TImageList и индекс у иконы будет 0 (она первая в списке), а в GetBitMap пишешь 1???



SVF   (2002-01-21 21:17) [13]

Всё. Большое спасибо!



SVF   (2002-01-21 21:22) [14]

Мне нужно было в начале достать и занести её в ImageList1...
А уже потом всё остальное....
Еще раз спасибо.




Форум: "Система";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.15;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.016 c
4-46543           skywalker             2002-02-14 14:01  2002.04.15  
Как получить список запущенных приложений?


14-46516          --Reporter--          2002-03-06 13:48  2002.04.15  
Вопрос по видеокарточке S3


1-46347           SeF                   2002-03-27 02:55  2002.04.15  
Запихивание в DLL


1-46412           sdram                 2002-04-02 16:41  2002.04.15  
Как вывести в отчете значения формул из базы.


14-46493          dimich                2002-03-06 09:59  2002.04.15  
Вопрос для СИСАДМИНОВ.