wince屏幕滑动锁

=============================================================

标题:wince屏幕滑动锁

摘要:

备注:Windows CE 5.0 + VS2005

日期:2010.7.16

姓名:朱铭雷

=============================================================

       经常看到手机上,有那种“屏幕滑动锁”,感觉挺酷的。

wince屏幕滑动锁_第1张图片

       现在自己在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和位图句柄等等,防止内存泄露。

你可能感兴趣的:(工作,image,活动,null,手机,WinCE)