VC++深入详解第四章——简单绘图

消息处理

类向导--Message Maps--添加响应消息响应

afx_msg(注释宏)这个函数是一个消息响应函数

消息响应会在3处修改代码,
1、处是在头文件中
//{{AFX_MSG(CDrawView)
 afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
 afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
 afx_msg void OnMouseMove(UINT nFlags, CPoint point);
//}}AFX_MSG

DECLARE_MESSAGE_MAP()
2、另一处是cpp文件的begin MessageMap和End MessageMap之间
BEGIN_MESSAGE_MAP(CDrawView, CView)
//{{AFX_MSG_MAP(CDrawView)
 ON_WM_LBUTTONDOWN()
 ON_WM_LBUTTONUP()
 ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
// Standard printing commands
 ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
 ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
 ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

3、最后是要有函数实现的代码
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TOD Add your message handler code here and/or call default
 m_ptOrigin=m_ptOld=point;
 m_bDraw=TRUE;
 CView::OnLButtonDown(nFlags, point);
}

 

 画线:

定义一个成员变量保存mouseDown的点m_Point
  1)API函数方法画线用HDC
  2)用CDC类成员函数画线。此时别忘记ReleaseDC
  3)用CClientDC
  4)用CWindowDC,用它甚至可以整个屏幕区域画线。
下面是上面4种方法的代码
/*
 HDC hdc;
 hdc=::GetDC(m_hWnd);
 MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);
 LineTo(hdc,point.x,point.y);
 ::ReleaseDC(m_hWnd,hdc);必须成对使用。*/
 /*CDC *pDC=GetDC();
 pDC->MoveTo(m_ptOrigin);
 pDC->LineTo(point);
 ReleaseDC(pDC);必须成对使用。

*/
 
//CClientDC dc(this);
/*

 CClientDC dc(GetParent());
 dc.MoveTo(m_ptOrigin);
 dc.LineTo(point);此处不需要ReleaseDC,因为CClientDC会自动释放DC

*/
 
//CWindowDC dc(this);
//CWindowDC dc(GetParent());
/*

 CWindowDC dc(GetDesktopWindow());//此时可以在整个屏幕上画线。
 dc.MoveTo(m_ptOrigin);
 dc.LineTo(point);

*/

 

/*
 CPen pen(PS_DOT,1,RGB(0,255,0));
 CClientDC dc(this);
 CPen *pOldPen=dc.SelectObject(&pen);
 dc.MoveTo(m_ptOrigin);
 dc.LineTo(point);
 dc.SelectObject(pOldPen);

*/

 

用Bitmap填充所画的矩形。

/* //创建位图对象
 CBitmap bitmap;
 //加载位图资源
 bitmap.LoadBitmap(IDB_BITMAP1);
 //创建位图画刷
 CBrush brush(&bitmap);
 //创建并获得设备描述表
 CClientDC dc(this);
 //利用红色画刷填充鼠标拖曳过程中形成的矩形区域
 dc.FillRect(CRect(m_ptOrigin,point),&brush);
*/


 //CBRUSH::FromHandle是静态成员函数,所以可以用下面的方法调用。
  //创建并获得设备描述表
/* CClientDC dc(this);
 //创建一个空画刷
 CBrush *pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
 //将空画刷选入设备描述表
 CBrush *pOldBrush = dc.SelectObject(pBrush);
 //绘制一个矩形
 dc.Rectangle(CRect(m_ptOrigin,point));
 //恢复先前的画刷
 dc.SelectObject(pOldBrush);
*/

 

6)用其它颜色画线

 CClientDC dc(this);
// dc.SetROP2(R2_MERGENOTPEN);
 dc.SetROP2(R2_BLACK);
 //创建一个红色的、宽度为1的实线画笔
 CPen pen(PS_SOLID, 1, RGB(255,0,0));
 //把创建的画笔选入设备描述表
 CPen *pOldPen = dc.SelectObject(&pen);
 if(m_bDraw == TRUE)
 {
 // dc.MoveTo(m_ptOrigin);
 // dc.LineTo(m_ptOld);
  dc.MoveTo(m_ptOrigin);
  dc.LineTo(point);
  dc.LineTo(m_ptOld);
  //修改线段的起点
 // m_ptOrigin = point;
  m_ptOld = point;
 }
 //恢复设备描述表
 dc.SelectObject(pOldPen);

 

 

类的静态成员函数可以由类名直接调用,也可以由对象调用。可以认为静态成员函数并不属于某个对象,它属于类本身。程序运行伊始,即使没有实例化类的对象,静态成员函数和静态成员变量已然有其内存空间。静态成员函数不能访问非静态成员变量!静态成员变量必须在类的外部初始化。当然如果并不打算用到静态成员变量,此时你可以不初始它。

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值