先看看效果图如下:
实现编辑框透明化,关键在于对窗口消息的了解与控件的自绘技术掌握情况如何,具体实现步骤如下:
1.先创建一个工程名为:Login
在工程中添加一个新类名为:CMyEdit,并让其继承CEdit类,通过ClassWizard再给CMyEdit类
添加消息:=WM_CTLCOLOR对应的消息函数CtlColor。该函数具体实现如下:
HBRUSH CMyEdit::CtlColor(CDC* pDC, UINT nCtlColor)
{
pDC->SetBkMode(TRANSPARENT);
return m_hBrush;
}
2.在CMyEdit类中添加一个自定义成员函数:
void SetPosAndBitmap(CBitmap& cbp,CRect rect)
该函数具体实现如下:
//设置编辑框的位置,同时设置背景位图
void CMyEdit::SetPosAndBitmap(CBitmap& cbp,CRect rect)
{
CDC *dc = AfxGetApp()->m_pMainWnd->GetDC();
HBITMAP hbp = CreateCompatibleBitmap(dc->GetSafeHdc(),rect.Width(),rect.Height());
CDC cdcM1,cdcM2;
cdcM1.CreateCompatibleDC(dc);
cdcM2.CreateCompatibleDC(dc);
cdcM1.SelectObject(hbp);
cdcM2.SelectObject(&cbp);
cdcM1.BitBlt(0,0,rect.Width(),rect.Height(),&cdcM2,rect.left,rect.top,SRCCOPY);
AfxGetApp()->m_pMainWnd->ReleaseDC(dc);
SetWindowPos(NULL,rect.left,rect.top,rect.Width(),rect.Height(),SWP_NOZORDER);
m_hBrush = ::CreatePatternBrush(hbp);
}
至此CMyEdit类已完成。
3.在CLoginDlg类中添加WM_PAINT消息,为窗口贴上自己准备好的登录界面图,同时可在属性中去掉窗口标题。
void CLoginDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
CDC cdc;
cdc.CreateCompatibleDC(&dc);
cdc.SelectObject(&m_cBk);
dc.BitBlt(0,0,m_bm.bmWidth,m_bm.bmHeight,&cdc,0,0,SRCCOPY);
cdc.DeleteDC();
}
4.给窗口添加两个CEdit控件,一个用来输入帐号,一个用来输入密码,分别为这两个控件关联两个CMyEdit对象为:m_cName,m_cPass。
为了让编辑框放在合适的位置,要确定在界面图上帐号与密码输入框的实际位置,用两上变量m_rcName和m_rcPass来记录。
在CLoginDlg::OnInitDialog()函数中添加如下代码:
// TODO: Add extra initialization here
m_rcName = CRect(356,223,571,245);
m_rcPass = CRect(356,281,571,303);
m_cBk.LoadBitmap(IDB_BITMAP1);
m_cBk.GetBitmap(&m_bm);
SetWindowPos(NULL,0,0,m_bm.bmWidth,m_bm.bmHeight,SWP_NOZORDER);
m_cName.SetPosAndBitmap(m_cBk,m_rcName);
m_cPass.SetPosAndBitmap(m_cBk,m_rcPass);
代码到些结束,即可实现编辑框透明化。
注:由于本功能的实现较简单,在代码中注释比较少。如果你只是为了来此拷贝一份代码去实现你的功能,可能要失望了,本程序中变量定义声明没有直接说明。有心的朋友如果是想真正了解透明编辑框是如何做出来的,可以根据上述步骤一步一步完成,如果遇到变量没有定义,那么该变量就应该是本类中的成员变量,变量的类型从函数上去研究不难知道。最后还有一点,如果确保前面工作无误,但程序仍然报错,请检查一下头文件的引用有没有到位。
本文只作技术交流与参考,可回贴讨论。。。