要求建立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);
}