变量命名约定
单文档、多文档、对话框
单文档就是一个窗口只能处理一个文档,多文档就是同时可以处理多个,共享工具栏,菜单栏什么的,对话框就是一个提示用户进行选择或者确认的窗体。 对话框模板适合于做交互界面,单文档模板适合于做文件处理,多文档模板适合于做多文件处理。
预编译头文件stdafx.h和pch.h头文件说明
stdafx.h和pch.h都是在Windows平台上使用的预编译头文件。都是Microsoft Visual Studio 中自动生成。注意,其他编译器不支持,Microsoft Visual Studio 专用(需要)。
在Visual Studio中,stdafx.h是用于预编译头文件的文件名。当你创建新的项目时,该文件会自动生成,并包含一些常见的头文件,可以加快编译过程,减小编译时间。可以在stdafx.h中包含一些你需要用到的公共头文件。
而在Visual Studio 2017及更高版本中,则将预编译头文件的文件名更改为了pch.h,功能与stdafx.h类似,只是名称不同而已。
简单绘图—画线
知识点
屏幕坐标点
设备上下文(Device Content, DC)
事件
起点和终点
如何捕捉这2点? 鼠标左键按下:起点, 鼠标左键抬起:终点
点如何表示:CPoint
画布
📋CDC *cdc = getDC()
// 画笔移动到起点
cdc.MoveTo(起点)
// 在起点与终点间画一条直线
cdc.LineTo(终点)
ReleaseDC(cdc)
📋CClientDC dc(this)
dc.MoveTo(起点);
dc.LineTo(终点);
连续画线
// Cdraw3View 消息处理程序
void Cdraw3View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//保存起点的成员变量
m_pOrigin=point;
//if(m_bDraw){
// m_bDraw=false;
//}else{
// m_bDraw=true;
//}
//m_bDraw=m_bDraw?false:true;
//m_bDraw=!m_bDraw;
m_bDraw=!m_bDraw;
CView::OnLButtonDown(nFlags, point);
}
void Cdraw3View::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
画线
获得设备上下文
//CDC* pDC=GetDC();
画笔
//CPen pen(PS_SOLID,5,RGB(0,255,0));
设备上下文选中画笔
//CPen *pOldPen=pDC->SelectObject(&pen);
画笔移动到起始的点
//pDC->MoveTo(m_pOrigin);
从起点到终点画线
//pDC->LineTo(point);
设备上下文恢复原画笔
//pDC->SelectObject(pOldPen);
释放设备上下文
//ReleaseDC(pDC);
//CClientDC dc(this);
//默认画刷,白色,不透明
//dc.Rectangle(CRect(m_pOrigin,point));
CBrush* pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
//设备上下文选中画刷
CBrush* pOldBrush=dc.SelectObject(pBrush);
//画矩形
dc.Rectangle(CRect(m_pOrigin,point));
//恢复原画刷
dc.SelectObject(pOldBrush);
CBrush brush(RGB(0,255,255));
dc.FillRect(CRect(m_pOrigin,point),&brush);
//CBitmap bitmap;
//bitmap.LoadBitmap(IDB_BITMAP1);
//CBrush brush(&bitmap);
//dc.FillRect(CRect(m_pOrigin,point),&brush);
CView::OnLButtonUp(nFlags, point);
}
void Cdraw3View::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this);
if(m_bDraw){
dc.MoveTo(m_pOrigin);
dc.LineTo(point);
//m_pOrigin=point;
}
设备上下文恢复原画笔
CView::OnMouseMove(nFlags, point);
}
画圆/椭圆/文字
// Cdraw3View 消息处理程序
void Cdraw3View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//保存起点的成员变量
m_pOrigin=point;
m_bDraw=!m_bDraw;
CView::OnLButtonDown(nFlags, point);
}
void Cdraw3View::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this);
//CPen pen(PS_DASH,1,RGB(0,0,255));
//CPen* pOldpen=dc.SelectObject(&pen);
画椭圆
dc.Ellipse(CRect(m_pOrigin,point));
//2点之间x
long len=point.x-m_pOrigin.x;
dc.Ellipse(m_pOrigin.x,m_pOrigin.y,m_pOrigin.x+len,m_pOrigin.y+len);
dc.SelectObject(pOldpen);
CFont font;
//字体
font.CreatePointFont(200,_T("华文行楷"));
CFont* pOldFont=dc.SelectObject(&font);
CString str(_T("你好我好大家好!"));
//设备文字颜色
dc.SetTextColor(RGB(0,0,255));
//输出字符串
//dc.TextOut(point.x,point.y,str,str.GetLength());
//获取文字在屏幕上的空间大小,长度和宽度
CSize cz=dc.GetTextExtent(str);
//在指定矩形区域内画文字
dc.DrawText(str,CRect(point.x,point.y,point.x+cz.cx,point.y+cz.cy),DT_LEFT);
dc.SelectObject(pOldFont);
CView::OnLButtonUp(nFlags, point);
}
void Cdraw3View::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CView::OnMouseMove(nFlags, point);
}
int Cdraw3View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
return 0;
}
消息VS事件
消息是系统的,事件是人为的。
比如 单击 事件,其实是鼠标在 按下消息 和 松开消息之后,CButton自己觉得我该告诉上层我被点击了,于是以消息的方式发送给父窗口。 在使用上有什么区别呢? quote] 区别就是,消息一般被我们用来改变UI。 事件才是我们真正处理事情的地方。
文字循环显示
int Cdraw3View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
//添加定时器
SetTimer(TIMER_TEXT,200,NULL);
return 0;
}
void Cdraw3View::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this);
CFont font;
//字体
font.CreatePointFont(200,_T("华文行楷"));
CFont* pOldFont=dc.SelectObject(&font);
CString str(_T("你好我好大家好!"));
//设备文字颜色
dc.SetTextColor(RGB(0,0,255));
//输出字符串
//dc.TextOut(point.x,point.y,str,str.GetLength());
//获取文字在屏幕上的空间大小,长度和宽度
CSize cz=dc.GetTextExtent(str);
CRect rect;
switch(nIDEvent){
case TIMER_TEXT:
{
m_nWidth+=10;
rect.left=200;
rect.top=100;
rect.bottom=rect.top+cz.cy;
rect.right=rect.left+m_nWidth;
//在指定矩形区域内画文字,DT_LEEF 从左边开始画,DT_RIGHT从右边开始画,DT_CETER从中间位置开始画
dc.DrawText(str,rect,DT_LEFT);
if(m_nWidth>cz.cx){
m_nWidth=0;
//使屏幕上的东西全部无效,擦除屏幕上的内容
Invalidate();
}
}
break;
}
dc.SelectObject(pOldFont);
CView::OnTimer(nIDEvent);
}