Помещение изображения в поле со списком (правый край) в Delphi / Win32

#delphi #winapi #combobox #delphi-7

#delphi #winapi #поле со списком #delphi-7

Вопрос:

Я хочу нарисовать изображение внутри выпадающего списка (правый край) в Delphi / Win32.

Поле со списком имеет стиль csDropDown. Это не работает с csOwnerDrawFixed или csOwnerDrawVariable .

Поле со списком должно быть доступно для редактирования, аналогично адресной строке браузера.

Существует ли решение Win32 без создания дополнительного компонента Delphi?

Я попробовал следующее, но это не работает. Могу ли я сделать это с помощью Delphi 7?

 TForm1 = class(TForm)
  ...
private
  FChDirComboWndProc: TWndMethod;
  procedure ChDirComboWndProc(var Message: TMessage);
  ...

procedure TForm1.FormCreate(Sender: TObject);
begin
  FChDirComboWndProc := ChDirComboBox.WindowProc; // save old window proc
  ChDirComboBox.WindowProc := ChDirComboWndProc; // subclass
end;

procedure TForm1.ChDirComboWndProc(var Message: TMessage);
begin
    WM_ERASEBKGND: begin    // WM_PAINT ?
        SetBkMode(Message.WParam, TRANSPARENT);
        SetTextColor(Message.wParam, GetSysColor(COLOR_GRAYTEXT));
        FillRect(Message.wParam, Rect(3,3,300,30), GetStockObject(BLACK_BRUSH ));
        Rectangle(Message.wParam, 15,15, 100, 100); //Test
        OutputDebugString(PCHar(Format('aa %d %d %d',[Message.WParam, Message.LParam, ChDirComboBox.Handle])));
      end;
  end;
  FChDirComboWndProc(Message); // process message
end;
  

Ответ №1:

Способ сделать это — реализовать Owner-Drawn Combo Boxes . Смотрите Поля со списком, нарисованные владельцем, в MSDN или найдите пример Delphi, например, поле со списком, нарисованное владельцем.

Комментарии:

1. Поле со списком имеет стиль csDropDown . Это не работает с csOwnerDrawFixed или csOwnerDrawVariable . Поле со списком должно быть доступно для редактирования, аналогично адресной строке браузера. Я добавлю эту информацию к своему вопросу, извините, что забыл об этом.