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

 更新时间:2020年4月25日 17:48  点击:2495

  MFC 4.2(Visual Studio 6)实现起来很方便,只需要在对话框类下处理WM_CTLCOLOR消息,然后以下代码即可:

复制代码 代码如下:

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。

复制代码 代码如下:

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消息。

复制代码 代码如下:

//////////////////////////////////////////////////////////////////////////
//绘制窗口。
//////////////////////////////////////////////////////////////////////////
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);
}

以上就是这些了,欢迎一起交流如何实现注释中写明的没有实现有功能。我是菜鸟,大虾请勿见笑。希望你能多多指点。

[!--infotagslink--]

相关文章

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

    新旧MFC版本实现CEdit透明的2种方法的实例代码,需要的朋友可以参考一下...2020-04-25
  • MFC实现连连看游戏之消子算法

    这篇文章主要为大家详细介绍了MFC实现连连看游戏之消子算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
  • MFC实现全屏功能代码实例

    这篇文章主要介绍了MFC实现全屏功能的代码,对于学习MFC有一定的借鉴价值,需要的朋友可以参考下...2020-04-25
  • VS2019以及MFC的安装详细教程

    这篇文章主要为大家详细介绍了VS2019以及MFC的安装教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
  • MFC控件之CListCtrl的应用实例教程

    这篇文章主要介绍了MFC控件中CListCtrl的应用方法,包括了针对表格的一些操作,是MFC中比较重要的一个控件类,需要的朋友可以参考下...2020-04-25
  • C++中MFC Tab Control控件的使用详解

    这篇文章主要介绍了C++中MFC Tab Control控件的使用详解的相关资料,需要的朋友可以参考下...2020-04-25
  • MFC之ComboBox控件用法实例教程

    这篇文章主要介绍了MFC之ComboBox控件用法,包括了ComboBox控件常见的各类用法,非常具有实用价值,需要的朋友可以参考下...2020-04-25
  • C++ 关于MFC多线程编程的注意事项

    这篇文章主要介绍了C++ 关于MFC多线程编程的注意事项的相关资料,需要的朋友可以参考下...2020-04-25
  • MFC创建右键弹出菜单的方法

    这篇文章主要介绍了MFC创建右键弹出菜单的方法,较为详细的分析了创建菜单资源及视类添加WM_RBUTTONDOWN消息的实现方法,是非常实用的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-04-25
  • 构建mfc窗体的简单示例

    这篇文章主要介绍了构建mfc窗体的简单示例,需要的朋友可以参考下...2020-04-25
  • MFC自绘Button按钮分析和实现

    这篇文章主要为大家详细介绍了MFC自绘Button按钮分析和实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
  • C语言MFC基础之计算器详解

    这篇文章主要为大家介绍了MFC实现简单的计算器,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助...2021-08-31
  • MFC设置对话框焦点的方法简述

    这篇文章主要介绍了MFC设置对话框焦点的方法简述,主要讲述了两种实现方法,需要的朋友可以参考下...2020-04-25
  • mfc入门教程之通过控制变量制作计算器

    这篇文章主要介绍了mfc入门教程之通过控制变量制作计算器,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-04-25
  • MFC命名规则汇总

    这篇文章主要介绍了MFC命名规则,对于初学者而言需要牢固掌握这类规则,需要的朋友可以参考下...2020-04-25
  • MFC绘制不规则窗体的方法

    这篇文章主要介绍了MFC绘制不规则窗体的方法,涉及MFC窗体操作的相关技巧,需要的朋友可以参考下...2020-04-25
  • MFC扩展DLL中导出类和对话框的实现方法

    这篇文章主要介绍了MFC扩展DLL中导出类和对话框的实现方法,详细讲述了实现扩展DLL中导出类和对话框的具体步骤与方法,具有不错的实用价值,需要的朋友可以参考下...2020-04-25
  • mfc文件操作CFile类之创建文件的方法

    这篇文章主要介绍了mfc文件操作CFile类之创建文件的方法,需要的朋友可以参考下...2020-04-25
  • MFC串口通信发送16进制数据的方法

    这篇文章主要为大家详细介绍了MFC串口通信发送16进制数据,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
  • OpenCV + MFC实现简单人脸识别

    这篇文章主要为大家详细介绍了OpenCV + MFC实现简单人脸识别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25