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


Автор: MacTep 10.6.2012, 01:13
Можно ли отображать подсказки в выпадающем списке у длинных элементов, которые не влезают в ширину ComboBox? Как?

Автор: RelictOs 10.6.2012, 13:02
Код

procedure TForm1.CBDrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
 if (CB.Canvas.TextWidth(CB.Items[index]) > CB.Width) and (CB.Items[index]<>CB.Hint) then
  begin
   Application.CancelHint;
   CB.Hint := CB.Items[index];
  end;
end;

в теории должно работать

Автор: MacTep 10.6.2012, 14:19
А на практикте ничего не происходит

Автор: Чучмек 11.6.2012, 10:38
В сети есть дохрена примеров, где используется  обработка сообщения WM_CTLCOLORLISTBOX.
Однако, чтото не получается написть потомок TComboBox/TCustomComboBox с обработкой этого сообщения (D7/Win7) smile  smile  smile 
Сейчас буду искать почему.
Пока слепил через перехват оконной процедуры.
Установка
Код

unit2.CBSetHint(ComboBox1.Handle);
unit2.CBSetHint(ComboBox2.Handle);
unit2.CBSetHint(ComboBox3.Handle);

Снятие
Код

unit2.CBRemoveHint(ComboBox1.Handle);

Пока сильно не тестил, могут быть ошибки.

Автор: Чучмек 11.6.2012, 11:51
Все можно сделать проще
Код

type
THComboBox=class(TComboBox)
 private
  HW:THintWindow;
  isShowHW:boolean;
 protected
  procedure WMCTLCOLORLISTBOX(var Message: TMessage);//message WM_CTLCOLORLISTBOX;
  procedure WndProc(var Message: TMessage); override;
 public
  constructor Create(AOwner: TComponent); override;
  destructor Destroy;override;
end;
implementation
{ THComboBox }

constructor THComboBox.Create(AOwner: TComponent);
begin
  inherited;
HW:=THintWindow.Create(self);
HW.ActivateHint(rect(0,0,0,0),'');   //Без этого, при первом показе, HW перекрывается выпадающим списком
HW.ReleaseHandle;
isShowHW:=false;
end;

destructor THComboBox.Destroy;
begin
HW.Destroy;
  inherited;
end;

procedure THComboBox.WMCTLCOLORLISTBOX(var Message: TMessage);
var
  ItemIndex,txtlen:cardinal;
  twidth:cardinal;
  cr,pi:tpoint;
  txt:string;
  rct:TRECT;
begin
ItemIndex:=self.ItemIndex;
if ItemIndex>=0 then
   begin
   txt:=self.Items[ItemIndex];
   twidth:=self.Canvas.TextWidth(txt);
   GetWindowRect(self.Handle,rct);
   if twidth>(rct.Right-rct.Left) then
      begin
      pi.X:=rct.Left;
      pi.Y:=rct.Top;
      rct:=hw.CalcHintRect(1000,txt,nil);
      getcursorpos(cr);
      With rct do
       begin
       Left:=Left+pi.X;
       Right:=Left+Right;
       Top:=cr.Y+20;
       Bottom:=Top+Bottom;
       end;
      hw.ActivateHint(rct,txt);
      isShowHW:=true;
      exit;
      end;
    end;
if isShowHW then
 begin
 hw.ReleaseHandle;
 isShowHW:=false;
 end;
end;

procedure THComboBox.WndProc(var Message: TMessage);
begin
  inherited;
if Message.Msg=WM_CTLCOLORLISTBOX then WMCTLCOLORLISTBOX(Message)else if isShowHW then
 begin
 hw.ReleaseHandle;
 isShowHW:=false;
 end;
end;

end.


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