【问题标题】:TTrackBar > failed to paint background > How to fix?TTrackBar > 未能绘制背景 > 如何修复?
【发布时间】:2019-11-29 23:15:25
【问题描述】:

我的环境:Windows 10 v1903

使用TTrackBar,当我改变上面TTrackBar组件所在的TPanel的颜色时,颜色保持原来的颜色。

例如,当我将TPanel 的颜色从clBtnFace 更改为clWhite 时,TTrackBar 的颜色仍然是clBtnFace

更改TPanel 的颜色之前:

TPanel改变颜色后:

我尝试了以下代码,但没有成功。

__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    Panel1->ParentBackground = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    Panel1->Color = clWhite;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    Panel1->Color = clWhite;

    Panel1->Repaint();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
    Panel1->Color = clWhite;

    Panel1->Invalidate();
}

有解决这个问题的办法吗?

【问题讨论】:

  • 我本来希望 TrackBar1->Invalidate(或 Repaint 或 Update)修复它,但不,没有运气。直到我尝试了TrackBar1->SetFocus。去搞清楚!但是,滑块 bg 仍然是浅灰色的。顺便说一句,在带有 XE 7 的 Win 7 上测试
  • 所以,这并不特定于 Windows 10。感谢您提供的信息。
  • 改变TrackBar的大小也会强制重绘
  • @KeremD感谢您提供的信息。更改尺寸需要将尺寸更改回原始尺寸。所以我更喜欢使用 SetFocus() 代替。
  • 没问题。提示:通过更改大小来触发事件可以这样完成:trkPtr->Width++; trkPtr->Width--;,以备不时之需。

标签: c++builder c++builder-10.2-tokyo


【解决方案1】:

如果没有明确的解决方案,我可能会执行以下操作。

__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    Panel1->ParentBackground = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    Panel1->Color = clWhite;

    // Move focus to all of the TTrackBar
    //    Reason: Changing TPanel color does not change TTrackBar BGcolors
    for(int idx=0; idx < this->ComponentCount; idx++) {
        TComponent *cmpPtr = this->Components[idx];
        if (dynamic_cast<TTrackBar *>(cmpPtr) != NULL) {
            TTrackBar *trkPtr = (TTrackBar *)cmpPtr;
            trkPtr->SetFocus();
        }
    }

    // Set focus to myself (Button)
    if (Sender !=NULL) {
        TButton *btn = (TButton *)Sender;
        btn->SetFocus();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 2011-09-07
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    相关资源
    最近更新 更多