wxwidgets中关于多个wxMemoryDC作图的情况

来源:互联网 发布:linux netsnmp 下载 编辑:程序博客网 时间:2024/06/07 03:42
    众所周知,利用wxMemoryDC作图,可以减小屏幕闪烁,增加界面的友好感!

    此原理涉及到两个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);

0 0
原创粉丝点击