MFC 擴展CStatic類繪圖-雙緩衝區避免閃屏

[WM]用雙緩衝在CStatic上面畫

Native編程,貌似除了畫沒有其他好的選擇.其實在哪裏畫不是畫,而我選擇了Static控件,我不覺得在其他控件上面畫和Static控件上面有什麼本質區別.(我只是覺得Static控件夠簡單,而且還能達到我的目標)
OK.先來說畫.自己畫的畫,唯一需要注意的就是閃屏的問題,而雙緩衝就是用來防止閃屏的,怎麼來做呢?
1. 阻止畫背景.背景我需要自己來畫
2. 創建一個MemDC,所有的畫都在MemDC上面完成
3. 把畫好的東西拷貝到DC上面(使用BitBlt)
至此,最本質的內容已經介紹完了,下面只是一個Sample,這個Sample裏面什麼都沒畫(汗)…

//註冊ERASEBKGND和PAINT消息
BEGIN_MESSAGE_MAP(MyStatic, CStatic)
ON_WM_ERASEBKGND()
ON_WM_PAINT()
END_MESSAGE_MAP()

//頭文件
class MyStatic : public CStatic
{
DECLARE_DYNAMIC(MyStatic)

public:
MyStatic();
virtual ~MyStatic();
protected:
afx_msg BOOL OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP()
private:
void PaintOnMemDC(CRect client,CDC* pMemDC);
};

//實現
IMPLEMENT_DYNAMIC(MyStatic, CStatic)

MyStatic::MyStatic()
{
}

MyStatic::~MyStatic()
{
}
void MyStatic::OnPaint()
{
CPaintDC dc(this);
CPaintDC* pDC=&dc;
CRect client;
GetClientRect(&client);
CDC m_MemDc;
if( !m_MemDc.m_hDC )
{
CBitmap m_MemMap;
m_MemDc.CreateCompatibleDC(pDC);
m_MemMap.CreateCompatibleBitmap(pDC,client.Width(),client.Height());
m_MemDc.SelectObject(&m_MemMap);
m_MemMap.DeleteObject();
m_MemDc.SetBkMode( TRANSPARENT );
}

PaintOnMemDC(client,&m_MemDc);

pDC->SetBkMode( TRANSPARENT );
pDC->BitBlt( client.left,client.top,client.Width(),client.Height(),&m_MemDc,0,0,SRCCOPY);

m_MemDc.DeleteDC();

}

在這裏畫:
void MyStatic::PaintOnMemDC(CRect client,CDC* pMemDc)
{
//就在這裏畫
}
只需要在PaintOnMemDC裏面畫就行了,其他什麼都不需要關心.當然你也可以把這個東西拎出來….

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章