43、wxWidgets绘画之形状运算操作

#include <wx/wx.h>
#include <wx/region.h>

class Simple:public wxFrame
{
public:
    Simple(const wxString& title);
protected:
    void OnPaint(wxPaintEvent& event);

};

Simple::Simple(const wxString& title)
    :wxFrame(NULL,-1,title,wxPoint(-1,-1),wxSize(-1,-1))
{

    Bind(wxEVT_PAINT,wxPaintEventHandler(Simple::OnPaint),this);
    Centre();
}

void Simple::OnPaint(wxPaintEvent& event)
{
    wxPaintDC dc(this);

    wxRect rt;
    wxRegion region1,region2;
    wxSize sz(50,50);
    wxColour white,red,blue;

    white.Set("#ffffff");
    red.Set("#FF0000");
    blue.Set("#0d0060");

    dc.SetPen(wxPen(blue,3,wxSOLID));

    //0.2个白色矩形
    dc.DrawRectangle(20,20,50,50);
    dc.DrawRectangle(30,40,50,50);

    //1.交集 intersect
    wxRect rect1(wxPoint(100,20),sz);
    wxRect rect2(wxPoint(110,40),sz);
    dc.SetBrush(*wxWHITE);
    dc.DrawRectangle(rect1);
    dc.DrawRectangle(rect2);
    rt = rect1.Intersect(rect2);
    rt = rect1 * rect2;
    dc.SetBrush(*wxRED);
    dc.DrawRectangle(rt);

    //2.并集 unin
    rect1.SetPosition(wxPoint(180,20));rect1.SetSize(sz);
    rect2 = wxRect(wxPoint(190,40),sz);
    dc.SetBrush(wxBrush(white));
    dc.DrawRectangle(rect1);
    dc.DrawRectangle(rect2);
    rt = rect1.Union(rect2);
    rt = rect1 + rect2;
    dc.SetBrush(*wxRED);
    dc.DrawRectangle(rt);

    rect1.Offset(70,10);
    rect2.Offset(70,10);
    rect1 = wxRect(wxPoint(250,20),sz);
    rect2 = wxRect(wxPoint(260,40),sz);
    dc.SetBrush(wxBrush(white));
    dc.DrawRectangle(rect1);
    dc.DrawRectangle(rect2);
    region1 = wxRegion(rect1);
    region2 = wxRegion(rect2);
    region1.Union(region2);
    dc.SetClippingRegion(region1);
    rt = region1.GetBox();
    dc.SetBrush(*wxRED);
    dc.DrawRectangle(rt);
    dc.DestroyClippingRegion();

    //3.差集 xor
    rect1 = wxRect(wxPoint(20,120),sz);
    rect2 = wxRect(wxPoint(30,140),sz);
    region1= wxRegion(rect1);
    region2= wxRegion(rect2);

    dc.SetBrush(wxBrush(white));
    dc.DrawRectangle(rect1);
    dc.DrawRectangle(rect2);
    region1.Xor(region2);
    rt = region1.GetBox();
    dc.SetBrush(*wxRED);
    dc.SetClippingRegion(region1);//设置绘图区域,即限制绘图的区域
    dc.DrawRectangle(rt);
    dc.DestroyClippingRegion();//销毁当前绘图区域

    //4.相减 Subtract
    rect2 = wxRect(wxPoint(110,140),sz);
    rect1 = wxRect(wxPoint(100,120),sz);
    region1 = wxRegion(rect1);
    region2 = wxRegion(rect2);

    dc.SetBrush(wxBrush(white));
    dc.DrawRectangle(rect1);
    dc.DrawRectangle(rect2);
    region1.Subtract(region2);
    rt = region1.GetBox();
    dc.SetBrush(*wxRED);
    dc.SetClippingRegion(region1);//设置绘图区域,即限制绘图的区域
    dc.DrawRectangle(rt);
    dc.DestroyClippingRegion();//销毁当前绘图区域

    //5 相减 Subtract
    rect1 = wxRect(wxPoint(180,120),wxSize(50,50));
    rect2 = wxRect(wxPoint(190,140),wxSize(50,50));
    region1 = wxRegion(rect1);
    region2 = wxRegion(rect2);

    dc.SetBrush(wxBrush(white));
    dc.DrawRectangle(rect1);
    dc.DrawRectangle(rect2);
    region2.Subtract(region1);
    wxRect rt5 = region2.GetBox();

    dc.SetClippingRegion(region2);
    dc.SetBrush(*wxRED);
    dc.DrawRectangle(rt5);
    dc.DestroyClippingRegion();


}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值