C++開發電子白板

基於VS2010的單文檔,開發電子白板。Unicode,靜態庫方式編譯。下面依次介紹。

主頁面

  1. 主窗口的畫圖菜單選項,點開之後,是各種工具。同時,右側提供相同的圖標工具,供快速使用。
  2. 主要功能有:鉛筆、直線、矩形、橢圓、?(系統自帶的幫助,需要調整一下位置)、橡皮、清除屏幕、畫筆顏色設置、線型線寬設置。 視屏功能尚未開發。 
  3. 主窗口底部,顯示當前座標,以及當前時間。

【畫圖】中有【截圖】功能,用於截取整個屏幕,保存爲*.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

寫在最後,有一個問題,沒有解決,就是窗口發生重繪的時候,寫的內容就不見了,如果需要保存,那麼建議截圖。後面完善之後,再更新。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章