建议看一看TWindowHint类的源代码,然后在ComboBox的自画事件中调用。

解决方案 »

  1.   

    Triumph(无为)行吗?我表示怀疑。是否可以如下:
    重载ComboBox的WM_DRAWITEM消息,在其中修改ComboBox的Hint属性?
      

  2.   

    不需要重载,ComboBox本身应有ItemDraw事件,只要在此事件中调用即可。当然不能只修改ComBoBox的Hint属性,它只是在光标移动到ComboBox控件上之后才显示,下拉后就不显示了,所以我说要看一看TWindowsHint类的源代码,Delphi的Hint都是通过它实现的。
      

  3.   

    谢谢二位;Triumph我试过,但Twindowshint在屏幕的左上角显示,我无法要它到ComboBox中;你能试一下吗?
      

  4.   

    我以前在ListBox中用过,就是当光标移动到每一个列表时,在列表的正右方显示该列表的其它信息,Hint的的位置是在Application的OnHint是设置的,你也可以试试,在那里面可以设置很多Hint的属性。
      

  5.   

    给你看段类似控件的源码:
    procedure TSkComboHint.DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState);
     Var 
      CurHint : String;
      CmbPoint : TPoint;
      CmbRect : TRect;
      CmbHeight : Integer;
      CmbDropHeight : Integer;
    begin
     Inherited;
     FHintStr := Items.Strings[Index];
     Canvas.FillRect(Rect);
     Canvas.TextOut(Rect.Left, Rect.Top, FHintStr); 
      If (odSelected In State) Then
       begin
        If CurHint <> FHintStr Then
         begin
           CurHint := FHintStr;
          If Assigned(FHintWin) Then
            FHintWin.ReleaseHandle;
             If DroppedDown Then
              begin
               FHintWidth := Canvas.TextWidth(FHintStr);
                If FHintWidth > FCmbWidth Then
                 begin
                  FHintWin := THintWindow.Create(Self);
                  FHintWin.Color := clInfoBk; 
                  CmbHeight := Canvas.TextHeight(FHintStr);  
                  CmbDropHeight := CmbHeight * DropDownCount;
                  cmbPoint := ClientOrigin;
                  CmbRect.Left := cmbPoint.x + (FCmbWidth div 2);
                   If cmbPoint.y + CmbHeight + Rect.Top < cmbPoint.y Then
                    CmbRect.Top := cmbPoint.y + 45
                     else
                   If cmbPoint.y + CmbHeight + Rect.Top + 5 > cmbPoint.y + Height + CmbDropHeight Then
                      CmbRect.Top := cmbPoint.y + Height + CmbDropHeight + 45
                     else 
                      CmbRect.Top := cmbPoint.y + CmbHeight + Rect.Top + 45;
                      CmbRect.Bottom := CmbRect.Top + CmbHeight + 2;
                  CmbRect.Right := CmbRect.Left + FHintWidth + 10;
                   FHintWin.ActivateHint(CmbRect, FHintStr);
                 end;
              end;
         end;
       end;
    end;