新舊MFC版本實(shí)現(xiàn)CEdit透明的2種方法的實(shí)例代碼
MFC 4.2(Visual Studio 6)實(shí)現(xiàn)起來(lái)很方便,只需要在對(duì)話框類下處理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;
}
然后在編輯控件的相關(guān)事件里調(diào)用一下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可謂相當(dāng)麻煩,因?yàn)榘驯尘霸O(shè)為CLR_NONE或者畫刷設(shè)為HOLLOW_BRUSH,微軟會(huì)默認(rèn)會(huì)制黑色背景,這一點(diǎn),微軟真是倒退了。廢話少說(shuō)了,編輯控件子類化無(wú)可避免了,一定要處理WM_PAINT、WM_CHAR、WM_LBUTTONDOWN、WM_LBUTTONUP這幾個(gè)消息。如果你想去掉編輯控制自帶的邊框,還得處理WM_NCPAINT消息,不過(guò)這里什么代碼都不寫,目的是為避免執(zhí)行默認(rèn)的CDialogEx::OnNcPaint()方法給畫上邊框。下面代碼實(shí)現(xiàn)基本的透明效果,正常輸入沒(méi)問(wèn)題,如果你想要實(shí)現(xiàn)刪除、選中與取消選中等功能,請(qǐng)追加處理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);
}
以上就是這些了,歡迎一起交流如何實(shí)現(xiàn)注釋中寫明的沒(méi)有實(shí)現(xiàn)有功能。我是菜鳥,大蝦請(qǐng)勿見笑。希望你能多多指點(diǎn)。
- MFC中動(dòng)態(tài)創(chuàng)建控件以及事件響應(yīng)實(shí)現(xiàn)方法
- MFC創(chuàng)建模態(tài)對(duì)話框和非模態(tài)對(duì)話框的方法
- MFC設(shè)置對(duì)話框焦點(diǎn)的方法簡(jiǎn)述
- MFC擴(kuò)展DLL中導(dǎo)出類和對(duì)話框的實(shí)現(xiàn)方法
- MFC程序?qū)ξ募奶幚矸椒?/a>
- VC MFC非模態(tài)對(duì)話框的實(shí)現(xiàn)方法
- C和MFC巧妙獲取外網(wǎng)IP的兩種實(shí)現(xiàn)方法
- MFC自定義消息的實(shí)現(xiàn)方法
- MFC中exe圖標(biāo)修改的方法
- MFC創(chuàng)建右鍵彈出菜單的方法
相關(guān)文章
Linux下C語(yǔ)言的fork()子進(jìn)程函數(shù)用法及相關(guān)問(wèn)題解析
fork()函數(shù)在Linux下可以用于產(chǎn)生一個(gè)子進(jìn)程,這里我們挑選了兩個(gè)fork相關(guān)的面試題,來(lái)看一下Linux下C語(yǔ)言的fork()子進(jìn)程函數(shù)用法及相關(guān)問(wèn)題解析2016-06-06
C++ Primer中&、*符號(hào)的多重定義與int *p和int* p的區(qū)別講解
今天小編就為大家分享一篇關(guān)于C++Primer中&、*符號(hào)的多重定義與int *p和int* p的區(qū)別講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-04-04
基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的五子棋游戲
這篇文章主要為大家詳細(xì)介紹了基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
Linux線程同步之信號(hào)C語(yǔ)言實(shí)例
這篇文章主要介紹了Linux線程同步之信號(hào)C語(yǔ)言實(shí)例,本文直接給出代碼實(shí)例,需要的朋友可以參考下2015-04-04
C語(yǔ)言中qsort函數(shù)的介紹與用法實(shí)例
C語(yǔ)言的標(biāo)準(zhǔn)庫(kù)提供了一個(gè)重要的排序函數(shù)qsort給C語(yǔ)言使用者使用,qsort函數(shù)將快速排序的算法封裝起來(lái),這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中qsort函數(shù)的介紹與用法的相關(guān)資料,需要的朋友可以參考下2021-09-09
C++?IO設(shè)備讀寫功能實(shí)現(xiàn)詳解
C++的文件IO(Input,Output)操作就是指對(duì)文件進(jìn)行讀寫(輸入與輸出)的操作。輸入就是從磁盤上的文件中讀取內(nèi)容到內(nèi)存中。輸出就是將內(nèi)存中的數(shù)據(jù)內(nèi)容輸出或者說(shuō)寫入到磁盤的文件中,這篇文章主要介紹了C++?IO設(shè)備讀寫功能實(shí)現(xiàn)2022-11-11
利用C語(yǔ)言實(shí)現(xiàn)單詞文本計(jì)數(shù)
這篇文章主要為大家詳細(xì)介紹了如何編寫一個(gè)C語(yǔ)言程序,用于統(tǒng)計(jì)一個(gè)文本文件中每個(gè)單詞出現(xiàn)的次數(shù),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-11-11

