源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

新旧MFC版本实现CEdit透明的2种方法的实例代码

  • 时间:2022-12-21 10:10 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:新旧MFC版本实现CEdit透明的2种方法的实例代码
  MFC 4.2(Visual Studio 6)实现起来很方便,只需要在对话框类下处理WM_CTLCOLOR消息,然后以下代码即可:
[u]复制代码[/u] 代码如下:
HBRUSH CAlphaEditboxDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)  {     HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);     // TODO: Change any attributes of the DC here     pDC->SetBkMode(TRANSPARENT);     hbr=(HBRUSH)GetStockObject(HOLLOW_BRUSH);     // TODO: Return a different brush if the default is not desired     return hbr; }
 然后在编辑控件的相关事件里调用一下Invalidate。
[u]复制代码[/u] 代码如下:
void CAlphaEditboxDlg::OnKillfocusEditkey()  {     // TODO: Add your control notification handler code here     Invalidate(); } void CAlphaEditboxDlg::OnKillfocusEditmessage()  {     // TODO: Add your control notification handler code here     Invalidate(); } void CAlphaEditboxDlg::OnKillfocusEditpath()  {     // TODO: Add your control notification handler code here     Invalidate(); }
  不要忘了,如果删除字符,要重绘一下背景哦。这里只罗列了一部分。   新版的MFC可谓相当麻烦,因为把背景设为CLR_NONE或者画刷设为HOLLOW_BRUSH,微软会默认会制黑色背景,这一点,微软真是倒退了。废话少说了,编辑控件子类化无可避免了,一定要处理WM_PAINT、WM_CHAR、WM_LBUTTONDOWN、WM_LBUTTONUP这几个消息。如果你想去掉编辑控制自带的边框,还得处理WM_NCPAINT消息,不过这里什么代码都不写,目的是为避免执行默认的CDialogEx::OnNcPaint()方法给画上边框。下面代码实现基本的透明效果,正常输入没问题,如果你想要实现删除、选中与取消选中等功能,请追加处理WM_LBUTTONDOWN、WM_LBUTTONUP消息。
[u]复制代码[/u] 代码如下:
////////////////////////////////////////////////////////////////////////// //绘制窗口。 ////////////////////////////////////////////////////////////////////////// void CMyEdit::OnPaint() {     PAINTSTRUCT ps;     TEXTMETRIC tm;     int nSelStart=0,nSelEnd=0,nDrawStart=0,nDrawLen=0,nTxtLen=0;     RECT r;     CBitmap b;     LPTSTR sz=(LPTSTR)calloc(1024,sizeof(TCHAR));     CPaintDC* d2=(CPaintDC*)BeginPaint(&ps);     CDC d1;     CFont f;     CWnd* p=GetParent();     nTxtLen=GetWindowText(sz,1024);     b.LoadBitmap(IDB_BITMAP1);     d1.CreateCompatibleDC(p->GetDC());     GetWindowRect(&r);     p->ScreenToClient(&r);     d1.SelectObject(b);     d2->BitBlt(0,0,r.right-r.left,r.bottom-r.top,&d1,r.left,r.top,SRCCOPY);     f.CreateFontIndirect(&m_lf);     d2->SelectObject(f);     d2->SetBkMode(TRANSPARENT);     d2->GetTextMetrics(&tm);     GetSel(nSelStart,nSelEnd);     if (r.right-r.left<nTxtLen*tm.tmAveCharWidth)     {         nDrawStart=0-tm.tmAveCharWidth*nSelStart;         nDrawLen=(r.right-r.left)/tm.tmAveCharWidth;     }     else     {         nDrawStart=0;         nDrawLen=nTxtLen;     }     d2->TextOut(nDrawStart,3,sz,nDrawLen);     d2->SelectObject(GetStockObject(NULL_BRUSH));     d2->SelectObject(CreatePen(PS_DOT,1,RGB(255,0,0)));     d2->Rectangle(0,0,r.right-r.left,r.bottom-r.top);     POINT pt;     pt=GetCaretPos();     pt.x=nDrawLen*tm.tmAveCharWidth;     SetCaretPos(pt);     delete sz;     EndPaint(&ps); } ////////////////////////////////////////////////////////////////////////// //暂不处理粘滞按键和功能键这2种情况。 ////////////////////////////////////////////////////////////////////////// void CMyEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) {     TEXTMETRIC tm;     int nSelStart=0,nSelEnd=0,nDrawStart=0,nDrawLen=0,nTxtLen=0;     RECT r;     CBitmap b;     LPTSTR sz=(LPTSTR)calloc(1024,sizeof(TCHAR));     LPTSTR input=(LPTSTR)calloc(1024,sizeof(TCHAR));     CClientDC d2(this);     CDC d1;     CFont f;     CWnd* p=GetParent();     nTxtLen=GetWindowText(sz,1024);     wsprintf(input,L"%c",nChar);     lstrcat(sz,input);     SetWindowText(sz);     b.LoadBitmap(IDB_BITMAP1);     d1.CreateCompatibleDC(p->GetDC());     GetWindowRect(&r);     p->ScreenToClient(&r);     d1.SelectObject(b);     d2.BitBlt(0,0,r.right-r.left,r.bottom-r.top,&d1,r.left,r.top,SRCCOPY);     f.CreateFontIndirect(&m_lf);     d2.SelectObject(f);     d2.SetBkMode(TRANSPARENT);     d2.GetTextMetrics(&tm);     GetSel(nSelStart,nSelEnd);     if (r.right-r.left<nTxtLen*tm.tmAveCharWidth)     {         nDrawStart=0-tm.tmAveCharWidth*nSelStart;         nDrawLen=(r.right-r.left)/tm.tmAveCharWidth;     }     else     {         nDrawStart=0;         nDrawLen=nTxtLen;     }     d2.TextOut(nDrawStart,3,sz,nDrawLen);     d2.SelectObject(GetStockObject(NULL_BRUSH));     d2.SelectObject(CreatePen(PS_DOT,1,RGB(255,0,0)));     d2.Rectangle(0,0,r.right-r.left,r.bottom-r.top);     POINT pt;     pt=GetCaretPos();     pt.x=nDrawLen*tm.tmAveCharWidth;     SetCaretPos(pt);     delete sz;     delete input;     //CEdit::OnChar(nChar, nRepCnt, nFlags); }
以上就是这些了,欢迎一起交流如何实现注释中写明的没有实现有功能。我是菜鸟,大虾请勿见笑。希望你能多多指点。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部