【问题标题】:Working with Bitmaps in WxWidgets在 WxWidgets 中使用位图
【发布时间】:2014-02-22 17:50:41
【问题描述】:

我正在阅读的“Cross-Platform GUI Programming with wxWidgets”一书中给出了以下代码:

BEGIN_EVENT_TABLE(MyWindow, wxWindow)
  EVT_ERASE_BACKGROUND(MyWindow::OnErase)
END_EVENT_TABLE()

void MyWindow::OnErase(wxEraseEvent& event)
{
    wxClientDC* clientDC = NULL;
    if (!event.GetDC())
        clientDC = new wxClientDC(this);

    wxDC* dc = clientDC ? clientDC : event.GetDC() ;

    wxSize sz = GetClientSize();
    wxEffects effects;
    effects.TileBitmap(wxRect(0, 0, sz.x, sz.y), *dc, m_bitmap);

    if (clientDC)
        delete clientDC;
}

这段代码没有显示如何加载位图,所以在谷歌上搜索后我想出了:

wxBitmap m_bitmap;
bool result = m_bitmap.LoadFile("D:\image.png", wxBITMAP_TYPE_PNG);

但这会返回一个布尔结果false,这意味着函数LoadFile 加载文件失败。我也尝试过加载 BMP 文件,但也失败了。

我遇到的另一个问题是 wxEffects 被编译器警告标记为已弃用。

【问题讨论】:

    标签: c++ windows bitmap wxwidgets


    【解决方案1】:

    您需要注册 PNG 图像处理程序才能加载 PNG 位图。最简单的方法是在应用程序初始化期间的某个时间点调用 wxInitAllImageHandlers() 函数,例如在您覆盖的MyApp::OnInit() 中。

    至于wxEffects 被弃用,这只是因为这本书比较老,而且从那时起很多事情都发生了变化。如果您使用的是 wxWidgets 3.0,我强烈建议您阅读overview of important changes。如果你不这样做,我建议你更强大地使用它。

    【讨论】:

    • 你能评论一下为什么MyApp::OnInit() 是一个覆盖函数吗?例如。即使我删除了virtual,该程序似乎仍然可以正常工作。
    • 这是 C++,virtual 是可选的。如果可以的话,我确实建议使用 C++11 override
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 2011-12-23
    • 2011-05-02
    • 2011-07-17
    相关资源
    最近更新 更多