关于ComboBox下拉菜单

魔术猫 2009-07-28 12:55:44
呵呵,不好意思 BCB没有学好,遇到一个小问题

我设置了 ComboBox 的style是 csOwnerDrawVariable , 同时 DropDownCount=12
然后在 MeasureItem 事件中 写入程序
if( Index>-1) Height=24 ;

结果当程序运行后我点击 ComboBox 控件时,下拉菜单变成了单行显示,真是奇怪啊

希望大家能帮帮忙
...全文
274 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
魔术猫 2009-07-30
  • 打赏
  • 举报
回复
ccrun

太强大了,非常感谢!
ccrun.com 2009-07-30
  • 打赏
  • 举报
回复
void __fastcall TForm1::FormCreate(TObject *Sender)
{
ComboBox1->Style = csOwnerDrawVariable;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ComboBox1MeasureItem(TWinControl *Control,
int Index, int &Height)
{
if (Index > -1) Height = 24;
}
//---------------------------------------------------------------------------
//
void __fastcall TForm1::ComboBox1DrawItem(TWinControl *Control, int Index,
TRect &Rect, TOwnerDrawState State)
{
TComboBox *cbx = dynamic_cast <TComboBox *> (Control);

// 填充背景,当前选择的行高亮
cbx->Canvas->Brush->Color = State.Contains(odSelected)? clHighlight: cbx->Color;
cbx->Canvas->FillRect(Rect);

// 字体颜色,可随意设置
cbx->Canvas->Font->Color = clBlack;

// 当前行的文本
String strText = cbx->Items->Strings[Index];

// 绘制文本的区域,左边略留一些空间
RECT rct(Rect);
rct.left += 2;

// 绘制文本,垂直居中
::DrawText(cbx->Canvas->Handle, strText.c_str(), strText.Length(), &rct, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
}
ccrun.com 2009-07-29
  • 打赏
  • 举报
回复
OnDrawItem不需要任何代码就可以实现增大行距,只需设置以下属性就行了:
ComboBox1->Style = csOwnerDrawVariable; // 或 csOwnerDrawFixed
ComboBox1->ItemHeight = 24;


另外,既然你每一行都24像素高,也就无需在OnMeasureItem事件中写代码了。

不过,由于字体高度相对较小,24像素的行高,显示的字体靠上,不太美观。可以根据需求在OnDrawItem中擦除行背景后重新绘制一下。
魔术猫 2009-07-29
  • 打赏
  • 举报
回复
感谢大家的关注
1,ComboBox的Items里有数据,5行数据
2,OnDrawItem 事件中应该添加什么代码呢?
3,Height=24 的目的就是嫌默认的 Height 的值不够,觉得太挤了,所以想增大行间距

谢谢
魔术猫 2009-07-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ccrun 的回复:]
OnDrawItem不需要任何代码就可以实现增大行距,只需设置以下属性就行了:
C/C++ codeComboBox1->Style= csOwnerDrawVariable;// 或 csOwnerDrawFixedComboBox1->ItemHeight=24;
...
[/Quote]

我在设置 ComboBox1->ItemHeight = 24; 之后,居然连 ComboBox1->Height 也 > 24 了。这不是我要的效果,
我要的效果是: ComboBox1->Height =22 ; ComboBox1->ItemHeight = 24;

谢谢
fairchild811 2009-07-28
  • 打赏
  • 举报
回复
是不是24太大了,挡住了其他的,item的内容显示正确吗?
ccrun.com 2009-07-28
  • 打赏
  • 举报
回复
是否添加了自画(OnDrawItem)的代码?要注意每一行文字绘制时的坐标,每一行的Rect.Top是不同的值。
Waiting4you 2009-07-28
  • 打赏
  • 举报
回复
ComboBox的Items里有数据吗?

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧