=============================================================
标题:wince屏幕滑动锁
摘要:
备注:Windows CE 5.0 + VS2005
日期:2010.7.16
姓名:朱铭雷
=============================================================
经常看到手机上,有那种“屏幕滑动锁”,感觉挺酷的。
现在自己在wince设备上写了一个应用程序,也实现了一样的功能,至少自己用起来和手机上那个“滑动以解除锁定”没有什么区别。当然由于不会美工,界面很粗糙,只是模仿了一下功能而已。记录一下过程,方便以后查阅。
做这个程序,最主要的是两个方面。一是“滑块”要随着我手的触摸位置滑动。这就要不断的在新的位置绘制“滑块”图片,同时必须要将旧位置的“滑块”图片清除掉。二是设置和判断“滑动锁”的开锁条件。我的做法是同时准备两幅位图,一幅位图是“滑块”本身,另一幅位图是用来“覆盖”旧滑块的。下面是该程序编写的主要过程。
一 将“滑块位图”和“擦除位图”绘制到内存缓冲DC中,这样做是提高以后向设备DC绘制位图的速度,防止出现屏幕闪烁的现象。主要代码如下:
hdc = ::GetDC(m_hWnd);
hdcMem = CreateCompatibleDC(hdc);
hBmp = CreateCompatibleBitmap(hdc, 128, 35);
hOldMemBmp = (HBITMAP)SelectObject(hdcMem, hBmp);
//将“滑块位图”绘制到“缓冲DC”中
hdcBmp = CreateCompatibleDC(hdc);
hBmpDis = LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0, 0);
hOldBmp = (HBITMAP)SelectObject(hdcBmp, hBmpDis);
BitBlt(hdcMem, 0, 0, 64, 35, hdcBmp, 0, 0, SRCCOPY);
//将“擦除位图”紧挨着“滑块位图”绘制到“缓冲DC”中
hBmpDis = LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP2), IMAGE_BITMAP, 0, 0, 0);
SelectObject(hdcBmp, hBmpDis);
BitBlt(hdcMem, 64, 0, 128, 35, hdcBmp, 0, 0, SRCCOPY);
二 响应WM_PAINT消息,在该消息响应函数中完成一些初始的绘制。主要代码如下:
CPen pen(PS_DOT, 2, RGB(0, 0, 255));
CPen *pOldPen = dc.SelectObject(&pen);
CFont font;
font.CreateFont(80,0,0,0,0,FALSE,FALSE,0,GB2312_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH|FF_SWISS, _T("宋体"));
CFont *pOldFont = dc.SelectObject(&font);
dc.SetTextColor(RGB(0, 0, 255));
dc.ExtTextOut(110, 100, ETO_OPAQUE, NULL, _T("屏幕滑动锁演示"), NULL);
dc.SelectObject(pOldFont);
dc.MoveTo(190, 345);
dc.LineTo(610, 345);
dc.LineTo(590, 330);
dc.SelectObject(pOldPen);
//将“可移动滑块”绘制到原始位置
BitBlt(hdc, 213, 357, 277, 392, hdcMem, 0, 0, SRCCOPY);
三 响应WM_MOUSEMOVE消息,该消息的响应函数中,会传递一个CPoint类型的形参。该消息响应函数主要做了如下几个方面的工作:
1 “擦除”上次绘制的滑块,如:
BitBlt(hdc, OldPoint.x - 32, 357, OldPoint.x + 32, 392, hdcMem, 64, 0, SRCCOPY);
其中OldPoint保存的是上次的触摸点。
2 判断新的触摸点,如果该触摸点在“滑块活动范围内”,则首先擦除“原始位置的滑块”,然后在新位置绘制滑块,如果触摸点不在“滑块活动范围内”,则在原始位置绘制滑块。
3 保存上一次的触摸点,如:OldPoint = point;
4 标记“滑块锁”已完成的开锁条件。对于开锁条件,我将滑块可以滑动的范围分成了6个连续的小范围。并接连判断“滑块”是否连续滑过如上6个范围,如果是则将6个条件标志全部设为TRUE。
四 响应WM_LBUTTONUP消息。该消息响应函数主要做了如下几个方面的工作:
1当手离开屏幕的时候,判断最后的触摸点是否在滑块活动范围内。如果不在则“滑块”回到原来的位置。
2判断“滑块锁”的开锁条件是否完成,如果完成则开锁。如:
if (bFirstCon && bSecondCon && bThreeCon && bFourCon && bFiveCon && bSixCon)
{
... ...
}
3当手离开屏幕的时候,如果没有达到“滑块锁”的开锁条件,则清除之前所有的已经完成的“滑块锁”开锁条件标记。
五 至此,主要工作已经完成。最后要记得清理所创建的DC和位图句柄等等,防止内存泄露。