wxWidgets:定期在wxFrame中重新绘制图像
wxWidgets: Periodically redraw image in wxFrame
我有一个MainFrame,为了设置背景图像,我实现了自己的OnPaint()
函数。
OnPaint(wxPaintEvent& roEvent)
{
if (!m_oBackgorund1.IsOk() || !m_oBackgorund2.IsOk())
return;
wxPaintDC paintDC(this);
switch (roEvent.GetId())
{
case 0:
paintDC.DrawBitmap(m_oBackgorund1, 0, 0);
break;
default:
paintDC.DrawBitmap(m_oBackgorund2, 0, 0);
break;
}
}
先前已正确加载了这两个位图。启动我的应用程序时,图像m_oBackgorund2
被设置为背景,因为事件的GetId()
返回-201。
之后,我启动一个线程,该线程以0
或1
作为Id 来触发事件
{
nId = !nId;
wxPaintEvent oPaintEvent;
oPaintEvent.SetId(nId);
wxPostEvent(GetParent(), oPaintEvent);
}
OnPaint
由该事件调用correnty,位图根据Id设置。但是,更改不会显示在UI中。如果我在OnPaint()
中调用Refresh()
,则背景图像被绘制为其他图像。
如何更新wxFrame
的Backgorund图像而不让它覆盖所有其他UI元素?
谢谢!
你需要改变你的方法,因为你所做的不会奏效。
基本问题是,您不能从自己的代码中发布绘制事件(或底层GUI层处理的任何其他事件)。这些事件是由您自己使用的GUI库(即Windows、GTK+或Cocoa)生成的,窗口在获得它们时必须重新绘制,但人为创建这些事件不会使窗口重新绘制。唯一的方法是在其上调用Refresh()
,而Refresh()
与所有GUI函数一样,只能从主GUI线程调用。
因此,如果你真的想使用线程(对于你正在做的事情,计时器似乎是一个更自然的选择),你必须向主线程发布一个自定义事件,然后刷新窗口,然后重新绘制自己。
相关文章:
- QuadTree只在窗口的右上角绘制
- 绘制旋转的三角形
- flutter:即使shouldRepaint()返回true,自定义画家也不会重新绘制
- 如何在QT中的自定义视频小工具t上绘制矩形
- 如何在Visual Basic中使用矩形函数OpenGL绘制矩形
- 无法使用VAO和EBO(openGL)绘制多个对象
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- 绘制顺时针三角形,重新排序点
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- SFML 文本未绘制在窗口上
- 如何在快板的屏幕中显示子位图的绘制?
- 如何绘制自定义形状的元素?
- QPainter 将 QBrush 设置为 在 QT/C++ 中绘制文本
- 除非重新绘制大小,否则SDL_Texture在调整大小后呈现黑色
- C++ WinApi 绘制图像.jpg到新窗口
- 如何获取绘制点的新坐标
- 如果新图像中的原始像素为黑色,则Qt绘制一个蓝色像素
- 在 OpenGL 中每帧绘制新的全屏图像的最快方法是什么?
- MFC在最大化窗口处绘制新窗口
- 如何编辑SFML源代码来添加一个新的可绘制对象