新的 VCL 组件 - 使用位图样式设计器添加样式

问题描述 投票:0回答:1

在 RAD Studio 12.2 C++Builder 中,我创建了一个名为

TGroupBoxE
的新组件,源自
TGroupBox
。它继承了
TGroupBox
的所有图形属性。 enter image description here

我希望新组件不使用

TGroupBox
样式,而是使用新的
TGroupBoxE
样式,我将使用位图样式设计器创建该样式。在位图样式设计器中,我加载并复制了
GroupBox (TSeStyleObject)
。我将其称为
GroupBoxE
并更改了渲染,使其不显示任何帧。 enter image description here

新组件在

Samples
类别中已正确定义,并且可以在应用程序中使用。

如何在

TSeStyleObject
组件中正确定义
TGroupBoxE
,使其不使用
TGroupBox
的视觉风格,而是使用我的无框架新设计?

#include <vcl.h>
#pragma hdrstop
#include "GroupBoxE.h"
#pragma package(smart_init)
//-----------------------GroupBoxE.cpp---------------------------------------
__fastcall TGroupBoxE::TGroupBoxE(TComponent* Owner)
    : TGroupBox(Owner)//, FFrameWidth(1), FCustomShowFrame(true)
{
}
//---------------------------------------------------------------------------
TRect __fastcall TGroupBoxE::GetClientRect()
{
    TRect Rect = TGroupBox::GetClientRect();
    if (Caption.IsEmpty())
    {
        int CaptionHeight = Canvas->TextHeight("A"); 
        Rect.Top -= CaptionHeight;  
    }
    return Rect;
}
//---------------------------------------------------------------------------
void __fastcall TGroupBoxE::WndProc(TMessage &Message)
{
    if (Message.Msg == WM_SIZE && FOnResize) FOnResize(this);
    TGroupBox::WndProc(Message);
}
//---------------------------------------------------------------------------
namespace Groupboxe
{
    void __fastcall PACKAGE Register()
    {
        TComponentClass classes[1] = {__classid(TGroupBoxE)};
        RegisterComponents(L"Samples", classes, 0);
    }
}
//---------------------------------------------------------------------------


//--------------------------------GroupBoxE.h--------------------------------
#ifndef GroupBoxEH
#define GroupBoxEH
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
//---------------------------------------------------------------------------
class PACKAGE TGroupBoxE : public TGroupBox
{
private:
    TNotifyEvent FOnResize; 
protected:
    virtual void __fastcall WndProc(TMessage &Message) override;
public:
    __fastcall TGroupBoxE(TComponent* Owner) override;
__published:
    virtual TRect __fastcall GetClientRect() override;
    __property TNotifyEvent OnResize = {read=FOnResize, write=FOnResize};
};
//---------------------------------------------------------------------------
#endif
c++ components c++builder vcl rad-studio
1个回答
0
投票

如果子类化 TGroupBox 的唯一原因是为其创建新样式,特别是不显示框架,那么为什么不将 ShowFrame 属性设置为 false 呢?

如果您的子类 GroupBox 中有其他功能,或者如果我误解了您的问题,那么我也会标记 Delphi,因为您将吸引更多的用户来使用 VCL 特定而不是 C++ 特定的东西。

(我希望我可以发表评论,但因为 SO 的工作方式是我必须生成足够的积分才能做到这一点,一种方法是提交答案。对我来说,发表评论比发表评论更困难,这似乎很奇怪提供答案。)

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.