1 为完成消息捕获,需增加windows消息处理
2 在对应类中选择相应消息处理
3 文档视类,view类覆盖在框架类上,因此在窗口上的任何操作只能作用在view上
4 添加消息响应三步骤:
1
afx_msg void OnLButtonDown(UINT nFlags, CPoint point)//头文件中消息响应的声明
2
BEGIN_MESSAGE_MAP(CDrawView, CView)
ON_WM_LBUTTONDOWN()//源文件中将消息与消息响应函数关联起来
END_MESSAGE_MAP()
3
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)//源文件中消息响应函数定义实现
{
// TODO: Add your message handler code here and/or call default
MessageBox("view cliked");
CView::OnLButtonDown(nFlags, point);
}
5 作图要获取DC句柄
6 从CWnd派生出来的都继承了m_hWnd句柄,它跟窗口有关
7 画线:
HDC hdc;
hdc = ::GetDC(m_hWnd);//SDK
MoveToEx(hdc,m_mypoint.x,m_mypoint.y,NULL);
LineTo(hdc,point.x,point.y);
::ReleaseDC(m_hWnd,hdc);
CView::OnLButtonUp(nFlags, point);
8 //用MFC类来完成
//CDC为MFC封装的设备上下文类
CDC* hDC = GetDC();
hDC->MoveTo(m_mypoint);
hDC->LineTo(point);
9 //每一个类都隐含这this指针指向本身
CClientDC dc(GetParent());//获取父窗口句柄,即在view类的父类frame类上画线
dc.MoveTo(m_mypoint);
dc.LineTo(point);
10 //不同颜色的画笔
GetDesktopWindow()//获取桌面句柄
CPen myPen1(PS_DOT, 1, RGB(255,0,0));
CClientDC dc(this);
11 //将新画笔选进设备标志中并返回旧画笔
CPen *pOldpen = dc.SelectObject(&myPen1);
dc.MoveTo(m_mypoint);
dc.LineTo(point);
dc.SelectObject(pOldpen);//重新选择旧画笔
12 //创建带位图的画刷
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
CBrush brush(&bitmap);
13 //创建透明画刷
CClientDC DC(this);
//GetStockObject获取GDI句柄,FromHandle获取画刷指针,参数类型不同需要强制转换
CBrush *p = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CBrush *P_old = DC.SelectObject(p);
DC.Rectangle(CRect(m_mypoint,point));
DC.SelectObject(P_old);
14 类中静态方法并不属于某一具体对象,在代码生成是就已经分配空间
静态方法不能调用非静态成员变量
非静态成员函数可以调用静态成员函数
静态成员变量需要在类外边初始化,否则会出现链接错误
15 画连续弯曲的线,可以捕获鼠标移动的消息
通过左键是否按下和移动时间判断,注意要改变初始点的坐标
定义全局变量判断左键是否按下
CClientDC dc(this);
if(lu == TRUE)
{
dc.MoveTo(m_mypoint);
dc.LineTo(point);
m_mypoint = point;
}
CView::OnMouseMove(nFlags, point);
16
带颜色:
CClientDC dc(this);
CPen pen(PS_DOT,1,RGB(255,0,0));
CPen* old = dc.SelectObject(&pen);
if(lu == TRUE)
{
dc.MoveTo(m_mypoint);
dc.LineTo(point);
m_mypoint = point;
}
dc.SelectObject(old);
CView::OnMouseMove(nFlags, point);