wxWidget入门(八)

这一期讲一讲wxBitmap位图相关操作

  1. 打开图片文件,并显示出来
  2. 画出图形
  3. 利用鼠标画画,(初代版本,后续更新更实用的方法)

①引入一个wxBufferedDC类,简而言之是一个画画类,看下图继承关系

与wxDC不同的是,wxBufferedDC使用了“双缓冲技术”,将读取的图片信息保存到内存中在统一写到界面上,防止在重绘过程中出现闪屏现象。

wxWidget入门(八)_第1张图片

#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、发现问题:

会出现明显断断续续的点,很不美观,不实用。后续会介绍实用的方法。

 

欢迎大家在评论区留言

你可能感兴趣的:(wxWidgets学习笔记)