如何修复TComboBox Ctl3D属性错误?

时间:2012-10-08 20:03:36

标签: delphi interface combobox delphi-2006

这是来自TForm的图片,我的顶部有TEdit而下边有TComboBox

enter image description here

如您所见,TEdit没有Windows控件默认主题的经典3D边框。那是因为我将该组件的Ctl3D property设置为False。然后您会看到TComboBox具有正常的3D边框,但在这种情况下,我还将该组件的Ctl3D property设置为False,但它会继续显示3D边框。

它似乎是开发级别的Delphi错误。我怎么能在代码中修复它?


在测试RRUZ答案BevelKind=bkFlat之后,这来了:

enter image description here

我不知道为什么它如此不同......而且奇怪。 : - /

3 个答案:

答案 0 :(得分:8)

您可以移除3D边框,将BevelKindTComboBox属性设置为bkFlat

enter image description here

答案 1 :(得分:1)

我找到了它:

我们必须设置:

BevelInnerbvNone;

BevelKindbkFlat;

BevelOuterbvSpace

答案 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;