c++ - 使用 Visual C++ 的窗口窗体应用程序中的 Sleep()

标签 c++ winforms visual-c++ c++11

我的问题与 Visual C++ 中的 Window Form ApplicationSystem::Threading::Thread::Sleep(int delayTime) 有关.

我的窗体有一个面板,其中有 3 个 ovalShape,分别命名为 ovalShape1、ovalShape2 和 ovalShape3。按钮名称按钮位于面板旁边。按钮与点击事件相关联。我需要的是当我点击按钮时,每 1 秒(1000 毫秒)后每个椭圆形的颜色都会变为红色。 这就是我所做的:

private: System::Void buttonClick(System::Object^  sender, System::EventArgs^  e) {

    this->ovalShape1->FillColor = System::Drawing::Color::Red;
    System::Threading::Thread::Sleep(1000);
    this->ovalShape1->FillColor = System::Drawing::Color::White;


    this->ovalShape2->FillColor = System::Drawing::Color::Red;
    System::Threading::Thread::Sleep(1000);
    this->ovalShape2->FillColor = System::Drawing::Color::White;

    this->ovalShape3->FillColor = System::Drawing::Color::Red;
    System::Threading::Thread::Sleep(1000);
    this->ovalShape3->FillColor = System::Drawing::Color::White;

}

但由于某种原因(我不知道),该应用程序没有按我预期的方式运行。 ovalShape1 只是闪烁而已。

也许你知道原因!

如有任何帮助或建议,我们将不胜感激!

最佳答案

这是因为 Windows UI 绘图优化。设置椭圆的填充颜色时:

  • 新颜色存储在 FillColor 属性中
  • 计划在您的处理完成后进行重绘。

因此,您修改了三次 FillColor 并为椭圆安排了三次重绘。然后您的代码完成,椭圆最终被重新绘制。

您必须在更改其颜色后调用 ovalShape.Refresh() 以强制重绘该控件。

关于c++ - 使用 Visual C++ 的窗口窗体应用程序中的 Sleep(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20836777/

相关文章:

c++ - 具有在参数中返回指针的函数的智能指针

c++ - 在 C++ 中将字符串转换为罗马数字

c# - 在 VS 调试器中运行时出现带有 ChromiumFX "failed to establish GPU channel"错误的 CEF

C++ 对象被向上转换为基类;不能调用派生方法

c++ - 使用初始化列表初始化包含 const 数组的结构

c++ - 模板类类型仅适用于基本类型,不适用于类类型

c# - 冗余设置控件属性有任何开销吗?

c# - 我的应用程序不会在 .net 2.0 下运行,适用于 3.5

visual-studio-2010 - 安装 Visual Studio 2010(任何版本)只会在 C++ 头文件目录中安装 2 个文件

c++ - 可以通过 C++ 流工具更改文件扩展名吗?