要求建立MFC单文档类应用程序,实现SDK、CDC、CWindowDC、彩色线条、矩形、棋盘的绘制

1.SDK全局函数实现画线

void COOPEx5View::OnLButtonDown(UINT nFlags, CPoint point)	///起点
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	UpdateData(true);

	m_point = point;///保存起点位置

	CView::OnLButtonDown(nFlags, point);
}


void COOPEx5View::OnLButtonUp(UINT nFlags, CPoint point)	///终点
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	//利用SDK全局函数实现画线
	HDC hdc;
	hdc = ::GetDC(m_hWnd);	 ///m_hWnd 是 类或者对象标识自己的句柄
	MoveToEx(hdc, m_point.x, m_point.y, NULL);	//移动到线条的起点位置
	LineTo(hdc, point.x, point.y);	///划线
	::ReleaseDC(m_hWnd, hdc);		//释放DC,全局函数

	CView::OnLButtonUp(nFlags, point);
}

2.CDC类实现画线

void COOPEx5View::OnLButtonDown(UINT nFlags, CPoint point)	///起点
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	UpdateData(true);

	m_point = point;///保存起点位置

	CView::OnLButtonDown(nFlags, point);
}

void COOPEx5View::OnLButtonUp(UINT nFlags, CPoint point)	///终点
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	///利用CDC类实现画线
	CDC* pDC = GetDC();
	pDC->MoveTo(m_point);		//起点
	pDC->LineTo(point);	//划线,终点
	ReleaseDC(pDC);

	CView::OnLButtonUp(nFlags, point);
}

3.CWindowDC实现整个窗口画线

void COOPEx5View::OnLButtonDown(UINT nFlags, CPoint point)	///起点
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	UpdateData(true);

	m_point = point;///保存起点位置

	CView::OnLButtonDown(nFlags, point);
}

void COOPEx5View::OnLButtonUp(UINT nFlags, CPoint point)	///终点
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	//利用CWindowDC画线 整个窗口
	CWindowDC dc(GetParent());
	dc.MoveTo(m_point);
	dc.LineTo(point);

	CView::OnLButtonUp(nFlags, point);
}

4.CDC实现彩色线条绘制

void COOPEx5View::OnLButtonDown(UINT nFlags, CPoint point)	///起点
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	UpdateData(true);

	m_point = point;///保存起点位置

	CView::OnLButtonDown(nFlags, point);
}

void COOPEx5View::OnLButtonUp(UINT nFlags, CPoint point)	///终点
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	///彩色
	CPen pen(PS_SOLID, 1, RGB(255, 0, 0));	//创建DC   CPen pen(int 线型, int 粗细, COLORREF 颜色) PS_SOLID 实线  PS_DASH 虚线  PS_DASHDOTDOT 双线
	CClientDC dc(this);	//GDI对象选入DC    
	CPen* pOldPen = dc.SelectObject(&pen);	//移动起点    
	dc.MoveTo(m_point);	//画线     
	dc.LineTo(point);	//还原DC
	dc.SelectObject(pOldPen);

	CView::OnLButtonUp(nFlags, point);
}

5.使用画刷绘制矩形

void COOPEx5View::OnLButtonDown(UINT nFlags, CPoint point)	///起点
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	UpdateData(true);

	m_point = point;///保存起点位置

	CView::OnLButtonDown(nFlags, point);
}

void COOPEx5View::OnLButtonUp(UINT nFlags, CPoint point)	///终点
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	///矩形
	CBrush brush(RGB(255, 0, 0));	///创建彩色画刷
	CClientDC dc(this);
	dc.FillRect(CRect(m_point, point), &brush);
	brush.DeleteObject();

	UpdateData(true);

	CView::OnLButtonUp(nFlags, point);
}

6.棋盘

 

有关设置棋盘大小

添加用于让用户输入棋盘大小的对话框,新建一个类,这里命名为“CSizeDlg”,在COOPEx5View中定义public的CSizeDlg类指针,记得添加头文件

 

有关保存为bmp格式

可以添加一个“保存”对话框,以备随时保存。

新建一个MFC类,这里名为“CSave”,在COOPEx5View中定义public的CSave类指针,记得添加头文件

(改了太多记不大清了qwq...)

 

COOPEx5View.h中新加...

public:
	CPoint m_point;     //起点
	CSizeDlg * m_pSize;    //弹出设置大小的窗口
	CSave * m_pSDlg;    //弹出“保存”窗口
	CClientDC * dc;    //为了画线。
	int num;           //棋盘大小
	bool flag = 0;    //第一次点击画板,弹出设置大小的窗口
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);    
	afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
	afx_msg void OnPaint();

 COOPEx5View.cpp中编辑代码

void COOPEx5View::OnLButtonDown(UINT nFlags, CPoint point)	///起点
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	UpdateData(true);

	if(!flag)
	{
		m_pSize = new CSizeDlg;
		m_pSize->DoModal();
		num = m_pSize->siz;
		flag = 1;
	}

	dc=new CClientDC (this);

	m_pSDlg = new CSave;
	m_pSDlg->Create(IDD_DIALOG1);
	m_pSDlg->ShowWindow(SW_SHOWNORMAL);


	m_point = point;///保存起点位置

	CView::OnLButtonDown(nFlags, point);
}

void COOPEx5View::OnLButtonUp(UINT nFlags, CPoint point)	///终点
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	CBrush *BrushOld, BrushNew;
	COLORREF  BrushClr[] = { RGB(192, 192, 192), RGB(0, 0, 0) };//选用灰色和黑色  COLORREF BrushColor;
	COLORREF BrushColor;


	for (int i = 0; i < 8; i++) 
	{
		for (int j = 0; j < 8; j++) 
		{
			int x = i + 1;
			int y = j + 1;
			if ((i + j) % 2 == 0)
			{
				BrushColor = BrushClr[0];
				BrushNew.CreateSolidBrush(BrushColor);//创建画刷
				BrushOld = dc->SelectObject(&BrushNew);//选择画刷
			}
			else
			{
				BrushColor = BrushClr[1];
				BrushNew.CreateSolidBrush(BrushColor);
				BrushOld = dc->SelectObject(&BrushNew);
			}
			dc->Rectangle(num * x, num * y, num * (x + 1), num * (y + 1));
			dc->SelectObject(BrushOld);//还原画刷
			BrushNew.DeleteObject();	//释放画刷
		}
	}

	m_pSDlg->dc = dc;

	CView::OnLButtonUp(nFlags, point);
}

CSize.h中定义

public:
	int siz;
	afx_msg void OnBnClickedOk();

CSave.h中定义

public:
	CClientDC * dc;  //要获取视图的类名
	CString saveFilePath;

	afx_msg void OnBnClickedButton1();

CSave.cpp中编辑保存代码

void CSave::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码

	UpdateData(true);

	CRect rect;
	BOOL  showMsgTag;                  //是否要弹出"图像保存成功对话框" 
	GetClientRect(&rect);                  //获取画布大小

	//CString tmp;
	//tmp.Format(_T("%lld"), rect.right - rect.left);
	//MessageBox(tmp, MB_OK);

	HBITMAP hbitmap = CreateCompatibleBitmap(*dc, rect.right - rect.left, rect.bottom - rect.top);
	//HBITMAP hbitmap = CreateCompatibleBitmap(*dc, rect.Width(), rect.Height());

	//创建兼容位图
	HDC hdc = CreateCompatibleDC(*dc);      //创建兼容DC,以便将图像保存为不同的格式
	HBITMAP hOldMap = (HBITMAP)SelectObject(hdc, hbitmap);

	//将位图选入DC,并保存返回值 
	BitBlt(hdc, 0, 0, rect.right - rect.left, rect.bottom - rect.top, *dc, 0, 0, SRCCOPY);

	//将屏幕DC的图像复制到内存DC中
	CImage image;
	image.Attach(hbitmap);                //将位图转化为一般图像


	showMsgTag = TRUE;
	CString  strFilter = _T("位图文件(*.bmp)|*.bmp|JPEG 图像文件|*.jpg|GIF图像文件 | *.gif | PNG图像文件 | *.png |其他格式(*.*) | *.* || ");		
	CFileDialog dlg(FALSE, _T("bmp"), _T("iPaint1.bmp"), NULL, strFilter);
	if (dlg.DoModal() != IDOK)
		return;
	CString strFileName;          //如果用户没有指定文件扩展名,则为其添加一个
	CString strExtension;
	strFileName = dlg.m_ofn.lpstrFile;
	if (dlg.m_ofn.nFileExtension = 0)               //扩展名项目为0
	{
		switch (dlg.m_ofn.nFilterIndex)
		{
		case 1:
			strExtension = "bmp"; break;
		case 2:
			strExtension = "jpg"; break;
		case 3:
			strExtension = "gif"; break;
		case 4:
			strExtension = "png"; break;
		default:
			break;
		}
		strFileName = strFileName + "." + strExtension;
	}
	saveFilePath = strFileName;     //saveFilePath为视类中的全局变量,类型为CString

	//AfxMessageBox(saveFilePath);               //显示图像保存的全路径(包含文件名)

	HRESULT hResult = image.Save(saveFilePath);     //保存图像

	if (FAILED(hResult))
	{
		MessageBox(_T("保存图像文件失败!"));
	}
	else
	{
		if (showMsgTag)
			MessageBox(_T("文件保存成功!"));
	}
	image.Detach();
	SelectObject(hdc, hOldMap);


	UpdateData(false);
}