麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > C > 正文

新舊MFC版本實現CEdit透明的2種方法的實例代碼

2020-01-26 16:20:55
字體:
來源:轉載
供稿:網友

  MFC 4.2(Visual Studio 6)實現起來很方便,只需要在對話框類下處理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消息,不過這里什么代碼都不寫,目的是為避免執行默認的CDialogEx::OnNcPaint()方法給畫上邊框。下面代碼實現基本的透明效果,正常輸入沒問題,如果你想要實現刪除、選中與取消選中等功能,請追加處理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);
}

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 中文字幕在线播放不卡 | 久久亚洲精品国产一区 | 久久草在线视频免费 | 一本到免费视频 | 黄色一级片免费观看 | 免费毛片电影 | chinese乱子伦xxxx国语对白 | 国产色91| 欧美日韩精品一区二区三区蜜桃 | 久久生活片 | 日韩视频区 | 久久久久亚洲精品国产 | 久久精品国产99久久久古代 | 91 免费看片 | 99影视在线视频免费观看 | 欧美精品一区二区三区在线播放 | 国产羞羞视频 | 久久久久二区 | 国av在线| 国产二三区 | 一级视频网站 | 国产免费一区二区三区在线能观看 | 羞羞的网址 | 黄色av.com | 毛片一区二区三区四区 | 日本中文视频 | 精品亚洲午夜久久久久91 | 久久一区二区三区av | 中国av中文字幕 | 欧美一级毛片免费观看 | 欧美毛片免费观看 | xxxeexxx性国产 | 国产日产精品一区二区三区四区 | 久久国产28 | 久久国产成人午夜av浪潮 | 国产高清美女一级毛片久久 | 男女生羞羞视频网站在线观看 | 色吧久久 | 久草在线最新 | 黄色毛片免费看 | 一级一级一级毛片 |