我正努力在跨平台C ++应用程序中获取X11重绘事件。
一切都在Windows上运行得很好(我只需要在需要重绘窗口的时候发出一些InvalidateRect
次调用),但在Linux上我一直在重绘口吃(可能是我发送了太多的重绘事件,如下所示)
event.type = Expose;
event.xexpose.window = window;
XSendEvent(display, window, False, ExposureMask, &event);
当我调整窗口大小时也是如此。
这是我使用
的代码void Window::redraw() { // Called by any control which needs redrawing
XEvent event;
memset(&event, 0, sizeof(event));
event.type = Expose;
event.xexpose.display = display;
XSendEvent(display, window, False, ExposureMask, &event);
}
void Window::resize(int width, int height) {
this->Width = width;
this->Height = height;
}
bool Window::wndProc(XEvent *evt) {
switch (evt->type) {
case Expose: {
if (evt->xexpose.count == 0) { // handle last one only
if (Width != Bitmap.width() || Height != Bitmap.height())
Bitmap.resize(Width, Height);
Renderer.drawOnBitmap(Bitmap);
this->paint();
}
return true;
} break;
case ConfigureNotify: {
this->resize(evt->xconfigure.width, evt->xconfigure.height);
redraw();
return true;
} break;
}
}
void Window::paint() {
XImage image;
sk_bzero(&image, sizeof(image));
// .. boilerplate to initialize XImage...
XInitImage(&image);
XPutImage(display, window, fGc, &image,
0, 0,
0, 0,
Width, Height);
}
我尝试了几种方法来解决这个问题,包括:
不幸的是,我有动画控件,只要他们需要重新绘制窗口的一部分(我分别处理窗口的绘制区域),就会调用redraw()
。
如何在调整大小和重绘过多事件的同时解决口吃问题,同时确保我的动画控件保持平滑?