在VC中透明浮动按键的实现
2008-11-13 19:34:27 来源:WEB开发网接着就必须一些初始化工作,其中最关键就是把被按键覆盖了的区域保存进CBitmap类中,我们知道CDC::StretchBlt()函数可以把位图的指定区域从一个设备拷贝到另一个设备中,这样可以很方便地把窗口或对话框的某个区域保存,条件是获得其DC:
void CDrawButton::LoadBack(CWnd *pParent)
{
ASSERT(GetStyle() & BS_OWNERDRAW);
if (m_pBitmap!=0) return;
CRect rect;
GetWindowRect(&rect);
pParent- >ScreenToClient(&rect);//获得按键区域
CPaintDC dc(pParent);
if (m_pBitmap==0) m_pBitmap=new CBitmap;//初始化位图
m_pBitmap- >CreateCompatibleBitmap
(&dc,rect.Width(),rect.Height());
CDC memDC;
memDC.CreateCompatibleDC(&dc);
memDC.SelectObject(m_pBitmap);
memDC.StretchBlt(0, 0, rect.Width(),rect.Height(), &dc,
rect.left, rect.top,
rect.Width(),rect.Height(), SRCCOPY);//保存
memDC.DeleteDC();
m_pFont=pParent- >GetFont();//获得窗口或对话框的字体
ModifyStyle(0,WS_VISIBLE);//显示按键
SetBitmapMode(ODA_DRAWENTIRE,0);//绘制按键
}
而使这个类和对话框上的按键产生联系还必须调用一下SubclassDlgItem():
BOOL CDrawButton::AutoLoad(UINT nID, CWnd *pParent)
{
// first attach the CDrawButton to the dialog control
if (m_pBitmap!=0) return FALSE;
if (!SubclassDlgItem(nID, pParent)) return FALSE;
LoadBack(pParent);
return TRUE;
}
更多精彩
赞助商链接