这是来自TForm
的图片,我的顶部有TEdit
而下边有TComboBox
。
如您所见,TEdit没有Windows控件默认主题的经典3D边框。那是因为我将该组件的Ctl3D property
设置为False
。然后您会看到TComboBox具有正常的3D边框,但在这种情况下,我还将该组件的Ctl3D property
设置为False
,但它会继续显示3D边框。
它似乎是开发级别的Delphi错误。我怎么能在代码中修复它?
在测试RRUZ答案BevelKind=bkFlat
之后,这来了:
我不知道为什么它如此不同......而且奇怪。 : - /
答案 0 :(得分:8)
答案 1 :(得分:1)
我找到了它:
我们必须设置:
BevelInner
至bvNone
;
BevelKind
至bkFlat
;
BevelOuter
至bvSpace
。
答案 2 :(得分:0)
这是支持BidiMode
并调整大小的最佳方式;并且可以用客户端颜色填充边框:
TTestComboBox=class(TComboBox)
protected
procedure WMPaint(var Msg: TMessage); message WM_Paint;
End;
Procedure TTestComboBox.WMPaint(var Msg: TMessage);
var MCanvas: TControlCanvas;
R: TRect;
Begin
inherited;
MCanvas:=TControlCanvas.Create;
Try
MCanvas.Control:=Self;
With MCanvas do begin
R:=ClientRect;
Brush.Style:= bsClear;
Pen.Color:= Color;
Pen.Width:= 3;
if BiDiMode in [bdRightToLeft, bdRightToLeftNoAlign] then begin
if Style = csSimple then //remove border and space
Rectangle(1, 1, R.Width - 1, R.Height-1) else Rectangle(-1, 1, R.Width, R.Height-1);
if Style in [csDropDown, csOwnerDrawFixed, csOwnerDrawVariable] then begin
Pen.Width:= 5; //remove space btw editor and button
MoveTo(18, 0);
LineTo(18, R.Height-1);
end;
end else begin
if Style = csSimple then
Rectangle(1, 1, r.Width - 1, R.Height-1) else Rectangle(1, 1, r.Width + 1, R.Height-1);
if Style in [csDropDown, csOwnerDrawFixed, csOwnerDrawVariable] then begin
Pen.Width:= 5;
MoveTo(R.Width - 18, 0);
LineTo(R.Width - 18, R.Height-1);
end;
end;
end;
finally
MCanvas.Free;
End;
End;