MFC学习笔记(二)

案例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对象: 类似于点对象,可用来表示两点的差值对象

猜你喜欢

转载自blog.csdn.net/wm64195135/article/details/44081031