如何建立象ComboBox的下拉窗一样的窗口?(100分)

  • 主题发起人 主题发起人 Randolph
  • 开始时间 开始时间
R

Randolph

Unregistered / Unconfirmed
GUEST, unregistred user!
就象RxLib的RxCalcEdit一样,
我希望:
1. 弹出窗口后父控制还有输入焦点, 如从
Edit控件弹出而Edit依然还能通过键盘输入;
2. 鼠标单击该窗口以外的任何地方(包括其它应
用程序的窗口)关闭该弹出式窗口.
 
自己做一个很容易, 直接将 TCombobox 从 StdCtrls.pas 中 Copy 出来, 将其
CNCommand 的部分改一下即可
 
为什么不分析以下RxLib的源程序
 
TComboBox是Windows的标准控件, 无法修改为我所需要的样式, 如果可以,
我想Rx也会这么做; 我尝试了分析Rx的源码, 如果象Rx的做法, 至少需要
链接上4个超过1000行的Rx程序, 我想知道的就是前面提到的两点, 我只想
知道是如何实现的.
 
有没有可能通过keypreview属性,让弹出的Form来接收任何信息,反送回parent的form中的指定控件。我没有试过。我的方法大致上是:
//手动创建,假设b为tb;
a:=a.create(b);

//a.onkeypress

tb(a.parent).XXXXX(sender,key);//xxxxx为calcedit的edit框的onkeypress
处理函数,如果没有处理函数,可以直接用tb(a.parent).caledit1.caption
:=caption+key;

高人如果看出错误,千万别笑,呵呵
 
答案就在Rxlib的源程序里,我刚作了一个,好像只用了很少的代码,你用Debug跟踪
一下Rxlib的源码就明白了,我从Rxlib源码中学了很多东西,很妙的!
最近很忙......
没时间详细解释.
 
请教huizhang:
如果我想做一个类似于office中选择线形的combobox,怎么做。
 
To lizhao:

TComboBox有一个OnDrawItem事件, 专门用来绘制用户自定义的Items:

TOwnerDrawState = set of (odSelected, odGrayed, odDisabled,
odChecked odFocused);
TDrawItemEvent = procedure(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState) of object;
根据所选的ItemIndex和当前的State, 在Rect的区域内在ComboBox的canvas上绘制
你所需要的线性.
 
to huizhang :
我搞不定。能否给个example.
 
to lizhao:

Supose you have the following LineTypes as ComboBox1's Items:
psClear, paSolid, psDash, psDot, psDashDot, paDashDotDot;
You can set ComboBox1.Style property to csOwnerDrawFixed.
After that, add the OnDrawItem event:

procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var halfH: integer;
procedure DrawItemLine(ps: TPenStyle);
begin
ComboBox1.Canvas.Pen.Style := ps;
ComboBox1.Canvas.MoveTo( Rect.Left + 2, halfH );
ComboBox1.Canvas.LineTo( Rect.Right - 2, halfH );
end;
begin
ComboBox1.Canvas.Brush.Style := bsClear;
if odFocused in State then
begin
ComboBox1.Canvas.Pen.Color := clBlue;
end else
begin
ComboBox1.Canvas.pen.Color := clWhite;
end;
ComboBox1.Canvas.pen.Style := psSolid;
ComboBox1.Canvas.Rectangle( Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
ComboBox1.Canvas.pen.Color := clBlack;
halfH := Rect.Top + ComboBox1.Height div 2 - 2;
case index of
0: ComboBox1.Canvas.TextOut( Rect.Left+2, Rect.Top+2, '无线形');
1: DrawItemLine(psSolid);
2: DrawItemLine(psDash);
3: DrawItemLine(psDot);
4: DrawItemLine(psDashDot);
5: DrawItemLine(psDashDotDot);
end;
end;

Have a go of it!
 
请接收答案或继续提问.
 
接受答案了.
 
后退
顶部