gpt4 book ai didi

delphi - 创建一个包含一个或多个分隔项的组合框?

转载 作者:行者123 更新时间:2023-12-03 15:57:29 25 4
gpt4 key购买 nike

我正在使用 Delphi7,我想要一个带有分隔符项目的组合框(就像在弹出菜单中一样)。

我已经在 Mozilla Sunbird(我知道,它不是 Delphi...)中看到了这个完美的实现,方法如下:

  1. 分隔项是一条简单的灰线绘制在项目的中心

  2. 如果将鼠标悬停在分隔符上鼠标,选择不出现

  3. 如果用户单击分隔符,它也没有被选择并且组合框没有特写。

没有。 1可以使用DrawItem来实现。没有第二名我也能活下去,因为我对此一无所知。

对于第三点,我请求你的帮助。我发现关闭后 CBN_CLOSEUP 消息会立即发送到组合框。

我考虑过 Hook 窗口过程,如果 CBN_CLOSEUP 被发送到某个组合框,则对其进行反击。但我不确定这是否是最好的解决方案,或者也许还有其他更优雅的方法?

无论解决方案是什么,我都希望有一个标准的 ComboBox,它可以正确支持 WinXP/Vista/7 主题。

谢谢!

<小时/>

编辑:有关工作组件,请参阅此线程:

Can you help translating this very small C++ component to Delphi?

最佳答案

我尝试制作不可点击的分隔符项目(如 this answer 中所述)并遇到了几个 UI 故障。问题是组合框的行为有几个方面很难完全正确:

  • 当列表下拉时,按向上和向下箭头键可在列表中导航。
  • 按 Enter 键可关闭下拉列表,选择当前项目。
  • 按 Esc 键可关闭下拉列表,选择当前项目(如果当前项目是使用向上和向下箭头键选择的)或最后选择的项目。
  • 如果组合框获得焦点,则按向上和向下箭头键可更改当前选择而不显示列表。
  • 如果组合框具有焦点,则键入任何内容都会选择与所键入内容匹配的组合框项目。
  • 如果组合框获得焦点,则按 F4 会下拉组合框列表,然后可以通过键盘或鼠标控制。

确保禁用的分隔符项目不响应任何这些事件(加上我可能缺少的任何其他事件,例如屏幕阅读器?)似乎充满了错误。

相反,我使用的方法是将分隔符绘制为项目的一部分:

  1. 使用可变高度所有者绘制组合框。
  2. 为任何需要分隔符的项目添加 3 个像素的高度。
  3. 在需要分隔符的每个项目的顶部画一条水平线。

这里有一些 C++Builder 代码来完成这个任务;将其翻译为 Delphi 应该很容易。

void __fastcall TForm1::ComboBox1DrawItem(TWinControl *Control,
int Index, TRect &Rect, TOwnerDrawState State)
{
bool draw_separator = NeedsSeparator(Index) &&
!State.Contains(odComboBoxEdit);

TCanvas *canvas = dynamic_cast<TCustomCombo*>(Control)->Canvas;
canvas->FillRect(Rect);

TRect text_rect = Rect;
// Add space for separator if needed.
if (draw_separator) {
text_rect.Top += 3;
}

canvas->TextOut(text_rect.Left + 3,
(text_rect.Top + text_rect.Bottom) / 2 -
canvas->TextHeight(ComboBox1->Items->Strings[Index]) / 2),
ComboBox1->Items->Strings[Index]);

// Draw a separator line above the item if needed.
if (draw_separator) {
canvas->Pen->Color = canvas->Font->Color;
canvas->MoveTo(Rect.Left, Rect.Top + 1);
canvas->LineTo(Rect.Right, Rect.Top + 1);
}
}

void __fastcall TForm1::ComboBox1MeasureItem(
TWinControl * /* Control */, int Index, int &Height)
{
Height = ComboBox1->ItemHeight;

// Add space for the separator if needed.
if (Index != -1 && NeedsSeparator(Index)) {
Height += 3;
}
}

关于delphi - 创建一个包含一个或多个分隔项的组合框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4354891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com