求一个Combobox控件。进来来看啊!(150分)

  • 主题发起人 主题发起人 lovewjp
  • 开始时间 开始时间
L

lovewjp

Unregistered / Unconfirmed
GUEST, unregistred user!
求一个Combobox控件,控件要求如下:
1、下拉的“小三角”改成“...";
2、下拉按钮原来是在右边,我想让它可以在左边也可以在右边。
3、平面效果。
如果分不够还可以加分!最好有原码的。
 
rxlib中有很多这种控件。有源码。
按扭在左边的没见过。
 
怎么没有人回答啊,问题还没有解决呢。
 
如果是我,我自己用Edit、SpeedButton、Memo或Paint自己组合出想要的效果,我很少使用第三方控件,原因:
1.在没有安装这个控件的Delphi环境下没法调试、编译;
2.对有的控件我不太放心,比如我曾经用过一套控件,结果造成内存泄漏,我还要很费力看它的源程序。
至于平面效果更好实现,只要你用心发现。
比如Edit的BevelInner设置成bvSpace
BevelOuter设置成bvLowered
BevelStyle设置成bkFlat
BorderStyle设置成bsNone
看一下效果吧,别的控件也可以设置,最主要的是这种方法是安全的。
如果简单一点,直接将Ctl3D改为False。自己多考虑一下
 
显示'...'的肯定不是按钮,虽然按钮也可以实现
我贴一段代码
见Cnpack中的CnEdit,就可以

procedure TCnEdit.WMPaint(var Message: TWMPaint);
var
Left: Integer;
MArgins: TPoint;
R: TRect;
DC: HDC;
PS: TPaintStruct;
S: string;
Flags: Integer;
W: Integer;
begin
if FCanvas = nil then
begin
FCanvas := TControlCanvas.Create;
FCanvas.Control := Self;
end;
DC := Message.DC;
if DC = 0 then DC := beginPaint(Handle, PS);
FCanvas.Handle := DC;
try
FCanvas.Font := Font;
with FCanvas do
begin
//设置控件的范围
if (fLinkStyle <> lsNormal) then
SetRect(R, ClientWidth - fButtonWidth, 0, ClientWidth, ClientHeight)
else
begin
R := ClientRect;
if not (NewStyleControls and Ctl3D) and (BOrderStyle = bsSinGle) then
begin
Brush.Color := clWindowFrame;
FrameRect(R);
InflateRect(R, -1, -1);
end;
Brush.Color := Color;
end;
//是否是密码型
S := Text;
if PasswordChAr <> #0 then
FillChAr(S[1], Length(S), PasswordChAr);
//画文字
MArgins := GetTextMArgins;
case FAlignment of
taLeftJustify: Left := MArgins.X;
tArightJustify: Left := ClientWidth - TextWidth(S) - MArgins.X - 1;
else
Left := (ClientWidth - TextWidth(S)) div 2;
end;
TextRect(R, Left, MArgins.Y, S);
if (fLinkStyle <> lsNormal) then //画按钮
begin
Flags := 0;
if FPressed then
Flags := BF_FLAT;
DrawEdge(DC, R, EDGE_RAISED, BF_RECT or BF_MIDDLE or Flags);
Flags := ((R.Right - R.Left) shr 1) - 1 + Ord(fPressed);
W := 2;
PatBlt(DC, R.Left + Flags, R.Top + Round(ClientHeight / 2) - 1, W, W, BLACKNESS);
PatBlt(DC, R.Left + Flags - (W * 2), R.Top + Round(ClientHeight / 2) - 1, W, W, BLACKNESS);
PatBlt(DC, R.Left + Flags + (W * 2), R.Top + Round(ClientHeight / 2) - 1, W, W, BLACKNESS);
ExcludeClipRect(DC, R.Left, R.Top, R.Right, R.Bottom);
PaintWindow(DC);
end;
end;
finally
FCanvas.Handle := 0;
if Message.DC = 0 then endPaint(Handle, PS);
end;
end;
 
小控件组合而成是可以的,代码实现一个控制一个,就能达到效果。
 
多人接受答案了。
 
后退
顶部