时间:2021-05-19
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);
}
以上就是这些了,欢迎一起交流如何实现注释中写明的没有实现有功能。我是菜鸟,大虾请勿见笑。希望你能多多指点。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例为大家分享了MFC实现对话框编辑控件上拖拽文件的具体代码,供大家参考,具体内容如下步骤1、重载CEdit类2、添加编辑框控件首先,重载CEdit类,定义
本文以C与MFC的两个实例详述了取外网IP的两种实现方法,具体实现代码如下:MFC语言实现获取外网IP:#include#include#pragmacomme
本文实例讲述了Android编程实现拍照功能的2种方法。分享给大家供大家参考,具体如下:Android系统的照相功能,已实现2种方法,可供大家参考:1.调用系统
下面提供两种方法,仅供研究使用。第1种方法:复制代码代码如下:第2种方法:复制代码代码如下:
本文实例讲述了js+CSS实现弹出居中背景半透明div层的方法。分享给大家供大家参考。具体实现方法如下:复制代码代码如下:js+CSS弹出居中的背景半透明div