您的位置:首页 > 其它

MFC学习笔记(二)

2015-03-05 12:46 162 查看
案例3 定时器的消息响应

代码如下:

int m_iCount;//在view类的头文件中定义新成员变量

m_iCount=0;//在view类的构造函数中初始化

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

{

// TODO: Add your message handler code here and/or call default

m_iCount=0; //保证计数器的重置

SetTimer(1,100,NULL);

CView::OnLButtonDown(nFlags, point);


}

void CMyCountView::OnRButtonDown(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

KillTimer(1); //删除定时器

CView::OnRButtonDown(nFlags, point);


}

void CMyCountView::OnTimer(UINT nIDEvent)

{

// TODO: Add your message handler code here and/or call default

m_iCount++;

CRect rectReDraw(10,10,120,30);

InvalidateRect(rectReDraw,TRUE);

CView::OnTimer(nIDEvent);


}

void CMyCountView::OnDraw(CDC* pDC)

{

CMyCountDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

CString strDisplay;

strDisplay.Format(“当前值:%d”,m_iCount);

pDC->TextOut(10,10,strDisplay);

}

知识点:

1.SetTimer函数:第一个参数n是计数器的编号,第二个参数是计数时间间隔(单位:us),第三个参数是回调函数

2.KillTimer函数: 参数为计数器编号

案例4 鼠标拖动椭圆移动:

代码如下:

class CMyView : public CView

{

protected: // create from serialization only

CMyView();

DECLARE_DYNCREATE(CMyView)

// Attributes

public:

CRect m_rectEllipse; //椭圆位置

CPoint m_pointMouse; //上次鼠标点击位置

BOOL m_bCaptured; //鼠标左键当前是否按下



CMyView::CMyView()

{

// TODO: add construction code here

m_rectEllipse=CRect(100,100,300,250);

m_bCaptured = FALSE;

}

void CMyView::OnDraw(CDC* pDC)

{

CMyDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

CBrush brushNew, *pbrushOld;

CPen penNew, *ppenOld;

brushNew.CreateHatchBrush(HS_CROSS, RGB(255,0,0));

penNew.CreatePen(PS_DASH, 1, RGB(0,0,0));

pbrushOld=pDC->SelectObject(&brushNew);

ppenOld=pDC->SelectObject(&penNew);

pDC->Ellipse(m_rectEllipse); //画出椭圆

pDC->SelectObject(pbrushOld);

pDC->SelectObject(ppenOld);

}

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

{

// TODO: Add your message handler code here and/or call default

if(m_rectEllipse.PtInRect(point))

{

SetCapture();

m_bCaptured = TRUE;

m_pointMouse= point;

}

CView::OnLButtonDown(nFlags, point);
}

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

{

// TODO: Add your message handler code here and/or call default

if(m_bCaptured)

{

::ReleaseCapture();

m_bCaptured = FALSE;

}

CView::OnLButtonUp(nFlags, point);

}

void CMyView::OnMouseMove(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

if(m_bCaptured)

{

InvalidateRect(m_rectEllipse);

CSize offset(point- m_pointMouse);

m_rectEllipse += offset;

InvalidateRect(m_rectEllipse);

m_pointMouse = point;

}

CView::OnMouseMove(nFlags, point);

}

知识点:

1.CRect对象的定义方法: CRect x= CRect(x1,y1,x2,y2);

2.CBrush对象: 顾名思义,画刷。用来填充图形内部,可以不同的样式这里定义了两个对象,一个newbrush,用来绘图,一个oldbrush指针用来指向上一个newbrush存储旧画刷

3.CPen对象: 用来画线条的对象,可以用来勾勒图形的边界,也可用来作直线,也有多种样式

4.画笔和画刷: 一开始创建的画笔画刷不会生效,需要将画笔应用到DC中,MFC提供SelectObject函数完成此功能,要注意的是,SelectObject函数的参数是画笔对象指针,返回值是被替换的画笔指针,我们需要创建一个CPen对象保存这个旧的指针,保证用完这个画笔后,画笔的样式恢复到初值

5.pDC->Ellipse(): 做出椭圆,若规定了画笔和画刷,则会按照规定的画笔画刷样式风格作出图形,在这里就是用黑线勾勒椭圆边,红色坐标线填充

6.矩形对象m的PtInRect(): 返回值为bool类型,判断点对象point是否在矩形区域m_rectEllipse内

7.SetCapture()和ReleaseCapture(): 该函数在属于当前线程的指定窗口里设置鼠标捕获。一旦窗口捕获了鼠标,所有鼠标输入都针对该窗口,无论光标是否在窗口的边界内。同一时刻只能有一个窗口捕获鼠标。如果鼠标光标在另一个线程创建的窗口上,只有当鼠标键按下时系统才将鼠标输入指向指定的窗口。当你不在需要继续获得鼠标消息就要应该调用ReleaseCapture()释放掉,否则别的线程想调用就会失败。SetCapture()和ReleaseCapture()必须成对呈现。

8.CSize对象: 类似于点对象,可用来表示两点的差值对象
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mfc 消息响应