登录界面中透明编辑框的实现(测试平台WINCE 5.0)

来源:互联网 发布:古方生发液骗局知乎 编辑:程序博客网 时间:2024/05/21 06:57

 

先看看效果图如下:

 

 

实现编辑框透明化,关键在于对窗口消息的了解与控件的自绘技术掌握情况如何,具体实现步骤如下:

 

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);

 

代码到些结束,即可实现编辑框透明化。

 

注:由于本功能的实现较简单,在代码中注释比较少。如果你只是为了来此拷贝一份代码去实现你的功能,可能要失望了,本程序中变量定义声明没有直接说明。有心的朋友如果是想真正了解透明编辑框是如何做出来的,可以根据上述步骤一步一步完成,如果遇到变量没有定义,那么该变量就应该是本类中的成员变量,变量的类型从函数上去研究不难知道。最后还有一点,如果确保前面工作无误,但程序仍然报错,请检查一下头文件的引用有没有到位。

 

本文只作技术交流与参考,可回贴讨论。。。

原创粉丝点击