读书人

学习中关于又一按钮自绘有关问题向

发布时间: 2012-09-07 10:38:15 作者: rapoo

学习中,关于又一按钮自绘问题,向立天的源代码

C/C++ code
void CWEBmpButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){    //解析lpDrawItemStruct结构,获取控件的相关信息    CRect    rect    = lpDrawItemStruct->rcItem;    UINT    state    = lpDrawItemStruct->itemState;    CDC        *pDC    = CDC::FromHandle(lpDrawItemStruct->hDC);    int        nOldDC    = pDC->SaveDC();    if(state & ODS_DISABLED)        m_nButtonState = DISABLE;    //双缓存绘图    CRect        rectButton;    CBitmap        bitmapTemp, *pOldBitmap;    CDC*        pMemDC=new CDC;    //获取窗口大小, 创建位图内存    GetWindowRect(rectButton);    bitmapTemp.CreateCompatibleBitmap(pDC, rectButton.Width(), rectButton.Height());    pMemDC->CreateCompatibleDC(pDC);    pOldBitmap=pMemDC->SelectObject(&bitmapTemp);    //获取背景    this->GetParent()->ScreenToClient(rectButton);    pMemDC->BitBlt(0, 0, rectButton.Width(), rectButton.Height(), this->GetParent()->GetDC(), rectButton.left, rectButton.top, SRCCOPY);    //绘制按钮状态     DrawPicture(pMemDC, m_nButtonState, rect);    //显示按钮的文本    DrawButtonText(pMemDC, rect, state);    //绘制到前景    pDC->BitBlt(0, 0, rectButton.Width(), rectButton.Height(), pMemDC, 0, 0, SRCCOPY);    //恢复DC    pDC->RestoreDC(nOldDC);    //释放内存    pMemDC->SelectObject(pOldBitmap);    ReleaseDC(pMemDC);    delete    pMemDC;}void CWEBmpButton::DrawPicture(CDC* pDC, int nState, CRect rect){    CBitmap        *pOldBitmap;    CDC*        pMemDC = new CDC;    //读位图到内存    pMemDC->CreateCompatibleDC(pDC);    pOldBitmap = pMemDC->SelectObject(&m_bmpBtnState);    pDC->TransparentBlt(rect.left, rect.top, rect.Width(), rect.Height(), pMemDC, m_sizeButton.cx*nState, 0, m_sizeButton.cx, m_sizeButton.cy, m_clrColorKey);    pMemDC->SelectObject(pOldBitmap);    //释放内存    ReleaseDC(pMemDC);    delete    pMemDC;}这段代码是向立天很久之前的,从博客中下载的,在学习中。因为刚开始学自绘,总有些问题:1.什么双缓存绘图?2.this->GetParent()->ScreenToClient(rectButton);pMemDC->BitBlt(0, 0, rectButton.Width(), rectButton.Height(), this->GetParent()->GetDC(), rectButton.left, rectButton.top, SRCCOPY); 这行代码,我学习时,CDC指针和它刚好相反,this->GetParent()->GetDC()->BitBlt(0, 0, rectButton.Width(), rectButton.Height(), pMemDC, rectButton.left, rectButton.top, SRCCOPY);理解是这样,pMemDC是内存设备环境,里面有位图,是把位图画到this->GetParent()->GetDC(),而上面this->GetParent()->GetDC()中根本就没位图?难道源和目标设备环境可以互换?这难道就是双缓存绘图?也许是我一直没搞清楚是怎么一回事?//绘制到前景pDC->BitBlt(0, 0, rectButton.Width(), rectButton.Height(), pMemDC, 0, 0, SRCCOPY);  这一行就是我理解的,是从pMemDC到pDC。3.DrawPicture中第一个参数怎么会传内存设备指针,而且在此基础上又创建了个内存设备指针,迷惑?


[解决办法]
就是memDC创建一个临时的DC(画布),将要画的东西画在布上,然后整个一起在画到屏幕上。
其实在实际硬用中更微妙。只要最上层的是CWnd窗口即可,里面的元素的PaintM全是由最上层的CWnd窗口中的memDC传进去,然后全画在这个CDC上,这样就不会有闪屏的感觉了
[解决办法]
先绘制到内存上然后一起显示出来

读书人网 >VC/MFC

热点推荐