Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Насчет отрисовки иконок в стандартных компонентах


Автор: Ak47black 2.5.2007, 13:05
Эта проблема наблюдаеться не только в TComboBoxе прри выделении иконок,
неособо красиво выделяються
user posted image
Как тут исправить? Можно-ли исправить без модификации компонента(-ов)?
Чтобы было как в проводнике>

Автор: Snowy 2.5.2007, 13:16
Ну... Самому нарисовать, как больше нравится.

Автор: Yanis 2.5.2007, 13:58
Цитата(Ak47black @  2.5.2007,  14:05 Найти цитируемый пост)
Эта проблема наблюдаеться не только в TComboBoxе прри выделении иконок,

А ты как их туда засунул?

Автор: Ak47black 2.5.2007, 14:05
Yanis, тоесть TComboBoxEx, и TImageList привинтил.
В нормальном состоянии то нормально и там и там выглядят нормально ,но а если выделяю то както нетак выглядит уже :|

Добавлено @ 14:10
Во тут очень хорошо видно что как-то тупо верхние (это в проге которая сделана в дельфи), отрисовываються
user posted image
А в низу как в проводнике.

Автор: Ak47black 6.5.2007, 11:58
Что с этим никто несталкивался что-ли   smile ?

Автор: Snowy 6.5.2007, 12:38
Ok. Набросал пример.
Доработай под себя - сам должен определить какую иконку рисовать.
Она фиксированно не прописывается. Определяй при отрисовке.
В коде я тупо прописал - рисовать всегда первую иконку из имаглиста1.
При желании можно доработать до компонента.
1. Воткни на форму ComboBox.
2. Установи ему стиль csOwnerDrawFixed
3. Собсна такой код:
Код

type
  TComboBox = class(StdCtrls.TCombobox)
  protected
    procedure CNDrawitem(var Message: TWMDrawItem); message CN_DRAWITEM;
  end;

  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    ImageList1: TImageList;
  end;

var Form1: TForm1;

implementation

{$R *.dfm}

procedure TComboBox.CNDrawitem(var Message: TWMDrawItem);
var
  b: TBitmap;
begin
  with Message.DrawItemStruct^ do
  begin
    b := TBitmap.Create;
    try
      Form1.ImageList1.GetBitmap(0, b);
      BitBlt(hDC, rcItem.Left, rcItem.Top, 16, 16, b.Canvas.Handle, 0, 0, SRCCOPY);
      rcItem.Left := rcItem.Left + 16;
      inherited;
    finally
      b.Free;
    end;
  end;
end;
Я везде намертво забил 16 - ибо это стандартные габариты иконы в имаджлисте, а также стандартная высота итемов комбобокса.
Прицепляю сампл проекта.

Автор: Alexeis 6.5.2007, 13:02
Ak47black, проверь возможно в винде используются иконки 24 битные а в проге используются 16 битные или вообще 256 цветов.

Автор: Snowy 6.5.2007, 13:16
Нет. Просто разные варианты прозрачности.
XP использует прозрачность, а дельфи по прежнему обратно-совместимую сеточку кладёт.
98-я винда также будет сеточку класть и вид будет идентичный.

Автор: Ak47black 6.5.2007, 19:28
Snowy, а почему тогда в дельфи примерах в Virtual ListViewe нормально иконки выделяються.
Может можно както на TImagelist подействовать что-бы он неложил эту сеточку, а выделял нормально сплошным?

Добавлено через 1 минуту и 15 секунд
Всётаки к каждому компоненту прикручивать тоже не выход.

Автор: Snowy 7.5.2007, 01:08
Сеточку делает не ImageList, а как раз компонент  smile 

Автор: Ak47black 7.5.2007, 10:30
Хорошо насшет того что сам компонент то я согласен, ну ,а как тогда в Virtual Listview примере ,там-же CN_DRAWITEM неиспользуеться ,а выделяються иконки нормалько как в проводнике, при этом используеться TListView  smile 

Автор: MetalFan 7.5.2007, 12:13
даффай тестовый проект)

Автор: Ak47black 7.5.2007, 12:35
Вот тестовый пример в котором все видно о чем я говорю)

Автор: MetalFan 7.5.2007, 15:22
чесн говоря - хз... что-то ничо в голову не пришло

Автор: Snowy 7.5.2007, 15:34
Просто в одном случае работа идёт на апи, во втором родными средствами.
ЗЫ. 3 раза подумай перед тем как использовать VirtualListView  smile 

Автор: Ak47black 7.5.2007, 19:26
Snowy, ну ,а как сделать сделать нормально не сеточкой ,а сплошным я так и непонял  smile 

Автор: TechBee 20.8.2007, 00:10
хз, взял DRKB, нашел статью, кое чо вырезал лишнее (как мне показалось).
за 100% работоспособность не отвечаю, но визуально получилось как ты хотел...

Код

procedure TForm1.FormCreate(Sender: TObject);
var
 SysIL   : THandle;
 SysSIL  : THandle;
 SFI     : TSHFileInfo;
 SmallImages: TImageList;
begin
 SmallImages := TImageList.Create(self);
 with SmallImages do begin
     Width  := 16;
     Height := 16;
     SysSIL := SHGetFileInfo('', 0, SFI, SizeOf(SFI),
       SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
     if SysSIL <> 0 then begin
       SmallImages.Handle := SysSIL;
       ShareImages := True;
     end;
   end;
 Listview1.SmallImages:=SmallImages;
 Listview1.ViewStyle:=vsReport;
end;

function GetIconIndex(const AFile: string; Attrs: DWORD): integer;
var
SFI: TSHFileInfo;
begin
 SHGetFileInfo(PChar(AFile), Attrs, SFI, SizeOf(TSHFileInfo),
   SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES);
 Result := SFI.iIcon;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 with ListView1.Items.Add do begin
    Caption := 'Item'+inttostr(random(255)); //сам подставишь что надо    
    ImageIndex := GetIconIndex(extractfilepath(paramstr(0))+'1.ico', FILE_ATTRIBUTE_NORMAL);
 end;
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)