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;