孙鑫VC学习笔记:第四讲 MFC消息映射机制和CDC类的使用

来源:互联网 发布:手机统计表格软件 编辑:程序博客网 时间:2024/05/13 05:49
  • MFC的消息映射机制
  ------------------WINCORE.CPP-----------------------------------------------  LRESULT CWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)  { // OnWndMsg does most of the work, except for DefWindowProc call LRESULT lResult = 0; if (!OnWndMsg(message, wParam, lParam, &lResult))//真正的消息处理都是由OnWndMsg                                                  //函数进行处理的  lResult = DefWindowProc(message, wParam, lParam); return lResult;  }  ---------------------------------------------------------------------------------

 
  ---------------------AFX_WIN.h-----------------------------------------------  virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);  --------------------------------------------------------------------------------  //WindowProc(UINT message, WPARAM wParam, LPARAM lParam);是一个虚函数

  /*在MFC中维护了一张消息到窗口的对应表,当接收到一个消息后,通过消息的句柄,找到与其相
  关  联的窗口对象的指针,然后传给CWnd::WindowProc函数,CWnd::WindowProc函数函数交由
  CWnd::OnWndMsg函数进行处理,判断子类是否有这个消息的响应函数,通过查看这个类的头文件
  看有没有消息响应函数原型的声明,查看源文件,看有没有消息响应函数的定义.如果子类有,那
  么交由子类处理消息,如果子类没有,消息交由父类进行处理.*/

  • 实现画线函数
  ---------------------------------------------------------------------------------   void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)   {  // TODO: Add your message handler code here and/or call default  //MessageBox("View Clicled!");  m_ptOrigin=point;  CView::OnLButtonDown(nFlags, point);   } void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) {  // TODO: Add your message handler code here and/or call default  HDC hdc;  hdc=::GetDC(m_hWnd); //每个从CWnd类派生出来的类都有一个内部的数据成员m_hWnd  MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);  LineTo(hdc,point.x,point.y);  ::ReleaseDC(m_hWnd,hdc);   CView::OnLButtonUp(nFlags, point); }

  ---------------------------------------------------------------------------------

  MSDN
  ----------------------------------------------------------------------------------
  BOOL MoveToEx(
 HDC hdc,          // handle to device context
 int X,            // x-coordinate of new current position
 int Y,            // y-coordinate of new current position
 LPPOINT lpPoint   // old current position
  );
  BOOL LineTo(
 HDC hdc,    // device context handle
 int nXEnd,  // x-coordinate of ending point
 int nYEnd   // y-coordinate of ending point
  );
  ----------------------------------------------------------------------------------

  • CDC类

  MFC把所有和窗口相关的操作都封装在CWnd类中.同样,MFC把所有和绘图相关的操作也封装在

  使用CDC类完成画线的功能.

  CDC* GetDC();
  ----------------------------------------------------------------------------------
  DrawView.CPP

  ---------------------------------------------------------------------------------  void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)  { // TODO: Add your message handler code here and/or call default CDC *pDC=GetDC(); pDC->MoveTo(m_ptOrigin); pDC->LineTo(point); ReleaseDC(pDC); CView::OnLButtonUp(nFlags, point);  }  ---------------------------------------------------------------------------------

  CClientDC派生自CDC

  构造CClientDC对象的时候自动调用GetDC,而在析构的时候自动调用ReleaseDC.从而我们不需要
  显示的去调用这两个函数.只需要仅仅构造一个CClientDC对象.
  MSDN
  -----------------------------------------------------------------------------------
  CClientDC::CClientDCSee Also
     Constructs a CClientDC object that accesses the client area of the CWnd pointed
  to by pWnd.

     explicit CClientDC(
        CWnd* pWnd
     );

   CWindowDC
  class CWindowDC : public CDC
  构造CWindowDC对象时,自动调用GetWindowDC,析构时自动调用ReleaseDC.
  有了CWindowDC对象我们可以访问整个屏幕区域,包括客户区域和非客户区域(如需访问整个电脑屏幕,使用CWnd::GetDesktopWindow 函数)

  • 画出其他颜色的线条

  CPen类
  封装了和画笔相关的操作.
  CPen的构造函数

 CPen(
    int nPenStyle,       //笔的风格 PS_SOLID   Creates a solid pen.
                            //PS_DASH   Creates a dashed pen. Valid only when the
       //pen width is 1 or less, in device units.
                            //PS_DOT   Creates a dotted pen.........
    int nWidth,          //线条的宽度
    COLORREF crColor     //笔的颜色
 );
 CPen(
    int nPenStyle,
    int nWidth,
    const LOGBRUSH* pLogBrush,
    int nStyleCount = 0,
    const DWORD* lpStyle = NULL
 );

CDC::SelectObject
MSDN
-------------------------------------------------------------------------------------
  CDC::SelectObject
 Selects an object into the device context.

 CPen* SelectObject(
    CPen* pPen
 );
 CBrush* SelectObject(
    CBrush* pBrush
 );
 virtual CFont* SelectObject(
    CFont* pFont
 );
 CBitmap* SelectObject(
    CBitmap* pBitmap
 );
 int SelectObject(
    CRgn* pRgn
 );
 CGdiObject* SelectObject(
    CGdiObject* pObject
 );
------------------------------------------------------------------------------------

DrawView.CPP
  -----------------------------------------------------------------------------------
   void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
   {
 // TODO: Add your message handler code here and/or call default
 
  CPen pen(PS_SOLID,1,RGB(255,0,0)); //创建画笔
  CClientDC dc(this);
  CPen *pOldPen=dc.SelectObject(&pen);//把创建的画笔选进设备描述表
  dc.MoveTo(m_ptOrigin);
  dc.LineTo(point);
  dc.SelectObject(pOldPen); //还原设备描述表
  CView::OnLButtonUp(nFlags, point);
   }
  -----------------------------------------------------------------------------------

  • 创建画刷

 CBrush类
 MSDN
 ---------------------------------------------------------------------------------
 CBrush::CBrush
 Constructs a CBrush object.

 CBrush( );
 CBrush(
    COLORREF crColor
 );
 CBrush(
    int nIndex,
    COLORREF crColor
 );
 explicit CBrush(
    CBitmap* pBitmap
 );
 ---------------------------------------------------------------------------------

 DrawView.CPP
  -----------------------------------------------------------------------------------
   void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
   {
 // TODO: Add your message handler code here and/or call default
 
  CBrush brush(RGB(255,0,0)); //创建画刷
  CClientDC dc(this);
  dc.FillRect(CRect(m_ptOrigin,point),&brush);//用制定的画刷,填充矩形区域

  CView::OnLButtonUp(nFlags, point);
   }
  -----------------------------------------------------------------------------------
 
  创建位图的画刷:
  CBitmap类
  MSDN
  -----------------------------------------------------------------------------------
  CBitmap::CBitmap
 Constructs a CBitmap object.

 CBitmap( );  // 需要使用函数对其进行初始化
  Remarks
 The resulting object must be initialized with one of the initialization member
 functions.
-------------------------------------------------------------------------------------
LoadBitmap函数,加载位图
MSDN
-------------------------------------------------------------------------------------
CBitmap::LoadBitmap
 Loads the bitmap resource named by lpszResourceName or identified by the ID number
 in nIDResource from the application's executable file.

 BOOL LoadBitmap(
    LPCTSTR lpszResourceName
 );
 BOOL LoadBitmap(
    UINT nIDResource
 );
-------------------------------------------------------------------------------------
DrawView.CPP
  -----------------------------------------------------------------------------------
   void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
   {
 // TODO: Add your message handler code here and/or call default
 
  CBitmap bitmap;
  bitmap.LoadBitmap(IDB_BITMAP1); //加载位图
  CBrush brush(&bitmap);
  CClientDC dc(this);
  dc.FillRect(CRect(m_ptOrigin,point),&brush);//用制定的画刷,填充矩形区域

  CView::OnLButtonUp(nFlags, point);
   }
  -----------------------------------------------------------------------------------
 
 透明画刷的创建
 CBrush::FromHandle
 MSDN
-------------------------------------------------------------------------------------
CBrush::FromHandle
 Returns a pointer to a CBrush object when given a handle to a Windows HBRUSH object.

 static CBrush* PASCAL FromHandle(
    HBRUSH hBrush                        //这是CBrush类的静态方法
    //在静态的成员函数中,是不能引用非静态的数据成员
    //因为非静态的数据成员,是在类实例化一个对象时才分配内存空间的.
    //静态的数据成员使用之前必须初始化
 );
-------------------------------------------------------------------------------------
 由CBrush::FromHandle可以从一个画刷的句柄,得到指向这个画刷对象的指针.
 DrawView.CPP
  -----------------------------------------------------------------------------------
   void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
   {
 // TODO: Add your message handler code here and/or call default
 
  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);
  CView::OnLButtonUp(nFlags, point);
   }
  -----------------------------------------------------------------------------------

  • 设置绘图模式(CDC::SetROP2)

CDC::SetROP2函数
MSDN
------------------------------------------------------------------------------------
CDC::SetROP2
Sets the current drawing mode.
int SetROP2(
       int nDrawMode
 );
Parameters
nDrawMode
 Specifies the new drawing mode. It can be any of the following values:
 R2_BLACK   Pixel is always black.
 R2_WHITE   Pixel is always white.
 R2_NOP   Pixel remains unchanged.
 R2_NOT   Pixel is the inverse of the screen color.
 R2_COPYPEN   Pixel is the pen color.
 R2_NOTCOPYPEN   Pixel is the inverse of the pen color.


原创粉丝点击