【问题标题】:TFrame overriding style colorTFrame 覆盖样式颜色
【发布时间】:2021-12-11 07:34:48
【问题描述】:

我有一个框架,颜色为 clSkyBlue,它位于一个应用程序中,其中包含面板和各种颜色为 clSkyBlue 的东西。 该程序使用 TStyleManager 将颜色设置为当前样式。 (即 windows10、windows10 暗等)。 问题是样式管理器中的所有颜色都设置了正确的颜色,但仍然是 clSkyBlue 的框架除外。

如何强制框架遵循当前选择的样式?

//in the main form code
void __fastcall TMainFormUnit::FormCreate(TObject *Sender)
{
...
  for (int i = 0; i < TStyleManager::StyleNames.Length; i++)
    cbxVclStyles->Items->Add(TStyleManager::StyleNames[i]);
    TStyleManager::TrySetStyle(TStyleManager::StyleNames[1]);
...
}

//---------------------------------------------------------------------------
void __fastcall TMainFormUnit::cbxVclStylesChange(TObject *Sender)
{
  TStyleManager::SetStyle(cbxVclStyles->Text);
}

【问题讨论】:

    标签: c++builder vcl vcl-styles tframe


    【解决方案1】:

    如果您需要 TFrame 在父组件更改时更改外观,请相应地设置其属性:

    ParentBackground = True
    ParentColor = True
    

    这也会将其Color 设置回clBtnFace

    我还建议不要在 C++ 中使用 FormCreate 事件。使用构造函数:

    __fastcall TMainFormUnit::TMainFormUnit(TComponent* Owner)
        : TForm(Owner)
    {
        cbxVclStyles->Items->AddStrings(TStyleManager::StyleNames);
    }
    //---------------------------------------------------------------------------
    void __fastcall TMainFormUnit::cbxVclStylesChange(TObject *Sender)
    {
        TStyleManager::TrySetStyle(static_cast<TComboBox*>(Sender)->Text);
    }
    

    【讨论】:

    • 感谢您解决了颜色问题。是否有理由使用构造函数而不是表单创建。我原以为表单创建是从构造函数中调用的。
    • @iplayfast 太好了,不客气!文档中有关于OnCreate 的注释:“在 C++ 代码中不鼓励使用 OnCreate 事件,因为它可能与表单的构造函数交互不良(请参阅 OldCreateOrder)。建议您改写表单构造函数."
    • 这样颜色问题就解决了,但是还有其他形式留下的伪影。我认为这是由于双重缓冲拾取错误的形式,但我似乎无法让它始终正确。 (相同的框架代码,仅使用构造函数而不是表单创建)
    • @iplayfast 你有没有把整个项目中的所有OnCreate 处理程序都替换为构造函数?如果你不能让它工作,你可能需要创建一个新问题来详细描述这个问题。我自己没有得到任何奇怪的文物。
    • 只有一个 OnCreate,所以不是这样。该项目基于 TSplitter 演示,并且拆分信息似乎显示在卡片上。
    猜你喜欢
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 2016-11-08
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    相关资源
    最近更新 更多