);
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;
}
这个类还必须具有三个成员变量:
CFont* m_pFont;
CBitmap* m_pBitmap;
UINT mBtnStats;
在构造函数中初始化这些变量
m_pBitmap=0;
m_pFont=0;
//赋予0是可以的
mBtnStats=BTN_NORMAL;
在折构函数中拆除位图
if(m_pBitmap!=0) delete m_pBitmap;
这样,一个透明的浮动式按键类就做好了,具体实现方法以下:
1.接管对话框的BUTTON,首先在对话框上画一个BUTTON,再加一个PICTURE
图片,BUTTON的风格必须加入OWNER DRAW及去掉VISIBLE,把BUTTON移到PICTURE上适当的位置,在对话框类加入CDrawButton类成员m_myButton,由于按键初始化时必须保存对话框的图象,而对话框在运行InitDialog()或第一次运行OnPaint()时对话框的控件还没有真正显示出来,我们只好在OnMouseMove()中进行初始化:
m_myButton.AutoLoad(IDC_BUTTON1,this);
AutoLoad()只运行一次。
2.动态建立CDrawButton,在对话框类或CxxxView类加入CDrawButton类成员m_myButton,可以在对话框的InitDialog()或CxxxView类的InitialUpdate()中加入:m_myButton.Create()函数,必须包含BS_OWNERDRAW而不能有WS_VISIBLE风格,然后在OnMouseMove()或OnDraw()中进行初始化:m_myButton.LoadBack(this);注意应加在OnDraw()的最后。
同样地,LoadBack()只运行一次。
(如果按键比背景的图片迟建立而具有可见(Visible)属性,则会把
图片抹掉,所以必须去掉VISIBLE属性或不能加入WS_VISIBLE风格)
·当鼠标移到按键区域时,改变鼠标
这个很容易实现,不在这里多说了。