日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于CEdit控件的透明

發(fā)布時間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于CEdit控件的透明 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
前幾天和風在這里討論關于CEdit控件的透明問題。主要的目的就是要做一個有圖形背景的Edit控件,經(jīng)過一番努,終于做出了一個還算象樣的Edit控件。
做一個透明的Edit控件的主要問題是字符的輸出,在Edit里輸出的刷新有幾個時機,一個是在接收到鍵盤或鼠標消息的時候 ,還有就是在接收到WM_PAINT消息。刷新的時候也不是全部重畫,所以想通過在繼承的Edit類中處理WM_PAINT消息是行不通的。但是Edit控件自己總是知道怎么去刷新,因此只要給控件發(fā)消息,讓其自己來刷新就可以了。通過使用spy++的得知需要刷新有幾個時機,一個是按鍵的時候,內(nèi)容變化,另一個是選擇變化的時候,前者Edit控件會接收到GetCtlCode和KeyUp 消息,后者會接收到GetCtlCode和CaptureChange消息或KeyUp消息,因此在GetCtlCode里調(diào)用ReDrawWindow來強迫Edit刷新 整個控件。在ReDrawWindow中通過使用參數(shù)RDW_ERASE可以使控件重畫背景,即調(diào)用OnEraseBkgnd(CDC* pDC),在該函數(shù)中重 畫背景。比較特殊的情況是按住鼠標左鍵并來回拖動鼠標的時候,這時候選擇要改變,接收的消息是MouseMove,為了正 確響應也要處理該消息,但是在每一個MouseMove中都刷新顯示的開銷太大,而且不可避免地有閃爍感,因此只有在鼠標左 鍵按下的時候才刷新顯示。
大概的代碼如下,主要是繼承了一個CEdit的對象CTpEdit,使用的時候可以動態(tài)創(chuàng)建,或者采用SubClass的方法。我用的是后者。
class CTESTDLG : public CDialog
{
......
//聲明一個CTpEdit的成員變量
private:
CTpEdit m_tpedit;
};

//在OnInitDialog中Subclass對話框模板中的Edit控件
BOOL CTESTDLG::OnInitDialog()
{
CDialog::OnInitDialog();
m_tpedit.SubclassDlgItem(IDC_EDIT,this);
return TRUE;
}

//在OnCtlColor中設置背景的透明,要改變Edit控件字體的顏色也在這里

HBRUSH CTESTDLG::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

if((nCtlColor == CTLCOLOR_EDIT) && (pWnd->GetDlgCtrlID()==IDC_EDIT))
{
pDC->SetBkMode(TRANSPARENT); //設置背景透明,這樣,輸出字符的時候就
//是所謂的空心字,而不是有白的底色
pDC->SetTextColor(RGB(255,0,0)); //改變字體的顏色
return HBRUSH(GetStockObject(HOLLOW_BRUSH));
}

return hbr;
}

//CTpEdit對象

class CTpEdit : public CEdit
{
public:
//m_mousedown用來記錄鼠標左鍵是否按下
BOOL m_mousedown;
protected:
//響應如下的消息
//{{AFX_MSG(CTpEdit)
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg UINT OnGetDlgCode();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

//CTpEdit的消息響應函數(shù)如下
//畫背景圖
BOOL CTpEdit::OnEraseBkgnd(CDC* pDC)
{
//得到Edit控件的外框,即背景區(qū)域
RECT updatarect;
GetClientRect(&updatarect);
//畫背景,我畫的是一個黃色的矩形
CBrush newBrush;
newBrush.CreateSolidBrush(RGB(255,255,200));
CBrush * oldBrush = pDC->SelectObject(&newBrush);
pDC->Rectangle(&updatarect);
pDC->SelectObject(oldBrush);
return TRUE;
}

//強迫Edit控件擦除背景,重寫字符
UINT CTpEdit::OnGetDlgCode()
{ RedrawWindow(NULL, NULL,RDW_INVALIDATE | RDW_ERASE );
return CEdit::OnGetDlgCode();
}
//記錄鼠標左鍵是否按下
void CTpEdit::OnLButtonDown(UINT nFlags, CPoint point)
{
m_mousedown = TRUE;
SetCapture();
CEdit::OnLButtonDown(nFlags, point);
}

void CTpEdit::OnLButtonUp(UINT nFlags, CPoint point)
{
if(m_mousedown)
ReleaseCapture();
m_mousedown = FALSE;
CEdit::OnLButtonUp(nFlags, point);
}

//如果左鍵按下并且拖動鼠標就要刷新顯示
void CTpEdit::OnMouseMove(UINT nFlags, CPoint point)
{
if(m_mousedown)
RedrawWindow(NULL, NULL,RDW_INVALIDATE | RDW_ERASE );
CEdit::OnMouseMove(nFlags, point);
}
//初始化成員變量
CTpEdit::CTpEdit()
{
m_mousedown=FALSE;
}

總結(jié)

以上是生活随笔為你收集整理的关于CEdit控件的透明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。