您的位置:首页 > 编程语言 > Delphi

delphi自动调整combobox下拉列表宽度(PostMessage CB_SETDROPPEDWIDTH)

2017-07-24 19:46 357 查看
在combobox所在的窗口的Formshow事件里调用即可

[delphi] view plain copy

procedure SetComboBoxListWidth( AComboBox: TComboBox );

var

i: Integer;

nMaxLen, nMinWidth: integer;

nFontWidth: Integer;

nCboLeft: integer;

ctlCustom: TControl;

begin

nCboLeft := AComboBox.Left;

ctlCustom := AComboBox;

with AComboBox do

begin

nFontWidth := Round( Abs(Font.Height / 2 ) );

nMaxLen:= 0;

for i:=0 to Items.Count-1 do

begin

if length(Items[i])* nFontWidth > nMaxLen then

nMaxlen:= length(Items[i])* nFontWidth+5;

end;

if Items.Count > DropDownCount then

nMaxLen := nMaxLen + 20;

if nMaxLen > Width then

begin

if Items.Count>DropDownCount then

begin

SendMessage( Handle, CB_SETHORIZONTALEXTENT, nMaxLen+5, 0 );

{解决分辨率小导致的ComboboxList的宽度超出屏幕}

//while 部分是用来取出combobox控件相对与窗体的横坐标

while not (ctlCustom.Parent is TForm) do

begin

nCboLeft := nCboLeft + ctlCustom.Parent.Left;

ctlCustom := ctlCustom.Parent;

end;

nMinWidth := Min(400, nMaxLen); // 使用不大于nMaxLen的数做比较

if (nCboLeft + nMinWidth) > Screen.Width-25 then // 不超出屏幕,并保留窗口滚动条宽度,约25

nMinWidth := Screen.Width-25-nCboLeft;

nMinWidth := Max(nMinWidth, Width); // 不小于控件自身宽度

PostMessage(Handle, CB_SETDROPPEDWIDTH, nMinWidth, 0);

end

else

PostMessage(Handle, CB_SETDROPPEDWIDTH, nMaxLen , 0);

ShowHint := True;

end

else

begin

SendMessage( Handle, CB_SETHORIZONTALEXTENT, 0, 0 );

PostMessage(Handle, CB_SETDROPPEDWIDTH, Width , 0);

end;

end;

end;
http://blog.csdn.net/youthon/article/details/8179348
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: