wxEffects 未定义
wxEffects is undefined
我有 MSVC++ 15 和 wxwidgets-3.1.0。我正在关注这本书Cross-Platform GUI Programming with wxWidgets (2005)。我卡在第 5 章中的这段代码 "Drawing and Printing":
#include <wx/effects.h>
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;
}
当我编译上面的代码时出现错误:Identifier "wxEffects" is undefined
.
似乎 wxEffects
已从 wxWidgets 的默认构建中删除,但没有为 TileBitmap
功能添加任何替代品。
如果您自己构建 wxWidgets,那么您可以通过执行 2.8 兼容性构建来启用它(在构建之前编辑 include/wx/msw/setup.h
)。
但是,如果您只是使用 wxWidgets headers 和预编译库,那么可以选择放入您自己的此函数版本。源代码是 here,因此您可以从中复制整个 bool wxEffectsImpl::TileBitmap
并将其复制到您的程序中,删除 wxEffectsImpl::
并确保您获得正确的 headers包括。
其中一个 sample apps 具有以下可能适合您的简化版本:
bool TileBitmap(const wxRect& rect, wxDC& dc, wxBitmap& bitmap)
{
int w = bitmap.GetWidth();
int h = bitmap.GetHeight();
int i, j;
for (i = rect.x; i < rect.x + rect.width; i += w)
{
for (j = rect.y; j < rect.y + rect.height; j+= h)
dc.DrawBitmap(bitmap, i, j);
}
return true;
}
示例实际上将其设为MyApp
的成员,但您不必这样做,只需将其复制到您需要的.cpp
文件中并直接调用即可。
M.M的回答已经很不错了。但这是使用点画笔而不是手动重复绘制位图来执行 TileBitmap 功能的第二种方法。
bool TileBitmap(const wxRect& rect, wxDC& dc, wxBitmap& bitmap)
{
wxBrush brush(bitmap);
wxDCBrushChanger bc(dc, brush);
wxDCPenChanger pc(dc, *wxTRANSPARENT_PEN);
dc.DrawRectangle(rect);
return true;
}
我有 MSVC++ 15 和 wxwidgets-3.1.0。我正在关注这本书Cross-Platform GUI Programming with wxWidgets (2005)。我卡在第 5 章中的这段代码 "Drawing and Printing":
#include <wx/effects.h>
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;
}
当我编译上面的代码时出现错误:Identifier "wxEffects" is undefined
.
似乎 wxEffects
已从 wxWidgets 的默认构建中删除,但没有为 TileBitmap
功能添加任何替代品。
如果您自己构建 wxWidgets,那么您可以通过执行 2.8 兼容性构建来启用它(在构建之前编辑 include/wx/msw/setup.h
)。
但是,如果您只是使用 wxWidgets headers 和预编译库,那么可以选择放入您自己的此函数版本。源代码是 here,因此您可以从中复制整个 bool wxEffectsImpl::TileBitmap
并将其复制到您的程序中,删除 wxEffectsImpl::
并确保您获得正确的 headers包括。
其中一个 sample apps 具有以下可能适合您的简化版本:
bool TileBitmap(const wxRect& rect, wxDC& dc, wxBitmap& bitmap)
{
int w = bitmap.GetWidth();
int h = bitmap.GetHeight();
int i, j;
for (i = rect.x; i < rect.x + rect.width; i += w)
{
for (j = rect.y; j < rect.y + rect.height; j+= h)
dc.DrawBitmap(bitmap, i, j);
}
return true;
}
示例实际上将其设为MyApp
的成员,但您不必这样做,只需将其复制到您需要的.cpp
文件中并直接调用即可。
M.M的回答已经很不错了。但这是使用点画笔而不是手动重复绘制位图来执行 TileBitmap 功能的第二种方法。
bool TileBitmap(const wxRect& rect, wxDC& dc, wxBitmap& bitmap)
{
wxBrush brush(bitmap);
wxDCBrushChanger bc(dc, brush);
wxDCPenChanger pc(dc, *wxTRANSPARENT_PEN);
dc.DrawRectangle(rect);
return true;
}