您的位置:首页 > 其它

MFC学习笔记(2)

2010-02-05 14:11 281 查看
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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: