基于VS2010的单文档,开发电子白板。Unicode,静态库方式编译。下面依次介绍。
主页面
- 主窗口的画图菜单选项,点开之后,是各种工具。同时,右侧提供相同的图标工具,供快速使用。
- 主要功能有:铅笔、直线、矩形、椭圆、?(系统自带的帮助,需要调整一下位置)、橡皮、清除屏幕、画笔颜色设置、线型线宽设置。 视屏功能尚未开发。
- 主窗口底部,显示当前坐标,以及当前时间。
【画图】中有【截图】功能,用于截取整个屏幕,保存为*.jpg图片。这个没有添加快捷键。
可以设置线宽和线型,线型有预览功能,需要注意的是,C++的线型,只有当线宽为1个像素点时,才会起作用。
可以设置橡皮的尺寸。
选择画笔颜色
当选中某个功能时,【画图】中的选项会被打钩,工具栏会选中状态。
项目创建过程
打开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
写在最后,有一个问题,没有解决,就是窗口发生重绘的时候,写的内容就不见了,如果需要保存,那么建议截图。后面完善之后,再更新。