欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

新舊MFC版本實(shí)現(xiàn)CEdit透明的2種方法的實(shí)例代碼

 更新時(shí)間:2013年03月12日 15:20:19   作者:  
新舊MFC版本實(shí)現(xiàn)CEdit透明的2種方法的實(shí)例代碼,需要的朋友可以參考一下

  MFC 4.2(Visual Studio 6)實(shí)現(xiàn)起來(lái)很方便,只需要在對(duì)話框類(lèi)下處理WM_CTLCOLOR消息,然后以下代碼即可:

復(fù)制代碼 代碼如下:

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。

復(fù)制代碼 代碼如下:

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或者畫(huà)刷設(shè)為HOLLOW_BRUSH,微軟會(huì)默認(rèn)會(huì)制黑色背景,這一點(diǎn),微軟真是倒退了。廢話少說(shuō)了,編輯控件子類(lèi)化無(wú)可避免了,一定要處理WM_PAINT、WM_CHAR、WM_LBUTTONDOWN、WM_LBUTTONUP這幾個(gè)消息。如果你想去掉編輯控制自帶的邊框,還得處理WM_NCPAINT消息,不過(guò)這里什么代碼都不寫(xiě),目的是為避免執(zhí)行默認(rèn)的CDialogEx::OnNcPaint()方法給畫(huà)上邊框。下面代碼實(shí)現(xiàn)基本的透明效果,正常輸入沒(méi)問(wèn)題,如果你想要實(shí)現(xiàn)刪除、選中與取消選中等功能,請(qǐng)追加處理WM_LBUTTONDOWN、WM_LBUTTONUP消息。

復(fù)制代碼 代碼如下:

//////////////////////////////////////////////////////////////////////////
//繪制窗口。
//////////////////////////////////////////////////////////////////////////
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)注釋中寫(xiě)明的沒(méi)有實(shí)現(xiàn)有功能。我是菜鳥(niǎo),大蝦請(qǐng)勿見(jiàn)笑。希望你能多多指點(diǎn)。

相關(guān)文章

  • C++中友元類(lèi)和嵌套類(lèi)使用詳解

    C++中友元類(lèi)和嵌套類(lèi)使用詳解

    友元是一種允許非類(lèi)成員函數(shù)訪問(wèn)類(lèi)的非公有成員的一種機(jī)制??梢园岩粋€(gè)函數(shù)指定為類(lèi)的友元,也可以把整個(gè)類(lèi)指定為另一個(gè)類(lèi)的友元,所謂嵌套類(lèi),就是在類(lèi)中聲明的類(lèi)。如下代碼中,類(lèi)Inner就是一個(gè)嵌套類(lèi),類(lèi)Outer是外圍類(lèi)
    2022-08-08
  • C++中函數(shù)模板的用法詳細(xì)解析

    C++中函數(shù)模板的用法詳細(xì)解析

    所謂函數(shù)模板實(shí)際上是建立一個(gè)通用函數(shù),其涵涵素類(lèi)型額形參類(lèi)型不具體指定,用一個(gè)虛擬的類(lèi)型來(lái)代表,這個(gè)通用函數(shù)就稱(chēng)為函數(shù)模板
    2013-10-10
  • C語(yǔ)言編程實(shí)現(xiàn)掃雷游戲

    C語(yǔ)言編程實(shí)現(xiàn)掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言編程實(shí)現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 使用C語(yǔ)言構(gòu)建基本的二叉樹(shù)數(shù)據(jù)結(jié)構(gòu)

    使用C語(yǔ)言構(gòu)建基本的二叉樹(shù)數(shù)據(jù)結(jié)構(gòu)

    這篇文章主要介紹了使用C語(yǔ)言使用C語(yǔ)言構(gòu)建基本的二叉樹(shù)數(shù)據(jù)結(jié)構(gòu),包括根據(jù)前序序列和中序序列構(gòu)建二叉樹(shù)的方法,需要的朋友可以參考下
    2015-08-08
  • C語(yǔ)言開(kāi)發(fā)中的常見(jiàn)錯(cuò)誤詳解

    C語(yǔ)言開(kāi)發(fā)中的常見(jiàn)錯(cuò)誤詳解

    這個(gè)分欄是對(duì)于使用C語(yǔ)言編程過(guò)程中可能會(huì)出現(xiàn)的一些錯(cuò)誤而進(jìn)行的說(shuō)明,更多的錯(cuò)誤示例將會(huì)在后面的內(nèi)容里進(jìn)行演示。希望這個(gè)分欄的內(nèi)容可以幫助剛學(xué)編程的小白少走一些彎路,以及吸取更多的編碼經(jīng)驗(yàn)
    2022-05-05
  • C++常見(jiàn)獲取隨機(jī)數(shù)的方法小結(jié)

    C++常見(jiàn)獲取隨機(jī)數(shù)的方法小結(jié)

    這篇文章主要介紹了C++常見(jiàn)獲取隨機(jī)數(shù)的方法,結(jié)合實(shí)例形式總結(jié)分析了C++獲取隨機(jī)數(shù)的幾種常見(jiàn)方法與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2018-05-05
  • C語(yǔ)言 深入講解條件編譯的用處

    C語(yǔ)言 深入講解條件編譯的用處

    C語(yǔ)言提供了條件編譯的語(yǔ)法,就是在編譯源碼的時(shí)候,可以選擇性地編譯指定的代碼。例如我們開(kāi)發(fā)一個(gè)兼容windows系統(tǒng)和linux系統(tǒng)運(yùn)行的項(xiàng)目,那么,一些與操作系統(tǒng)密切相關(guān)的代碼,就需要進(jìn)行選擇性編譯
    2022-04-04
  • Qt數(shù)據(jù)庫(kù)應(yīng)用之超級(jí)自定義委托

    Qt數(shù)據(jù)庫(kù)應(yīng)用之超級(jí)自定義委托

    Qt中需要用到自定義委托的情形很多,比如提供下拉框選擇,進(jìn)度條展示下載進(jìn)度啥的,默認(rèn)的單元格是沒(méi)有這些效果的,需要自己?jiǎn)为?dú)用委托的形式來(lái)展示。本文將為大家介紹Qt中如何進(jìn)行超級(jí)自定義委托,需要的可以參考一下
    2022-03-03
  • c++超細(xì)致講解引用

    c++超細(xì)致講解引用

    在我們?nèi)粘5纳钪忻總€(gè)人都或多或少存在一個(gè)"外號(hào)",例如《西游記》中孫悟空就有諸多外號(hào):美猴王,孫行者,齊天大圣等等。那么在C++中,也可以給一個(gè)已經(jīng)存在的變量取別名,這就是引用。那么接下來(lái)深入來(lái)探討一下引用
    2022-05-05
  • C語(yǔ)言遞歸應(yīng)用實(shí)現(xiàn)掃雷游戲

    C語(yǔ)言遞歸應(yīng)用實(shí)現(xiàn)掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言遞歸應(yīng)用實(shí)現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06

最新評(píng)論