调整组合框下拉宽度的大小

TComboBox组件将编辑框与可滚动的“选择”列表组合在一起。用户可以从列表中选择项目,也可以直接在编辑框中键入。...

TComboBox组件将编辑框与可滚动的“选择”列表组合在一起。用户可以从列表中选择项目,也可以直接在编辑框中键入。

Programming language

下拉列表

当组合框处于下拉状态时,Windows会绘制一个列表框类型的控件,以显示组合框项以供选择。

DropDownCount属性指定下拉列表中显示的最大项目数。

默认情况下,下拉列表的宽度等于组合框的宽度。

当项目的长度(字符串)超过组合框的宽度时,项目显示为截止!

TComboBox不提供设置其下拉列表宽度的方法:(

修复组合框下拉列表的宽度

我们可以通过向组合框发送特殊的Windows消息来设置下拉列表的宽度。该消息为CB_SETDROPPEDWIDTH,并发送组合框列表框的最小允许宽度(以像素为单位)。

要将下拉列表的大小硬编码为200像素,可以执行以下操作:

SendMessage(theComboBox.Handle, CB_SETDROPPEDWIDTH, 200, 0);

只有当您确定所有的ComboBox.Items都不超过200像素(绘制时)时,这才可以。

为了确保下拉列表始终显示足够宽,我们可以计算所需的宽度。

以下是获取下拉列表所需宽度并进行设置的函数:

procedure ComboBox_AutoWidth(const theComboBox: TCombobox); const HORIZONTAL_PADDING = 4; var itemsFullWidth: integer; idx: integer; itemWidth: integer; begin itemsFullWidth := 0; // get the max needed with of the items in dropdown state for idx := 0 to -1 + theComboBox.Items.Count do begin itemWidth := theComboBox.Canvas.TextWidth(theComboBox.Items[idx]); Inc(itemWidth, 2 * HORIZONTAL_PADDING); if (itemWidth > itemsFullWidth) then itemsFullWidth := itemWidth; end; // set the width of drop down if needed if (itemsFullWidth > theComboBox.Width) then begin //check if there would be a scroll bar if theComboBox.DropDownCount < theComboBox.Items.Count then itemsFullWidth := itemsFullWidth + GetSystemMetrics(SM_CXVSCROLL); SendMessage(theComboBox.Handle, CB_SETDROPPEDWIDTH, itemsFullWidth, 0); end; end;

最长字符串的宽度用于下拉列表的宽度。

何时调用ComboBox\u AutoWidth?如果预先填充项目列表(在设计时或创建表单时),则可以在表单的OnCreate事件处理程序中调用ComboBox\u AutoWidth过程。

如果动态更改组合框项目列表,则可以在OnDropDown事件处理程序内调用ComboBox_AutoWidth过程-当用户打开下拉列表时发生。

一个测试对于一个测试,我们在一个表单上有3个组合框。所有项目的文本宽度都大于实际组合框的宽度。第三个组合框位于窗体边框的右边缘附近。

在本例中,Items属性是预填充的-我们在表单的OnCreate事件处理程序中调用ComboBox_AutoWidth:

//Form's OnCreate procedure TForm.FormCreate(Sender: TObject); begin ComboBox_AutoWidth(ComboBox2); ComboBox_AutoWidth(ComboBox3); end;

我们还没有为Combobox1调用ComboBox\u AutoWidth来查看差异!

请注意,运行时,Combobox2的下拉列表将比Combobox2更宽。

“近右边缘放置”将切断整个下拉列表

对于位于右边缘附近的Combobox3,下拉列表被切断。

发送CB_SETDROPPEDWIDTH将始终将下拉列表框向右扩展。当组合框靠近右边缘时,将列表框向右扩展会导致列表框的显示被切断。

在这种情况下,我们需要以某种方式将列表框扩展到左侧,而不是右侧!

CB_SETDROPPEDWIDTH无法指定扩展列表框的方向(左或右)。

解决方案:wm_ctlcolorlistbox

就在要显示下拉列表时,Windows将WM_CTLCOLORLISTBOX消息发送到列表框的父窗口-我们的组合框。

能够为近右边缘组合框处理WM_CTLCOLORLISTBOX可以解决这个问题。

万能的WindowProcEverVCL控件公开WindowProc属性—响应发送给控件的消息的过程。我们可以使用WindowProc属性临时替换控件的窗口过程或将其子类化。

下面是我们为Combobox3修改的WindowProc(靠近右边缘的一个):

//modified ComboBox3 WindowProc procedure TForm.ComboBox3WindowProc(var Message: TMessage); var cr, lbr: TRect; begin //drawing the list box with combobox items if Message.Msg = WM_CTLCOLORLISTBOX then begin GetWindowRect(ComboBox3.Handle, cr); //list box rectangle GetWindowRect(Message.LParam, lbr); //move it to left to match right border if cr.Right <> lbr.Right then MoveWindow(Message.LParam, lbr.Left-(lbr.Right-clbr.Right), lbr.Top, lbr.Right-lbr.Left, lbr.Bottom-lbr.Top, True); end else ComboBox3WindowProcORIGINAL(Message); end;

如果我们的组合框接收到的消息是WM_CTLCOLORLISTBOX,那么我们会得到它窗口的矩形,我们也会得到要显示的列表框的矩形(GetWindowRect)。如果列表框看起来更向右-我们将其向左移动,使组合框和列表框的右边框相同。就这么简单:)

如果消息不是WM_CTLCOLORLISTBOX,我们只需调用组合框的原始消息处理过程(ComboBox3WindowProcORIGINAL)。

最后,如果我们正确设置了它(在表单的OnCreate事件处理程序中),所有这些都可以工作:

//Form's OnCreate procedure TForm.FormCreate(Sender: TObject); begin ComboBox_AutoWidth(ComboBox2); ComboBox_AutoWidth(ComboBox3); //attach modified/custom WindowProc for ComboBox3 ComboBox3WindowProcORIGINAL := ComboBox3.WindowProc; ComboBox3.WindowProc := ComboBox3WindowProc; end;

在表格声明中,我们有(全部):

type TForm = class(TForm) ComboBox1: TComboBox; ComboBox2: TComboBox; ComboBox3: TComboBox; procedure FormCreate(Sender: TObject); private ComboBox3WindowProcORIGINAL : TWndMethod; procedure ComboBox3WindowProc(var Message: TMessage); public { Public declarations } end;

就这样。全部处理:)

  • 发表于 2021-09-15 03:54
  • 阅读 ( 196 )
  • 分类:IT

你可能感兴趣的文章

如何在excel中管理列

... 更改列宽以自动调整内容 ...

  • 发布于 2021-03-11 21:49
  • 阅读 ( 194 )

7个excel打印技巧:如何分步打印电子表格

... 目前,我们的表中的每一行都可以通过调整每一列的宽度来整齐地格式化。然而,如果我们在电子表格中添加一列引号,情况就不会是这样了。 ...

  • 发布于 2021-03-16 11:55
  • 阅读 ( 184 )

如何用microsoftword轻松创建流程图

...后单击“网格线”复选框。网格帮助您对齐流程图符号并调整其大小,因为您可以将它们捕捉到网格线。 ...

  • 发布于 2021-03-18 09:47
  • 阅读 ( 269 )

为您的mac电脑提供8个省时的自动化工作流程

...它们运行的顺序放置它们。操作和变量具有可根据工作流调整的设置。 ...

  • 发布于 2021-03-22 08:58
  • 阅读 ( 357 )

如何在photoshop中正确调整图像大小

知道如何在Photoshop中调整图像大小是一项基本技能,无论你是否是摄影师都很有用。在本文中,我们将解释如何在不到五分钟内完成。 ...

  • 发布于 2021-03-24 00:27
  • 阅读 ( 200 )

使用microsoft powerpoint裁剪图像的3种方法

...示的裁剪按钮。边缘和角上的黑色裁剪控制柄允许您重新调整图像大小。 向内或向外拖动其中一个控制柄以裁剪图像。也可以在四条边上等距裁剪(按Ctrl+拖动角点控制柄)或在两条平行边上等距裁剪(按Ctrl+拖动...

  • 发布于 2021-03-24 14:12
  • 阅读 ( 184 )

如何调整任何设备上的图像大小

您可以学习的一个有用的图像编辑任务是如何调整图像的大小。尽管这是一件非常基本的事情,但它还是派上了用场。在许多情况下,您可能需要更改图像的大小。 ...

  • 发布于 2021-03-29 04:25
  • 阅读 ( 184 )

6个免费的在线工具,将照片组合在一起

...如果你喜欢。然后选择垂直或水平放置照片。接下来可以调整图像的大小。这使您可以放大较小的,裁剪最大的,或限制比例,如果你喜欢。 ...

  • 发布于 2021-03-30 16:00
  • 阅读 ( 301 )

如何在Windows10上使用paint 3d调整图像大小

如果你需要在windows10pc上执行一个简单的任务,比如调整图像大小,你不需要使用像Photoshop这样学习曲线陡峭的软件。您可以使用Microsoft Paint 3D来完成它。下面是如何完成的。 在Windows搜索栏中键入“Paint 3D”,然后从搜索结果...

  • 发布于 2021-04-01 17:14
  • 阅读 ( 164 )

如何使幻灯片垂直谷歌幻灯片

...是,不建议这样做,因为每张幻灯片上的内容都需要重新调整大小和位置。

  • 发布于 2021-04-02 19:33
  • 阅读 ( 144 )
skyj624787
skyj624787

0 篇文章

相关推荐