You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用wxWidgets开发贪吃蛇游戏时绘图功能无法正常工作的问题

问题原因

你当前的代码将wxEVT_PAINT事件绑定到了wxFrame上,但你在Frame内部创建了一个wxPanel控件——Panel会默认填满整个Frame的客户区,完全覆盖Frame的绘制区域,导致你在Frame的DC上绘制的内容被Panel遮挡,无法显示。

解决方案

把绘制事件绑定到wxPanel上,并且在绘制时使用Panel的DC,同时设置Panel的背景色(避免默认白色覆盖你的绘制内容)。

修改步骤

  1. 调整事件绑定:将wxEVT_PAINT的绑定对象从this(Frame)改为panel
  2. 修正绘制DC的关联对象:在OnPaint中使用Panel作为wxBufferedPaintDC的参数
  3. 设置Panel背景色:在CreateControls中给Panel设置和Frame一致的背景色

修改后的关键代码

1. 事件绑定部分

void Snake::BindEventHandlers()
{
    panel->Bind(wxEVT_KEY_DOWN, &Snake::OnKeyPressed, this);
    panel->Bind(wxEVT_PAINT, &Snake::OnPaint, this); // 改为绑定到panel
}

2. 控件创建部分

void Snake::CreateControls()
{
    panel = new wxPanel(this);
    SetBackgroundColour(wxColour(38, 36, 40));
    panel->SetBackgroundColour(wxColour(38, 36, 40)); // 添加Panel背景色设置
}

3. 绘制函数部分

void Snake::OnPaint(wxPaintEvent& event)
{
    wxBufferedPaintDC dc(panel); // 这里改为传入panel

    // 原有绘制代码保持不变
    dc.DrawText(wxT("Testing"), 40, 60);

    dc.SetBrush(*wxGREEN_BRUSH);
    dc.SetPen(wxPen(wxColor(255, 0, 0), 5));
    dc.DrawCircle(wxPoint(200, 100), 25);

    dc.SetBrush(*wxBLUE_BRUSH);
    dc.SetPen(wxPen(wxColor(255, 175, 175), 10));
    dc.DrawRectangle(300, 100, 400, 200);

    dc.SetPen(wxPen(wxColor(0, 0, 0), 3));
    dc.DrawLine(300, 100, 700, 300);
}

另外,关于你代码里的疑问//why did this-> not work? learn hiearchy? because frame did not work?:wxFrame默认不会接收键盘事件,因为它不是焦点控件,而wxPanel作为子控件可以获得焦点,所以绑定到Panel上才能捕获键盘事件,这部分你的做法是对的。

内容的提问来源于stack exchange,提问作者user26867085

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 10:05:20