Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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
3-46244
kserg@ukr.net
2002-03-25 11:37
2002.04.15
Как выполнить поиск 1-го вхождения и последующих без фильтрации?


1-46393
Немировский Шурик
2002-04-02 12:16
2002.04.15
Работа с циклами.


3-46255
@andrew
2002-03-20 12:42
2002.04.15
Привет Всем! Как бороться с ошибкой.


4-46535
marwin
2002-02-13 13:23
2002.04.15
Помогите!!! Не работает RegSaveKey !!!


1-46404
UnDISCOvery
2002-04-02 13:09
2002.04.15
Интерактивный ReSize ! Как ???





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский