MFC学习笔记(2)

SDK中用GDI画过图玩  这次用MFC感觉差不多 MFC中也可以用API来画  但是毕竟有些麻烦  

既然学MFC就来学学它画图的方式吧

首先说说 MFC的消息响应机制  在MFC中发送给窗口的消息是被MFC框架通过窗口句柄映射表和

消息映射表来用窗口类的函数进行响应的,这叫消息映射机制。

 

说说实际操作  比如用鼠标画直线吧  我们得获取鼠标左键摁下的消息  鼠标左键松开的消息  

 那么我们要在view类中添加一个消息响应函数  之所以在view类中添加 是因为view类是在框

架类之上的  直接在框架类上添加消息响应函数是无法响应消息的  

 

于是我们先在view类中添加2个响应函数 OnLButtonDown OnLButtonUp 在OnLButtonDown

中我们要获取摁下鼠标的点的位置  所以在view类中再添加一个CPoint变量m_pt来获得鼠标坐标

然后在OnLButtonUp中得到鼠标松开时的坐标值point   然后用MoveToEx和LineTo配合 便可以画出

这条直线了

 

具体的几种方式如下:

(1)SDK方法
 HDC hdc=::GetDC(m_hWnd);
 ::MoveToEx(hdc,m_point.x,m_point.y,NULL);
 ::LineTo(hdc,point.x,point.y);
 ::ReleaseDC(m_hWnd,hdc);

 

(2)CDC的方法

 CDC *pdc=GetDC();
 pdc->MoveTo(m_point);
 pdc->LineTo(point);
 ReleaseDC(pdc);

 

(3)CClientDC的方法         //隐式的回收了资源无需Release

 CClientDC dc(this);          //创建CClientDC对象dc
 dc.MoveTo(m_point);
 dc.LineTo(point);

 

(4)CWindowDC的方法          //可以对整个屏幕区域画图

 CWindowDC dc(GetDesktopWindow()); 
 dc.MoveTo(m_point);
 dc.LineTo(point);
 dc.SelectObject(pOldPen);

 

下面我们用例子直接说明创建画笔或画刷的用法

(1)//建画笔

CPen pen(PS_DASH,1,RGB(21,34,244));
 CWindowDC dc(GetDesktopWindow());
 CPen *pOldPen=dc.SelectObject(&pen);
 dc.MoveTo(m_point);
 dc.LineTo(point);
 dc.SelectObject(pOldPen);

(2)//建画刷
 CBrush brush(RGB(12,34,234));   
 CClientDC dc(this);
 dc.FillRect(CRect(m_point,point),&brush);

(3)//位图画刷
 CBitmap bitmap;
 bitmap.LoadBitmapW(IDB_BITMAP1);
 CBrush brush(&bitmap);
 CClientDC dc(this);
 dc.FillRect(CRect(m_point,point),&brush);

(4)//画透明矩形
 CClientDC dc(this);
 CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));  //FromHandle是静态成员函数 所以无

                                            //需创建对象直接调用 它的作用是把画刷

                                            //句柄转换为指向对象的指针
 CBrush *pOldBrush=dc.SelectObject(pBrush);
 dc.Rectangle(CRect(m_point,point));
 dc.SelectObject(pOldBrush);

 

为何第(2)个和第(3)个例子  没用用SelectObject方法呢  很简单 注意FillRect(CRect(m_point,point),&brush);


这个函数中已经选择了&brush所以无需再由SelectObject来选择

 

接下来用实例来说明简单的画图程序

void C画图View::OnMouseMove(UINT nFlags, CPoint point)
{

 CClientDC dc(this);
 CPen pen(PS_SOLID,3,RGB(233,42,21));
 CPen *pOldPen=dc.SelectObject(&pen);
 if(m_bDraw==TRUE)                 //判断鼠标是否摁下
 { 
  dc.SetROP2(R2_BLACK);
  dc.MoveTo(m_point);
  dc.LineTo(point);
  m_point=point;                   //注意这里 
 }
 dc.SelectObject(pOldPen);
 CView::OnMouseMove(nFlags, point);
}

void C画图View::OnLButtonDown(UINT nFlags, CPoint point)
{

 m_point=point;
 m_bDraw=TRUE;
 CView::OnLButtonDown(nFlags, point);
}

void C画图View::OnLButtonUp(UINT nFlags, CPoint point)
{
 m_bDraw=FALSE;
 CView::OnLButtonUp(nFlags, point);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值