调色板性能完善
窗体移动时,不停的的重绘并不是一件好事,一定程度上会影响视觉效果。而且对于下面的色条而言,总用程序绘制也不是很好的选择。
所以相应做以下修改:
void CXxDialog::OnPrint(){
if(IsIconic){
……
}else{
CClientDC dc(this);
static bool bOnce=false;
if(!bOnce){
bOnce=true;
PostMessage(UM_DRAWBITMAP);//对应添加消息映射On_Message(UM_DRAWBITMAP,OnFinalPrint),并添加消息处理函数
}
CDialog::OnPaint();
}
}
LRESULT CXxDialog::OnFinalPrint(……){
//把所有的绘制工作在这里完成
……
//接下来,将位图选入内存设备上下文
HDC dcTemp=CreateCompatibleDC(pdcAll->m_hDC);
HBITMAP hBitMap,hOldBitMap;
hBitMap=CreateCompatibleBitmap(pdcAll->m_hDC,m_rcStatic.right-m_rcStatic.left,m_rcStatic.bottom-m_rcStatic.top);
hOldBitMap=(HBITMAP)SelectObject(dcTemp,hBitMap);
BitBlt(dcTemp,0,0,m_rcStatic.right-m_rcStatic.left,m_rcStatic.bottom-m_rcStatic.top,pdcAll->m_hDC,0,0,SRCCOPY);
hBitMap=(HBITMAP)SelectObject(dcTemp,hOldBitMap);
m_cBitmap.Attach(hBitMap);
DeleteDC(dcTemp);
return NULL;
}
接着要在背景重绘中将重回完成
BOOL CXxDialog::OnEraseBkgnd(CDC* pDC)
{
//绘制上面的3个色条
OnPaintEx();
//绘制下面的色条
CDC * pdcAll=GetDlgItem(IDC_STATIC_ALL)->GetDC();
CDC cMemDC;
cMemDC.CreateCompatibleDC(pdcAll);
cMemDC.SelectObject(&m_cBitmap);
pdcAll->BitBlt(0,0,m_rcStatic.right-m_rcStatic.left,m_rcStatic.bottom-m_rcStatic.top,&cMemDC,0,0,SRCCOPY);
ReleaseDC(pdcAll);
return CDialog::OnEraseBkgnd(pDC);
}
在背景重绘代码中我们不再阻止子窗口的重绘。
posted on 2009-09-13 15:53 learning... 阅读(196) 评论(1) 收藏 举报
浙公网安备 33010602011771号