分享

delphi中如何改变ComboBox的下拉列表宽度

 独孤求财 2012-03-20

delphi中如何改变ComboBox的下拉列表宽度

时间:2011-5-24来源:yang 作者: peng点击: 65次

delphi中如何改变ComboBox的下拉列表宽度
转摘:

因为ComboBox的下拉列表的宽度与ComboBox本身的宽度一样,因此,当某一项的长度大于ComboBox的宽度时,该项在下拉列表中就显示不完全.所以想改变ComboBox下拉列表的宽度,以适应最长项的显示宽度.

例如:在ComboBox中有一项有100个字符,而ComboBox的宽度只能显示50个字符.所以想当ComboBox的下拉列表弹出时,下拉列表的宽度可以足够显示100个字符.

不知道该怎么做?
 

procedure SetComboDropDownWidth(ComboBox: TComboBox; Width: Integer = -1);
var
 I, TextLen: Longint;
 lf: LOGFONT;
 f: HFONT;
begin
 if Width < ComboBox.Width then begin
   FillChar(lf,SizeOf(lf),0);
   StrPCopy(lf.lfFaceName, ComboBox.Font.Name);
   lf.lfHeight := ComboBox.Font.Height;
   lf.lfWeight := FW_NORMAL;
   if fsBold in ComboBox.Font.Style then
     lf.lfWeight := lf.lfWeight or FW_BOLD;

   f := CreateFontIndirect(lf);
   if (f <> 0) then
   begin
     try
       ComboBox.Canvas.Handle := GetDC(ComboBox.Handle);
       SelectObject(ComboBox.Canvas.Handle,f);
       try
         for I := 0 to ComboBox.Items.Count -1 do begin
           TextLen := ComboBox.Canvas.TextWidth(ComboBox.Items[I]);
           if TextLen > Width then
             Width := TextLen;
         end;
         (* Standard ComboBox drawing is Rect.Left + 2,
         adding the extra spacing offsets this *)
         Inc(Width, GetSystemMetrics(SM_CYVTHUMB) +
           GetSystemMetrics(SM_CXVSCROLL));
       finally
         ReleaseDC(ComboBox.Handle, ComboBox.Canvas.Handle);
       end;
     finally
       DeleteObject(f);
     end;
   end;
 end;
 SendMessage(ComboBox.Handle, CB_SETDROPPEDWIDTH, Width, 0);
end;
 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多