此原理涉及到两个DC,屏幕DC和内存DC。把所要绘制的在内存DC中进行绘制,之后全部搬到屏幕DC中,从而把所有烦琐的绘制过程都在内存DC中完成了,用户在屏幕上看到的是一幅完整的图画,所以不可能出现闪烁情况,因为复制的速度是相当快的。
现在,想和大家分享一点利用多个内存DC作图,最后全部显示在wxClientDC上的方法:
此处的例子中含有4个wxMemoryDC,1个wxClientDC,其中有3个wxMemoryDC是分别用来画图的,作图完后,将3个wxMemoryDC整体贴到剩下的一个wxMemoryDC,之后,再将剩下的wxMemoryDC复制到wxClientDC上,显示出来。在此过程中,采用的Blit的逻辑函数很重要……
代码如下:
程序虽然有点重复性,但是思路还是非常清晰的,希望能够给予初学者一定的帮助,同时期待经验丰富的编程者多提建议……
相当重要的是注意所有画布的background需要设置为相同的颜色。最好是黑色(后面的逻辑函数用wxOR);若用白色(逻辑函数用wxAND)。下面的例子中我设置的均为白色……
wxClientDC dc(this);
//在mem1上绘图
wxMemoryDC mem1;
wxBitmap bitmap1(200,200);
mem1.SelectObject(bitmap1);
mem1.SetBackground(*wxWHITE_BRUSH);
mem1.Clear();
mem1.SetBrush(wxBrush(*wxBLACK,wxSOLID));
mem1.DrawRectangle(50,0,100, 100);
//在mem2上绘图
wxMemoryDC mem2;
wxBitmap bitmap2(200,200);
mem2.SelectObject(bitmap2);
mem2.SetBackground(*wxWHITE_BRUSH);
mem2.Clear();
mem2.SetBrush(wxBrush(*wxBLACK,wxSOLID));
mem2.DrawRectangle(0,100,100, 100);
//在mem3上绘图
wxMemoryDC mem3;
wxBitmap bitmap3(200,200);
mem3.SelectObject(bitmap3);
mem3.SetBackground(*wxWHITE_BRUSH);
mem3.Clear();
mem3.SetBrush(wxBrush(*wxBLACK,wxSOLID));
mem3.DrawRectangle(100,100,100, 100);
//均黏贴到mem4上
wxMemoryDC memdc4;
wxBitmap bitmap4(200,200);
memdc4.SelectObject(bitmap4);
memdc4.SetBackground(*wxWHITE_BRUSH);
memdc4.Clear();
memdc4.Blit(0,0,200,200,&mem1,0,0,wxCOPY,true);//此处的逻辑函数也可用wxAND
memdc4.Blit(0,0,200,200,&mem2,0,0,wxAND,true);
memdc4.Blit(0,0,200,200,&mem3,0,0,wxAND,true);
dc.Blit(0,0,200,200,&memdc4,0,0,wxCOPY,true);
mem1.SelectObject(wxNullBitmap);
mem2.SelectObject(wxNullBitmap);
mem3.SelectObject(wxNullBitmap);
memdc4.SelectObject(wxNullBitmap);