学习中,关于又一按钮自绘有关问题,向立天的源代码
学习中,关于又一按钮自绘问题,向立天的源代码
------解决方案--------------------
就是memDC创建一个临时的DC(画布),将要画的东西画在布上,然后整个一起在画到屏幕上。
其实在实际硬用中更微妙。只要最上层的是CWnd窗口即可,里面的元素的PaintM全是由最上层的CWnd窗口中的memDC传进去,然后全画在这个CDC上,这样就不会有闪屏的感觉了
------解决方案--------------------
先绘制到内存上然后一起显示出来
- 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上,这样就不会有闪屏的感觉了
------解决方案--------------------
先绘制到内存上然后一起显示出来