Форум: "Система";
Текущий архив: 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...
А уже потом всё остальное....
Еще раз спасибо.
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2002.04.15;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.004 c