手机
当前位置:查字典教程网 >编程开发 >C语言 >新旧MFC版本实现CEdit透明的2种方法的实例代码
新旧MFC版本实现CEdit透明的2种方法的实例代码
摘要:MFC4.2(VisualStudio6)实现起来很方便,只需要在对话框类下处理WM_CTLCOLOR消息,然后以下代码即可:复制代码代码如...

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

}

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

【新旧MFC版本实现CEdit透明的2种方法的实例代码】相关文章:

C语言解线性方程的四种方法

使用C++实现全排列算法的方法详解

判断一个数是不是素数的方法

使用OpenGL实现3D立体显示的程序代码

C++读写Excel的实现方法详解

归并排序的递归实现与非递归实现代码

使用map实现单词转换的实例分析

用C++实现,将一句话里的单词进行倒置的方法详解

数据结构课程设计-用栈实现表达式求值的方法详解

用贪心法求解背包问题的解决方法

精品推荐
分类导航