[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裏面畫就行了,其他什麼都不需要關心.當然你也可以把這個東西拎出來….