您的位置:首页 > 其它

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

2015-04-10 13:34 49 查看
众所周知,利用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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: