• [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里面画就行了,其他什么都不需要关心.当然你也可以把这个东西拎出来..

  • 相关阅读:
    第五周上机作业
    第四周练习
    第八周上机练习
    第七周作业
    第七周上机练习
    第六周作业
    第六周上机练习
    第五周上机作业
    第四周作业
    第四周上机练习
  • 原文地址:https://www.cnblogs.com/egmkang/p/1720945.html
Copyright © 2020-2023  润新知