首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Delphi7中制作TPageControl平台

在Delphi7中制作TPageControl平台
EN

Stack Overflow用户
提问于 2009-06-26 13:08:22
回答 3查看 10.3K关注 0票数 8

我不知道这个问题能否在这里得到回答,但我希望它能回答。我用Delphi 7编写了一个简单的文本编辑器,它是我在Windows下编写C代码的主要IDE。我在VM中运行Windows,我需要一些轻松的东西。在任何情况下,它都使用一个TpageControl,每当您打开或创建一个新文件时,它都会获得一个新的选项卡。相当标准的。现在,Delphi下的TPageControl没有平坦的属性。

,不,我不是指将选项卡样式设置为tsButtons或tsFlatButtons

边框不能设置为"none“,当您在选项卡控件中添加文本编辑器时,边框看起来非常糟糕。

有办法把TpageControl弄平吗?

编辑

在一个支持平面的开源PageControl上,我发现如下所示:

代码语言:javascript
复制
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;

问题是,当我在主应用程序上尝试类似的东西时,它将无法工作。它甚至不会编译。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-06-26 14:38:06

当将选项卡绘制为按钮时,不会在显示区域周围绘制边框,因此将Style属性设置为tsButtonstsFlatButtons。(对于非VCL程序员,这相当于在选项卡控件中包含tcs_Buttons窗口样式。)

另一种选择是使用TNotebook。它有很多页,但它根本不画任何东西。您必须自己提供选项卡,例如设置选项卡控件的高度等于制表符的高度,或者使用TTabSet。(TTabSet在Delphi2005中提供;我不确定Delphi7。)

关于您找到的代码,如果您说明了它为什么不编译,或者您给出了找到它的链接,这将是有帮助的,因为我认为编译错误是因为它引用的是自定义类的字段或属性,而不是股票类。下面是您可以尝试将其放入您自己的代码中的内容,而不必编写自定义控件。

以您的形式做两个新的声明,如下所示:

代码语言:javascript
复制
FOldTabProc: TWndMethod;
procedure TabWndProc(var Msg: TMessage);

在表单的OnCreate事件处理程序中,将该方法分配给页控件的WindowProc属性:

代码语言:javascript
复制
FOldTabProc := PageControl1.WindowProc;
PageControl1.WindowProc := TabWndProc;

现在实现该方法并处理tcm_AdjustRect消息:

代码语言:javascript
复制
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变得更大一些,并掩盖边界。

票数 13
EN

Stack Overflow用户

发布于 2015-10-14 14:11:29

我使用的是德尔菲XE8,下面的工具似乎能做到这一点:

代码语言:javascript
复制
ATabControl.Tabs.Clear;
ATabControl.Style := TTabStyle.tsFlatButtons;
ATabControl.Brush.Color := clWhite;
票数 2
EN

Stack Overflow用户

发布于 2013-05-09 08:53:29

删除两个TPageControls,一个选项卡作为Tabs,其全局高度等于制表符,另一个选项卡的平面按钮和Tabvisible属性设置为false,这将在第一个选项卡下对齐。然后确保第一个TPagecontrol上的选项卡更改,使制表符在第二个选项卡中也发生变化。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1049033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档