真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

新舊MFC版本CEdit透明的2種實現(xiàn)方法-創(chuàng)新互聯(lián)

轉載請注明來源:http://www.cnblogs.com/xuesongshu/新舊MFC版本CEdit透明的2
種實現(xiàn)方法

最近修改了一下繪算法,因為沒有總是繪制整個字符串的必要性。以有后空了,還會完善鼠標事件下的算法。

創(chuàng)新互聯(lián)公司擁有一支富有激情的企業(yè)網(wǎng)站制作團隊,在互聯(lián)網(wǎng)網(wǎng)站建設行業(yè)深耕十載,專業(yè)且經(jīng)驗豐富。十載網(wǎng)站優(yōu)化營銷經(jīng)驗,我們已為數(shù)千家中小企業(yè)提供了網(wǎng)站設計、成都網(wǎng)站建設解決方案,定制制作,設計滿意,售后服務無憂。所有客戶皆提供一年免費網(wǎng)站維護!

MFC 4.2(Visual Studio 6)實現(xiàn)起來很方便,只需要在對話框類下處理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消息,不過這里什么代碼都不寫,目的是為避免執(zhí)行默認的CDialogEx::OnNcPaint()方法給畫上邊框。下面代碼實現(xiàn)基本的透明效果,正常輸入沒問題,如果你想要實現(xiàn)刪除、選中與取消選中等功能,請追加處理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 szData=(LPTSTR)calloc(1024,sizeof(TCHAR)); //指針賦值,不是二重指針,對此指針的操作不影響szData LPTSTR szDraw=szData; CPaintDC* d2=(CPaintDC*)BeginPaint(&ps); CDC d1; CFont f; CWnd* p=GetParent(); nTxtLen=GetWindowText(szData,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); while(*szDraw++); szDraw--; nDrawStart=min(nTxtLen,(r.right-r.left)/tm.tmAveCharWidth); nDrawLen=nDrawStart; while (nDrawStart--) szDraw--; d2->TextOut(0,0,szDraw,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=min(nTxtLen*tm.tmAveCharWidth,r.right-r.left); SetCaretPos(pt); delete szData; 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 szData=(LPTSTR)calloc(1024,sizeof(TCHAR)); LPTSTR szInput=(LPTSTR)calloc(1024,sizeof(TCHAR)); //指針賦值,不是二重指針,對此指針的操作不影響szData LPTSTR szDraw=szData; CClientDC d2(this); CDC d1; CFont f; CWnd* p=GetParent(); nTxtLen=GetWindowText(szData,1024); wsprintf(szInput,L"%c",nChar); lstrcat(szData,szInput); SetWindowText(szData); 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); while(*szDraw++); szDraw--; nDrawStart=min(nTxtLen,(r.right-r.left)/tm.tmAveCharWidth); nDrawLen=nDrawStart; while (nDrawStart--) szDraw--; d2.TextOut(0,0,szDraw,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=min(nTxtLen*tm.tmAveCharWidth,r.right-r.left); SetCaretPos(pt); delete szData; delete szInput; //CEdit::OnChar(nChar, nRepCnt, nFlags); }

以上就是這些了,歡迎一起交流如何實現(xiàn)注釋中寫明的沒有實現(xiàn)有功能。我是菜鳥,大蝦請勿見笑。希望你能多多指點。


網(wǎng)頁標題:新舊MFC版本CEdit透明的2種實現(xiàn)方法-創(chuàng)新互聯(lián)
網(wǎng)頁URL:http://weahome.cn/article/igcps.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部