liang_tiantian 2024-05-05 17:36 采纳率: 0%
浏览 6
已结题

wxWidgets wxWebview EVT_PAINT

wxWidgets中, wxFrame界面内包含了多个wxPanel,其中一个wxPanel内实例化wxWebview对象。其他有自定义的按钮控件,自定义的背景控件。目前遇到的问题是:wxWebview一旦实例化。自定义的对象
BEGIN_EVENT_TABLE(ACStaticBoxBuffered, wxWindow)

EVT_PAINT(ACStaticBoxBuffered::paintEvent)
EVT_SIZE(ACStaticBoxBuffered::onSizeChanged)

END_EVENT_TABLE()
只要在同一个wxPanel的对象有做静态映射的 EVT_PAINT 画笔事件都会被调用,导致main线程cpu爆满。有尝试过在wxWebview的父对象容器wxPanel阻止事件,但是其他自定义控件还是接收到了画笔事件。 这个需要如何操作才能让wxWebview正常运行,运行的界面是一个websocker的视频界面。视频刷新的时候cpu需要正常。 目前如果wxWebview在一个wxDialog内实例化的就没有这个问题。

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-05 17:36
    关注

    引自免费微信小程序:皆我百晓生

    为了解决您的问题,您需要确保只有正确的控件处理EVT_PAINT事件。这可以通过修改ACStaticBoxBuffered类中的paintEvent方法来实现。您可以添加一个条件检查,判断当前正在绘制的是不是来自wxWebView的事件。如果是,那么就忽略这个事件。下面是修改后的代码示例:

    #include <wx/wx.h>
    
    class ACStaticBoxBuffered : public wxWindow {
    public:
        ACStaticBoxBuffered(wxWindow *parent, const wxPoint& pos, const wxSize& size)
            : wxWindow(parent, wxID_ANY, pos, size) {}
    
    protected:
        void paintEvent(wxPaintEvent &event) override {
            if (event.GetEventObject() != this) { // 检查是否是由wxWebView触发的事件
                return; // 如果是,忽略此事件
            }
    
            // 继续执行正常的绘画逻辑
            wxPaintDC dc(this);
            // ... 在这里添加您的绘图代码 ...
        }
    
    private:
        DECLARE_EVENT_TABLE()
    };
    
    wxBEGIN_EVENT_TABLE(ACStaticBoxBuffered, wxWindow)
        EVT_PAINT(ACStaticBoxBuffered::paintEvent)
        EVT_SIZE(ACStaticBoxBuffered::onSizeChanged)
    wxEND_EVENT_TABLE()
    

    这段代码首先创建了一个名为ACStaticBoxBuffered的新窗口类,并覆盖了其paintEvent函数。在这个新版本的paintEvent中,我们添加了一个检查,判断传入的wxPaintEvent的源对象(即触发事件的控件)是否与当前对象相同。如果不是,说明事件可能来自wxWebView,此时我们直接返回,不执行任何绘图操作。

    这样,当wxWebView进行重绘时,它将不会影响到ACStaticBoxBufferedpaintEvent,从而减少CPU占用。同时,其他自定义控件的绘图事件将继续正常工作。

    注意:确保您已经正确设置了wxWebview的父容器(wxPanel),并且在wxPanel的构造函数中包含以下代码,以防止事件传播:

    SetDoubleBuffered(true); // 如果尚未设置
    Bind(wxEVT_ERASE_BACKGROUND, &YourPanelClass::OnEraseBackground, this); // 可能需要实现OnEraseBackground函数来阻止默认背景清除
    

    这可以避免不必要的背景重绘,进一步降低CPU占用。如果您还没有实现OnEraseBackground函数,可以参考下面的示例:

    void YourPanelClass::OnEraseBackground(wxEraseEvent& event)
    {
        event.Skip(); // 让底层窗口处理背景擦除
    }
    

    请将YourPanelClass替换为您的实际面板类名称。通过这些调整,应该可以解决您的问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月7日
  • 创建了问题 5月5日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见