我不知道这个问题是否可以在这里得到解答,但我希望能解决。 我在Delphi 7中编写了一个简单的文本编辑器,它是我在Windows下编写C代码的主要IDE。我在VM中运行Windows,我需要一些简单的东西。 在任何情况下,它都使用TpageControl,只要您打开或创建新文件,它就会获得一个新选项卡。很标准。 现在,Delphi下的TPageControl没有平面属性。
不,我不是指将标签样式设置为tsButtons或tsFlatButtons
边框不能设置为“none”,当您将文本编辑器添加到选项卡控件时,它看起来非常糟糕。
有没有办法让TpageControl保持平稳?
修改:
在支持平板的开源页面控件上,我发现了:
procedure TCustomTabExtControl.WndProc(var Message: TMessage);
begin
if(Message.Msg=TCM_ADJUSTRECT) and (FFlat) then
begin
Inherited WndProc(Message);
Case TAbPosition of
tpTop : begin
PRect(Message.LParam)^.Left:=0;
PRect(Message.LParam)^.Right:=ClientWidth;
PRect(Message.LParam)^.Top:=PRect(Message.LParam)^.Top-4;
PRect(Message.LParam)^.Bottom:=ClientHeight;
end;
tpLeft : begin
PRect(Message.LParam)^.Top:=0;
PRect(Message.LParam)^.Right:=ClientWidth;
PRect(Message.LParam)^.Left:=PRect(Message.LParam)^.Left-4;
PRect(Message.LParam)^.Bottom:=ClientHeight;
end;
tpBottom : begin
PRect(Message.LParam)^.Left:=0;
PRect(Message.LParam)^.Right:=ClientWidth;
PRect(Message.LParam)^.Bottom:=PRect(Message.LParam)^.Bottom-4;
PRect(Message.LParam)^.Top:=0;
end;
tpRight : begin
PRect(Message.LParam)^.Top:=0;
PRect(Message.LParam)^.Left:=0;
PRect(Message.LParam)^.Right:=PRect(Message.LParam)^.Right-4;
PRect(Message.LParam)^.Bottom:=ClientHeight;
end;
end;
end else Inherited WndProc(Message);
end;
事情是,当我在主应用程序上尝试类似的东西时,它将无法工作。它甚至不会编译。
答案 0 :(得分:12)
当选项卡绘制为按钮时,显示区域周围不会绘制边框,因此请将Style
属性设置为tsButtons
或tsFlatButtons
。 (对于非VCL程序员,这相当于在选项卡控件上包含tcs_Buttons
窗口样式。)
另一种方法是使用TNotebook
。它拥有页面,但它根本不做任何绘画。您必须自己提供标签,例如将标签控件的高度设置为等于标签的高度,或者使用TTabSet
。 (TTabSet
在Delphi 2005中可用;我不确定Delphi 7。)
关于你找到的代码,如果你指出它为什么不编译,或者你给了你找到它的链接,那将会很有帮助,因为我认为编译错误是因为它引用了字段或属性自定义类而不是库存类。以下是您可以尝试将其放入自己的代码中,而无需编写自定义控件。
在您的表单中添加两个新声明,如下所示:
FOldTabProc: TWndMethod;
procedure TabWndProc(var Msg: TMessage);
在表单的OnCreate
事件处理程序中,将该方法分配给页面控件的WindowProc
属性:
FOldTabProc := PageControl1.WindowProc;
PageControl1.WindowProc := TabWndProc;
现在实现该方法并处理tcm_AdjustRect
消息:
procedure TForm1.TabWndProc(var Msg: TMessage);
begin
FOldTabProc(Msg);
if Msg.Msg = tcm_AdjustRect then begin
case PageControl1.TabPosition of
tpTop: begin
PRect(Msg.LParam)^.Left := 0;
PRect(Msg.LParam)^.Right := PageControl1.ClientWidth;
Dec(PRect(Msg.LParam)^.Top, 4);
PRect(Msg.LParam)^.Bottom := PageControl1.ClientHeight;
end;
end;
end;
end;
如果需要,您可以填写其他三种情况。 Tcm_AdjustRect
是在 CommCtrl 单元中声明的消息标识符。如果您在该单元中没有该消息,请自行声明;它的价值是4904。
我怀疑这并不能阻止控件绘制边框。相反,它会使包含的TTabSheet
增大一点并覆盖边界。
答案 1 :(得分:2)
您可以随时使用商业解决方案。我强烈推荐Raize components,它支持带标签的平面TPageControls。组件集非常易于使用,并支持许多视觉增强功能,在我看来,这些增强功能可以为任何应用程序提供更好的感觉。
(来源:raize.com)
答案 2 :(得分:1)
删除两个TPageControl
,一个标签为Tab
,全局高度等于标签,一个平面按钮和Tabvisible
属性设置为false,这将是在第一个下对齐。然后确保第一个TPagecontrol
上的标签更改使标签也在第二个标签中更改。
答案 3 :(得分:0)
我正在使用Delphi XE8,以下似乎可以解决这个问题:
ATabControl.Tabs.Clear;
ATabControl.Style := TTabStyle.tsFlatButtons;
ATabControl.Brush.Color := clWhite;