最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

新舊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)起來很方便,只需要在對(duì)話框類下處理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或者畫刷設(shè)為HOLLOW_BRUSH,微軟會(huì)默認(rèn)會(huì)制黑色背景,這一點(diǎn),微軟真是倒退了。廢話少說了,編輯控件子類化無(wú)可避免了,一定要處理WM_PAINT、WM_CHAR、WM_LBUTTONDOWN、WM_LBUTTONUP這幾個(gè)消息。如果你想去掉編輯控制自帶的邊框,還得處理WM_NCPAINT消息,不過這里什么代碼都不寫,目的是為避免執(zhí)行默認(rèn)的CDialogEx::OnNcPaint()方法給畫上邊框。下面代碼實(shí)現(xià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)注釋中寫明的沒有實(shí)現(xiàn)有功能。我是菜鳥,大蝦請(qǐng)勿見笑。希望你能多多指點(diǎn)。

相關(guān)文章

  • C語(yǔ)言超詳細(xì)解析函數(shù)棧幀

    C語(yǔ)言超詳細(xì)解析函數(shù)棧幀

    在C語(yǔ)言中,每一個(gè)正在運(yùn)行的函數(shù)都有一個(gè)棧幀與其對(duì)應(yīng),棧幀中存儲(chǔ)的是該函數(shù)的返回地址和局部變量。從邏輯上講,棧幀就是一個(gè)函數(shù)執(zhí)行的環(huán)境:函數(shù)參數(shù)、函數(shù)的局部變量、函數(shù)執(zhí)行完后返回到哪里等等
    2022-03-03
  • Linux下C語(yǔ)言的fork()子進(jìn)程函數(shù)用法及相關(guān)問題解析

    Linux下C語(yǔ)言的fork()子進(jìn)程函數(shù)用法及相關(guān)問題解析

    fork()函數(shù)在Linux下可以用于產(chǎn)生一個(gè)子進(jìn)程,這里我們挑選了兩個(gè)fork相關(guān)的面試題,來看一下Linux下C語(yǔ)言的fork()子進(jìn)程函數(shù)用法及相關(guān)問題解析
    2016-06-06
  • C++ Primer中&、*符號(hào)的多重定義與int *p和int* p的區(qū)別講解

    C++ Primer中&、*符號(hào)的多重定義與int *p和int* p的區(qū)別講解

    今天小編就為大家分享一篇關(guān)于C++Primer中&、*符號(hào)的多重定義與int *p和int* p的區(qū)別講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • 二叉樹先根(先序)遍歷的改進(jìn)

    二叉樹先根(先序)遍歷的改進(jìn)

    這篇文章主要介紹了二叉樹先根(先序)遍歷的改進(jìn),有需要的朋友可以參考一下
    2014-01-01
  • 基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的五子棋游戲

    基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 簡(jiǎn)述c++ 發(fā)展史

    簡(jiǎn)述c++ 發(fā)展史

    這篇文章主要介紹了c++ 發(fā)展的過程,幫助大家更好的了解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08
  • Linux線程同步之信號(hào)C語(yǔ)言實(shí)例

    Linux線程同步之信號(hào)C語(yǔ)言實(shí)例

    這篇文章主要介紹了Linux線程同步之信號(hào)C語(yǔ)言實(shí)例,本文直接給出代碼實(shí)例,需要的朋友可以參考下
    2015-04-04
  • C語(yǔ)言中qsort函數(shù)的介紹與用法實(shí)例

    C語(yǔ)言中qsort函數(shù)的介紹與用法實(shí)例

    C語(yǔ)言的標(biāo)準(zhǔn)庫(kù)提供了一個(gè)重要的排序函數(shù)qsort給C語(yǔ)言使用者使用,qsort函數(shù)將快速排序的算法封裝起來,這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中qsort函數(shù)的介紹與用法的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • C++?IO設(shè)備讀寫功能實(shí)現(xiàn)詳解

    C++?IO設(shè)備讀寫功能實(shí)現(xiàn)詳解

    C++的文件IO(Input,Output)操作就是指對(duì)文件進(jìn)行讀寫(輸入與輸出)的操作。輸入就是從磁盤上的文件中讀取內(nèi)容到內(nèi)存中。輸出就是將內(nèi)存中的數(shù)據(jù)內(nèi)容輸出或者說寫入到磁盤的文件中,這篇文章主要介紹了C++?IO設(shè)備讀寫功能實(shí)現(xiàn)
    2022-11-11
  • 利用C語(yǔ)言實(shí)現(xiàn)單詞文本計(jì)數(shù)

    利用C語(yǔ)言實(shí)現(xiàn)單詞文本計(jì)數(shù)

    這篇文章主要為大家詳細(xì)介紹了如何編寫一個(gè)C語(yǔ)言程序,用于統(tǒng)計(jì)一個(gè)文本文件中每個(gè)單詞出現(xiàn)的次數(shù),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11

最新評(píng)論

新干县| 沙湾县| 牙克石市| 拉孜县| 奉新县| 永昌县| 阜阳市| 江安县| 靖边县| 清水河县| 孙吴县| 邓州市| 合阳县| 尼勒克县| 岳西县| 安丘市| 武隆县| 当雄县| 蛟河市| 印江| 合水县| 铜山县| 抚远县| 张家川| 当雄县| 开封县| 商河县| 肥西县| 曲沃县| 陇南市| 莱西市| 阳城县| 青神县| 商河县| 于田县| 祁东县| 乌拉特后旗| 沁源县| 福泉市| 桐柏县| 山阳县|