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