C++开发电子白板

基于VS2010的单文档,开发电子白板。Unicode,静态库方式编译。下面依次介绍。

主页面

  1. 主窗口的画图菜单选项,点开之后,是各种工具。同时,右侧提供相同的图标工具,供快速使用。
  2. 主要功能有:铅笔、直线、矩形、椭圆、?(系统自带的帮助,需要调整一下位置)、橡皮、清除屏幕、画笔颜色设置、线型线宽设置。 视屏功能尚未开发。 
  3. 主窗口底部,显示当前坐标,以及当前时间。

【画图】中有【截图】功能,用于截取整个屏幕,保存为*.jpg图片。这个没有添加快捷键。 

 

可以设置线宽和线型,线型有预览功能,需要注意的是,C++的线型,只有当线宽为1个像素点时,才会起作用。

可以设置橡皮的尺寸。

选择画笔颜色

当选中某个功能时,【画图】中的选项会被打钩,工具栏会选中状态。

扫描二维码关注公众号,回复: 10848098 查看本文章

项目创建过程

打开VS2010,创建单文档应用程序,设置为Unicode编码,静态编译方式。

1、在MainFrm.cpp中,更改一下单文档名字

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
    ...
    // TODO: 在此处通过修改

	// 改变标题
	cs.style &=~FWS_ADDTOTITLE;// 对后面的参数取反,然后与,然后才能对cs的成员变量进行更改
	cs.lpszName = L"电子白板";
}

2、为单文档添加时间信息

在MainFrm.h头文件中,先添加一个变量

public:
    CMFCStatusBar     m_wndStatusBar;// 主窗口状态栏对象

在.cpp文件中,的OnCreate()  函数中,添加时间信息。

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    ...
    // 
    //设置定时器
	SetTimer(1, 1000, NULL);

	// 获取系统时间
	CTime t = CTime::GetCurrentTime();
	CString str = t.Format("%H:%M:%S");
	m_wndStatusBar.SetPaneText(1, str);

    return 0;
}

并添加定时器函数, 在类向导中的消息,添加消息响应函数。

// 显示当前时间
void CMainFrame::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	CTime t = CTime::GetCurrentTime();
	CString str = t.Format("%H:%M:%S");
	m_wndStatusBar.SetPaneText(1, str);

	CFrameWndEx::OnTimer(nIDEvent);
}

3、添加菜单,并设置每个按钮的ID,并右键添加消息响应函数,在视类中添加。如下:

public:
	afx_msg void OnDrawPen();
	afx_msg void OnDrawLine();
	afx_msg void OnDrawRectangle();// 矩形
	afx_msg void OnDrawEllipse();
	afx_msg void OnDrawEraser();

4、添加变量,用来存储,是哪种类型的画笔,并且是否处于画图状态。

    // 1-铅笔,2-直线,3-矩形,4-椭圆,5-橡皮,6-保存截图形状
	int m_nDrawType;
	// 线型
	int m_nLineStyle;
	// 线宽
	UINT m_nLineWidth;
	// 颜色
	COLORREF m_clr;
	// 橡皮尺寸
	UINT m_nEraserSize;

5、所有的绘画,都在视类窗口中,都需要三个消息响应函数,鼠标左键按下,鼠标左键弹起,坐标移动。 在视类中,右键添加这三个消息响应函数。

6、 View.h的头文件中,添加如下变量。

对这三个函数进行编辑,当鼠标按下时,记录为起点,当鼠标弹起时,记录为终点,然后进行绘制。铅笔、橡皮需要时刻记录鼠标的移动,所以就需要将终点复制给起点,然后再获取下一个点。只是橡皮用的是背景色。

这里先设置一个绘图类型变量,然后设置一个是否处于绘图状态的变量,然后再填充各个函数。

public:
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
	afx_msg void OnMouseMove(UINT nFlags, CPoint point);
public:
	CPoint m_ptOrigin;// 原点
	bool m_bDraw;		// 处于画图状态

7、在View.cpp中,为各个函数添加消息响应。

void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if (m_nDrawType < 6)// 仅1-5可用。当有线型的时候,才开始绘制
	{
		m_bDraw = true;
		m_ptOrigin = point;// 保存原点
	}

	CScrollView::OnLButtonDown(nFlags, point);
}


void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CClientDC dc(this);
	CPen pen(m_nLineStyle, m_nLineWidth, m_clr);//PS_SOLID, ,RGB(255, 0, 0)// 设置线条颜色
	dc.SelectObject(&pen);
	CBrush *pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));// 透明画刷,矩形和椭圆是透明的
	dc.SelectObject(pBrush);


	switch(m_nDrawType)
	{
	case 1:
		m_bDraw = 0;
		break;
	case 2:
		dc.MoveTo(m_ptOrigin);
		dc.LineTo(point);
		m_bDraw = 0;
		break;
	case 3:
		dc.Rectangle(CRect(m_ptOrigin, point));
		m_bDraw = 0;
		break;
	case 4:
		dc.Ellipse(CRect(m_ptOrigin, point));
		m_bDraw = 0;
		break;
	case 5:
		m_bDraw = 0;
		break;
 	case 6:	
 		m_bDraw = 0;
		break;
	default:
		m_bDraw = 0;
		break;
	}


	// 用bitmap填充一块矩形区域
// 	CBitmap bitmap;
// 	bitmap.LoadBitmap(IDB_BITMAP1);
// 	CBrush brush(&bitmap);
// 	CClientDC dc(this);
// 	CRect rect(m_ptOrigin, point);
// 	dc.FillRect(rect, &brush);


	CScrollView::OnLButtonUp(nFlags, point);
}


void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CClientDC dc(this);
	CPen pen(m_nLineStyle, m_nLineWidth, m_clr);//(PS_SOLID, 1, RGB(255, 0, 255));
	CPen *oldPen = dc.SelectObject(&pen);

	COLORREF erase = GetBkColor(dc);// 调用白色背景
	//COLORREF erase = GetSysColor(COLOR_BTNFACE);
	CPen pen2(PS_SOLID, m_nEraserSize, erase);
	CBrush brush(erase);

	if (m_bDraw)
	{
		switch(m_nDrawType)
		{
		case 1:
 			dc.MoveTo(m_ptOrigin);
			dc.LineTo(point);
			m_ptOrigin = point;
			break;
		case 5:
			dc.SelectObject(&pen2);
			dc.SelectObject(&brush);
 			dc.MoveTo(m_ptOrigin);
 			dc.LineTo(point);
			m_ptOrigin = point;
			break;
		default:
			break;
		}
	}

	dc.SelectObject(oldPen);

	// 在状态栏显示坐标信息,最底部显示坐标信息
	CString str;
	str.Format(L"x=%d  y=%d", point.x, point.y);
	//((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);// 方式一
	((CMainFrame*)GetParent())->SetMessageText(str);// 方式二
	

	CScrollView::OnMouseMove(nFlags, point);
}

先整理到这里吧,需要的可以直接下载。

https://download.csdn.net/download/qq_34732729/12330515

写在最后,有一个问题,没有解决,就是窗口发生重绘的时候,写的内容就不见了,如果需要保存,那么建议截图。后面完善之后,再更新。

发布了417 篇原创文章 · 获赞 156 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_34732729/article/details/105549644