MFC——简单绘图

简单绘图

画线

  • 知识点
    • 屏幕坐标点
      • 左上角为(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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值