这一期讲一讲wxBitmap位图相关操作
①引入一个wxBufferedDC类,简而言之是一个画画类,看下图继承关系
与wxDC不同的是,wxBufferedDC使用了“双缓冲技术”,将读取的图片信息保存到内存中在统一写到界面上,防止在重绘过程中出现闪屏现象。
#include
#include
class MyFrame : public wxFrame
{
public:
MyFrame(const wxString & title);
void OnPaint(wxPaintEvent &event);//利用重绘函数画出图像
private:
wxBitmap bitmap; //wx位图类
};
MyFrame::MyFrame(const wxString & title)
:wxFrame(NULL, -1, title, wxDefaultPosition, wxSize(700,1050))
{
bitmap.LoadFile(wxT("timg.bmp"), wxBITMAP_TYPE_BMP);//加载图片 并设置是bmp格式
Connect(wxEVT_PAINT,wxPaintEventHandler(MyFrame::OnPaint));//连接重绘函数
}
void MyFrame::OnPaint(wxPaintEvent &event)
{
if(bitmap.Ok())//读取正常
{
wxBufferedPaintDC dc(this,bitmap);
dc.DrawBitmap(bitmap, 0, 0, true);
}
}
/加载xpm文件 除了LoadFile
wxIcon icon(wxT("icon.xpm"),wxBITMAP_TYPE_XPM);
iconmap.CopyFromIcon(icon);
如果不出意外你会发现只能显示bmp格式的图片
这就需要加上一句话(加在构造里面开头第一句就行),其实我也找了挺久。
初始化所有可用的图片格式,这样其他格式就可以用了。。。
wxInitAllImageHandlers();
对于将图片画在屏幕上还可以使用如下方式
利用wxMemoryDC内存设备上下文,也可以实现双缓冲
其中blit函数放在SelectObject(wxNullBitmap)前面
DrawBitmap函数放在SelectObject(wxNullBitmap)后面,两者作用一样,
不同的是blit可以指定画的大小,即部分重绘。
void MyFrame::OnPaint(wxPaintEvent &event)
{
if(bitmap.Ok() && iconmap.Ok())
{
wxClientDC destDC(this);
wxMemoryDC memDC; //内存设备上下文
memDC.SelectObject(bitmap); //绑定对象
destDC.Blit(100,100, //设置重绘起始坐标
bitmap.GetWidth(), bitmap.GetHeight(),
&memDC,
0,0,
wxCOPY,
true);//放在SelectObject(wxNullBitmap)前面
memDC.SelectObject(wxNullBitmap); //解除绑定
destDC.DrawBitmap(bitmap, 200, 200, true);//放在SelectObject(wxNullBitmap)后面才行
}
}
②画出图形
void MyFrame::OnPaint(wxPaintEvent &event)
{
wxBufferedPaintDC dc(this);//双缓冲
dc.SetBrush(*wxWHITE_BRUSH);//设置白色背景刷
dc.Clear();//刷新背景颜色
int width = size.GetWidth();
int height = size.GetHeight();
dc.SetPen(wxPen(*wxWHITE, 5));//设置画笔颜色(白色),和画笔粗细(5)
dc.SetBrush(*wxBLACK_BRUSH);//设置填充颜色
dc.DrawCircle(width /2 , height / 2, 50);//画一个圆形
}
③利用鼠标画画,这里介绍的方法是根据获取鼠标移动过程中,捕捉到的点画出轨迹
1、首先连接相应事件
Connect(wxEVT_MOTION, wxMouseEventHandler(MyFrame::OnMotion));
2、事件函数
void MyFrame::OnMotion(wxMouseEvent &event)
{
if(event.Dragging())//如果是发生拖拉事件
{
wxClientDC dc(this);
wxPen pen(*wxRED, 1); //设置画笔颜色(红色),画笔粗细(1)
dc.SetPen(pen); //绑定画笔
dc.DrawPoint(event.GetPosition()); //绘制捕捉到的点
dc.SetPen(wxNullPen); //解绑
}
}
3、发现问题:
会出现明显断断续续的点,很不美观,不实用。后续会介绍实用的方法。
欢迎大家在评论区留言