简单绘图
画线
- 知识点
- 屏幕坐标点
- 左上角为(0,0),向右为x轴,向下为y轴
- 设备上下文(Device Content, DC)
- 事件
- 屏幕坐标点
- 起点和终点
- 项目 -》 类向导 -》添加 -》命令
- 鼠标左键按下:起点;鼠标左键抬起:终点
- 点如何表示?CPoint
画布
CDC * cdc = getDC();
//画笔移动到起点
cdc.MoveTo(起点)
//在起点与终点间画一条直线
cdc.LineTo(终点)
ReleaseDC(dcd)
CClientDC dc(this)
dc.MoveTo(起点)
dc.LineTo(终点)
画笔(画轮廓)
CPen pen(笔形、线宽、颜色)
-- 笔形:PS_SOLID 实线,PS_DASH虚线,PS_DOT点线,PS_DOTDASH点划线
-- 线宽:像素为单位
-- 颜色:RGB(red,green,blue);//三种颜色比例
#定义画笔
CPen pen(PS_SOLID,2,RGB(0,255,0));
CClientDC dc(this);
CPen *oldPen = dc.SelectObject(&pen)://返回原来的画笔
dc.MoveTo(起点);
dc.LineTo(终点);
dc.SelectObject(oldPen);
画刷(填充作用)
CBrush brush(RBG(255,0,0));
CClientDC dc(this);
dc.FillRect(CRect(起点,终点),&brush);//用刷子 填充矩形
位图画刷
是一种用于填充图形区域的画刷,它使用
位图(Bitmap)
来定义填充图案
- 还有实心画刷、阴影画刷
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
CBrush brush(&bitmap);
CClientDC dc(this);
dc.FillRect(CRect(起点,终点),&brush);
默认画刷(白色)
CClientDC dc(this);
dc.Rectangle(CRect(起点,终点));
透明画刷
CClientDC dc(this);
CBrush *pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CBrush *POldBrush = dc.SelectObject(pBrush);//返回原始的画刷
dc.Rectangle(CRect(起点,终点));
dc.SelectObject(pOldBrush);
连续画线
项目 -》 类向导 -》添加 -》命令(选择连续画线)
void onMouseMove(UINT bFlag,CPoint point){
CClientDC dc(this);
CPen pen(PS_SOLID,2,RGB(0,255,0));
CPen *pOldPen = dc.SelectObject(&pen);
if(m_bDraw == TRUE){
dc.MoveTo(起点);
dc.LineTo(point);
起点= point;
}
dc.SelectObject(pOldPen);//还原画笔
}
画扇型
void onMouseMove(UINT bFlag,CPoint point){
CClientDC dc(this);
CPen pen(PS_SOLID,2,RGB(0,255,0));
CPen *pOldPen = dc.SelectObject(&pen);
if(m_bDraw == TRUE){
dc.MoveTo(起点);
dc.LineTo(point);
dc.LineTo(上一个点);
上一个点 = point;
}
dc.SelectObject(pOldPen);//还原画笔
}
画圆/椭圆/文字
椭圆
void onLButtonUp(UINT nFlag,CPoint point){
CClientDC dc(this);
dc.Ellipse(CRect(左下角,右下角));
}
圆
void onLButtonUp(UINT nFlag,CPoint point){
CClientDC dc(this);
long len = sqrt(pow(point.x-m_pOrigin.x,2) + pow(point.y-m_pOrigin.y,2));
dc.Ellipse(m_pOrigin.x,m_pOrigin.y,m_pOrigin.x+len,m_pOrigin.y+len);
}
文字
TextOut
:在指定位置画线
void Cdraw3View::OnLButtonUp(UINT nFlags,CPoint point){
CClientDC dc(this);
CFont font;
font.CreatePointFont(200,_T("华文行楷"));
CFont* pOldFont = dc.SelectObject(&font));
dc.SetTextColor(RGB(127,0,255));
CString str(_T("加油!!!"));
dc.TextOut(m_pOrigin.x,m_pOrigin.y,str,str.GetLength());
dc.SelectObject(pOldFont);
CView::OnLButtonUp(nFlags,point);
}
DrawText
:在一个指定的矩形内输出文字+添加动画效果,需要时钟事件
void Cdraw3View::OnTimer(UINT_PTR nIDEvent){
CClientDC dc(this);
CFont font;
font.CreatePointFont(250,_T("华文行楷"));
CFont *pOldFont = dc.SelectObject(&font);
CString str(_T("沧海桑田,追风去!"));
CRect rect;
TEXTMERTIC tm;
CSize cz;
switch(nIDEvent){
case TIMER_TEXT:
m_nWidth += 10;
dc.GetTextMetrics(&tm);
rect.left = 100;
rect.top = 200;
rect.right = m_nWidth;
rect.bottom = rect.top + tm.tmHeight;
dc.SetTextColor(RGB(0,0,255));
dc.DrawText(str,rect,DT_LEFT);
cz = dc.GetTextExtent(str);
if(m_nWidth >= cz.cx + 200){
m_nWidth = 0;
Invalidate();//让屏幕失效,清空屏幕
UpdateWindow();
}
break;
default:
break;
}
dc.SelectObject(pOldFont);
CView::OnTimer(nIDEvent);
}