Windows Mobile 使用GDI实现BUTTON效果
2010-08-23 05:19:00 来源:WEB开发网HBITMAP hOldBmp = (HBITMAP)SelectObject(hMemDc,hUpBitmap[nSel]);
BITMAP bm;
GetObject(hDownBitmap[m_nCurrentCount], sizeof(bm), &bm);
StretchBlt(hdc, rcSel.left, rcSel.top, rcSel.right - rcSel.left, rcSel.bottom - rcSel.top, &dcSrc, 0, 0, nWidthOld, nHeightOld, SRCCOPY);
SelectObject(hMemDc, hOldBmp);
DeleteDC(hMemDc);
}
void MyButton::SetUpButtonImage(HWND hWnd, int nPreSel)
{
HDC hdc = GetDC(hWnd);
CRect rcSel;
rcSel = rc[nSel];
// 利用双缓冲绘图
HDC hMemDc = CreateCompatibleDC(hdc);
HBITMAP hOldBmp = (HBITMAP)SelectObject(hMemDc,hUpBitmap[nSel]);
BITMAP bm;
GetObject(hDownBitmap[m_nCurrentCount], sizeof(bm), &bm);
StretchBlt(hdc, rcSel.left, rcSel.top, rcSel.right - rcSel.left, rcSel.bottom - rcSel.top, &dcSrc, 0, 0, nWidthOld, nHeightOld, SRCCOPY);
SelectObject(hMemDc, hOldBmp);
DeleteDC(hMemDc);
}
int MyButton::OnClick(IN HWND hwnd, IN CPoint pt) // 捕捉点击消息
{
int nClicked = -1; // 选中的图标
for ( int n = 0; n < m_nCountTool; n ++)
{
if ( m_Rect[n].PtInRect(pt))
{
nClicked = n;
break;
}
}
if ( -1 == nClicked )
{
return -1;
}
else
{
m_nCurrentSel = nClicked;
SetDownImage(hwnd, m_nCurrentSel); // 设置当前选中图标
SetUpImage(hwnd, m_nCurrentSel); // 恢复上一级选中图标的状态
InvalidateRect(hwnd, rc[m_nCurrentSel], TRUE); // 刷新选中范围
InvalidateRect(hwnd, rc[m_nPreSel], TRUE); // 刷新上一级选中范围
}
}
以上思路实现的BUTTON效果,简单点来说,就是捕捉用户按下松开的消息,改变对应位置的图标,看起来有点像BUTTON的效果,但是相对BUTTON来说,这种方法比较简洁,同时可以增加更多的功能,例如,用户按下某个图标,图标产生旋转,缩放或者闪烁,发出声音等等效果。设计程序就更加灵活了。
更多精彩
赞助商链接