关于MFC画图的一些总结,MFC (Draw)

转自:http://www.cnblogs.com/volnet/articles/472794.html

首先对按下鼠标的一点进行记录,因此在WM_LBUTTONDOWN添加代码:

void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)

{

     // TODO: 在此添加消息处理程序代码和/或调用默认值

     m_ptOrigin=point;

     CView::OnLButtonDown(nFlags, point);

}

再次记录鼠标弹起WM_LBUTTONUP的点的位置才可完成底下1-3的任务。

1、 画线

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)

{

     // TODO: 在此添加消息处理程序代码和/或调用默认值

 

     //画黑色的线(方法一)

     /*HDC hdc;    //声明一个hdc

     hdc=::GetDC(m_hWnd);   //用全局函数HDC GetDC(HWND hWnd);来获取设备句柄。由于是全局函数因此在函数前加“::”即可

     MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);

     LineTo(hdc,point.x,point.y);

     ::ReleaseDC(m_hWnd,hdc);    //释放设备hdc*/

 

/*方法二说明:利用CDC Do all drawing through the member functions of a CDC object. The class provides member functions for device-context operations, working with drawing tools, type-safe graphics device interface (GDI) object selection, and working with colors and palettes.

在其底下有两个函数

MoveTo

Moves the current position.

PolyBezier

Draws one or more Bézier splines. The current position is neither used nor updated.

方法二与方法一相比的好处在于:方法二无须再定义窗体的句柄*/

     //画黑色的线(方法二)

/*CDC *pDC=GetDC();

     pDC->MoveTo(m_ptOrigin);

     pDC->LineTo(point);

     ReleaseDC(pDC);*/

/*方法三说明:利用CDC的一个派生类CWindowDC类(The CWindowDC class is derived from CDC. It calls the Windows functions GetWindowDC at construction time and ReleaseDC at destruction time. This means that a CWindowDC object accesses the entire screen area of a CWnd (both client and nonclient areas).

其与方法二比好处就在于:在实例化GetWindowDC对象的时候就已经隐含获取了hdc以及在对象生命周期结束的时候自动释放它,以减轻我们的负担。

*/

     //画黑色的线(方法三)

/*CWindowDC dc(this);  //this代表当前窗体的句柄

     dc.MoveTo(m_ptOrigin);

     dc.LineTo(point);*/

/*值得说明的是:在CWindowDC dc(this);this代表当前窗体的句柄,因此我们只需要将需要绘画的窗体指针传入即可。在本例子中由于该消息基于View类的,因此在程序中View窗口进行绘画有效。若要修改为MainFrame类的话,由于MainFrame类是View类的父窗口,因此我们仅仅需要获取当前类的父窗口的指针既可,也就是把当前的this替换为GetParent()。若要在整个Windows桌面上绘画的话可以获取桌面的指针GetDesktopWindow()。具体代码实现如下:*/

//画黑色的线(方法三)(基于MainFrame类框)

     /*CWindowDC dc(GetParent());

     dc.MoveTo(m_ptOrigin);

     dc.LineTo(point);*/

 

     //画黑色的线(方法三)(基于Windows桌面)

     /*CWindowDC dc(GetDesktopWindow());

     dc.MoveTo(m_ptOrigin);

     dc.LineTo(point);*/

/*方法四说明:利用CDC的一个派生类CClientDC类 (The CClientDC class is derived from CDC and takes care of calling the Windows functions GetDC at construction time and ReleaseDC at destruction time. This means that the device context associated with a CClientDC object is the client area of a window.

其方法与CwindowDC基本类似。

*/

//画黑色的线(方法四)

/*CClientDC dc(this);

     dc.MoveTo(m_ptOrigin);

     dc.LineTo(point);*/

 

2、 改变颜色

/*****************************************************************************************/

//画红色的线

     /*CPen pen(PS_SOLID,1,RGB(234,23,53));    //定义一个CPen类对象,并利用RGB宏改变其颜色

     CClientDC dc(this);

     CPen *pOldPen=dc.SelectObject(&pen); //将其选入设备表

     dc.MoveTo(m_ptOrigin);

     dc.LineTo(point);

     dc.SelectObject(pOldPen);   //还原先前设备表中被改动的缺省值*/  

/*方法说明:通过改变画笔CPen的属性并把它们选入设备表,然后再进行画线,设备表的缺省值是黑色 */

 

3、 画矩形

/*****************************************************************************************/

//画无边框的矩形

/*方法说明:利用FillRect函数填充矩形。填充内容为画刷的内容,即画刷对象的指针。*/

//画无边框的矩形

     /*CBrush brush(RGB(5,255,255));

     CClientDC dc(this);

     dc.FillRect(CRect(m_ptOrigin,point),&brush);*/

 

     //以位图作为画刷的资源

     //载入位图到画刷

     /*CBitmap bitmap;

     bitmap.LoadBitmap(IDB_BITMAP1);  /*从“项目”“添加资源”中添加位图资源并将其ID号选到LoadBitmap()函数中。*/

     CBrush brush(&bitmap);

     CClientDC dc(this);

     dc.FillRect(CRect(m_ptOrigin,point),&brush);*/

 

//画有边框的矩形

/*方法说明:利用Rectangle方法来画矩形。其中CBrushCPen类分别负责矩形内部和矩形边框的属性*/

//画中心为白色的矩形

     /*CClientDC dc(this);

     dc.Rectangle(CRect(m_ptOrigin,point));*/

 

     //画中心为透明的矩形

     /*CClientDC dc(this);

     CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));

     CBrush *pOldBrush=dc.SelectObject(pBrush);

     dc.Rectangle(CRect(m_ptOrigin,point));

     pOldBrush=pBrush;*/

 

//画中心为透明边为任意颜色的矩形

     /*CClientDC dc(this);

     CPen pen(PS_SOLID,1,RGB(234,23,53));

     CPen *pOldPen=dc.SelectObject(&pen);

     CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));

     CBrush *pOldBrush=dc.SelectObject(pBrush);

     dc.Rectangle(CRect(m_ptOrigin,point));

     dc.SelectObject(pOldPen);

     dc.SelectObject(pOldBrush);*/

 

4、 画任意线条

/*要记录每一个点的位置必须将以下代码添加到WM_MOUSEMOVE的消息中才可记录移动中的每一点。

但是要配合鼠标左键按下这个动作才可进行记录,否则鼠标移动的事件将包括左键没按下的情况。因此我们必须定义一个全局变量来记录鼠标左键是否按下的信息。因此定义一个BOOL变量来记录是或者否按下的信息。在CVIEW.h头文件中添加一个私有的BOOL m_bDraw;的变量来记录。在WM_LBUTTONDOWN中将其值修改为m_bDraw=TRUE; WM_LBUTTONUP中修改m_bDraw=FALSEWM_MOUSEMOVE中添加如下代码。*/

     CClientDC dc(this);

     if(m_bDraw==TRUE)

     {

         dc.MoveTo(m_ptOrigin);

         dc.LineTo (point);

         m_ptOrigin=point;

     }

     //画扇形线条

     /*CClientDC dc(this);

     if(m_bDraw==TRUE)

     {

         dc.MoveTo(m_ptOrigin);

         dc.LineTo (point);

     }*/

    

     //画带包络线的扇形线条

/*需要记录旧点的信息,因此在WM_LBUTTONDOWNm_ptOld中赋值为point以后在WM_MOUSEMOVE中改变其值*/

     /*CClientDC dc(this);

     if(m_bDraw==TRUE)

     {

         dc.MoveTo(m_ptOrigin);

         dc.LineTo(m_ptOld);

         dc.MoveTo(m_ptOld);

         dc.LineTo(point);

         m_ptOld=point;

     }*/

 

//介绍int SetROP2(int nDrawMode);方法,通过改变nDrawMode参数的值来改变绘画参数

     /*CClientDC dc(this);

     if(m_bDraw==TRUE)

     {

         dc.SetROP2(R2_BLACK);

         dc.MoveTo(m_ptOrigin);

         dc.LineTo(m_ptOld);

         dc.MoveTo(m_ptOld);

         dc.LineTo(point);

         m_ptOld=point;

     }*/

/*MSDNSets the current drawing mode.

int SetROP2(int nDrawMode );

*/

posted on 2009-04-30 15:07 Brandon 阅读(5936) 评论(0)  编辑 收藏 引用 所属分类: MFC


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

导航

统计

常用链接

留言簿(2)

随笔分类

随笔档案

文章分类

文章档案

收藏夹

IT WEB

常用链接

牛人BLOG

学习网站

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜