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);
}
既然学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);
}
相关文章推荐
- MFC集合类学习笔记
- MFC消息机制学习笔记
- MFC学习笔记之程序外观相关操作
- [MFC学习笔记]--string类,路径层
- MFC学习笔记之:创建模态对话框和非模态对话框
- MFC学习笔记
- [MFC学习笔记]--lesson8 对话框的设计
- MFC学习笔记(五)
- 【MFC 学习笔记】CFile读写文件
- MFC学习笔记-界面00、动态数组
- MFC学习笔记(2)—— 消息(1)
- 学习Vc++笔记,从mfc做起
- MFC学习笔记(4)—— 菜单
- 学习笔记 Real COM with the MFC Library (译四)
- MFC学习笔记.day01-WINMAIN,MSG,WNDCLASS,ID-HANDLE-HWND,图标光标
- MFC学习笔记(二):消息对话框的两个函数用法与区别
- MFC学习笔记--截屏
- MFC学习笔记2_消息映射
- MFC学习笔记.day01续-调试MessageBox,注册窗口,创建窗口,显示,更新,消息循环,回调函数
- MFC学习笔记.day02续-CDC类,绘图区域,CPen画笔,画刷 CBrush,DC设备描述表