请各位支招:重新定位,画一个ComboBox的下拉框!(100分)

  • 主题发起人 主题发起人 白衣书生
  • 开始时间 开始时间

白衣书生

Unregistered / Unconfirmed
GUEST, unregistred user!
窗体上有一个ComboBox1,设其DropDownCount属性为40,然后将其Items中添加40条数据。
当运行时鼠标点击ComboBox1,在ComboBox1下面会出现“一个下拉框”并显示40条数据,这是标准的Windows显示方法。

由于40条数据的下拉框在ComboBox1下面,太长了,现在我想调整这个“下拉框”出现的位置:
使这个下拉框位置整体向上位移,在ComboBox1上面的部分包含20条数据,
在ComboBox1下面的位置包含20数据,
而ComboBox1正好处于“下拉框高度的中间”的位置。

这样的“下拉框”应该怎么让Windows画出?? 请各位支招! 谢谢!
 
做一个隐藏的ListBox放在Combox的上面盖住它,当点击Combox时就显示,选择数据后就隐藏
 
to takashiki:
我说的40条数据是个概数,有可能是20条也有可能是60条。
所以你说的方法不通用。
 
刚才研究了一下VCL,显示"下拉框"的处理过程是这个TCustomCombo.AdjustDropDown,想办法弄到FDropHandle就可以达到我们的目的了
吃饭去了,闪人[:)]
 
procedure TForm1.ComboBox1DropDown(Sender: TObject);
var
df :integer;
begin
df := ComboBox1.Items.Count;
ComboBox1.DropDownCount := df div 2;
ComboBox1.ItemIndex := df div 4;
end;
希望可以实现
 
那还不如就做一个编辑框旁边放一个按钮,然后点击按钮时弹出一个窗体,在dbgrid里显示这样来得方便一些,且界面还多简洁一些吧。要不,重画的话,影响到上下的控件不是不方便 吗?
 
pihome说得对,因为TCustomCombo->TCustomComboBox->TComboBox 而下边的这三个HWND全是Protected的所以..
FEditHandle: HWnd;//在ComboBox里边可以输入文字的地方,
FListHandle: HWnd;
FDropHandle: HWnd;

implement
TComboCrack = class(TCustomCombo);
具体调位置的代码请参考AdjustDropDown
 
to pihome,zjan521:
还得麻烦您二位了!
我看过AdjustDropDown这个函数了。可还是一头雾水。
 
pihome,zjan521二位,
如果如你们所说从TCustomCombo继承下来,combox是TComboBox,怎么用TCustomCombo里protected的方法,如果真要用AdjustDropDown方法,估计只有自制一个控件了,从TCustomCombo继承下来,

楼主的想法,实现起来比较麻烦,可以另外想个办法,一般常规操作,对于这种数据较多的情况,不用combox,而用buttonedit,通过按钮,弹出窗体,进行选择,这样操作简单、明了,实现起来也容易
 
多谢楼上指点。

不过看VCL中,AdjustDropDown是这样声明的:
procedure AdjustDropDown; virtual;
 
to scorpious 看我的最后一行代码
我的意思不是要你调用他 而是参考他是如何调节的 你可以在其他合适的地方进行调节
 
你的要求太怪了(会遮盖住ComboBox),不过是可以实现的,
写一个控件, override AdjustDropDown 就可以

 
你看看TDBGrid就知道了,他好象是用TListBox画的。
 
好象只有自定义一个类来做了。
楼主可以参考TDBGrid的做法,它用的是一个edit(TInplaceEditList, 在Grids单元定义的),实际做法是一个edit,在其右边画一个按纽,在按下按纽时弹出一个继承自TCustomListBox的ListBox。如果你想实现你的要求(正好处于“下拉框高度的中间”的位置)仅仅需要确定弹出的ListBox的高,宽,Top,Left等。

仅供参考~~
 
你可以用CB_GETCOMBOBOXINFO消息或GetComboBoxInfo函数取得下拉框的窗口句柄(COMBOBOXINFO.hwndList),然后在OnDropDown事件中调整其位置即可(SetWindowPos)。
 
示例
procedure TForm1.Button1Click(Sender: TObject);
const
PIXEL_WIDTH = 200;
begin
ComboBox1.Perform(CB_SETDROPPEDWIDTH, PIXEL_WIDTH, 0);
end;
 
cf_zj:
thanks,but I want to change the height and position,not the width!

to AGUI:
thanks! I try it!
 
xyf2001721
这位老兄,你的办法我用了,可以实现,但是一直没明白你的最后一行是做什么用的
ComboBox1.DropDownCount := df div 2; //最好把df div 2 改成 1 否则无法实现需要的功能
ComboBox1.ItemIndex := df div 4;// 我没有明白他在里面起到的作用
不好意思,能解答一下吗?
 
后退
顶部