wxWidgets中不断重绘矩形的方法

		wxClientDC dc(tmpTmpstaticBitmap);
		wxPen pen(*wxBLACK, 1, wxDOT);
		dc.SetPen(pen);
		//以反逻辑函数绘制
		dc.SetLogicalFunction(wxINVERT);
		dc.DrawRectangle(tmpRect);//第一次绘制
		dc.DrawRectangle(tmpRect);//第二次绘制的时候擦除
		dc.SetLogicalFunction(wxCOPY);//恢复正常绘制的方法

鼠标拖动绘制矩形的方法:
1、鼠标在指定的区域中按下左键,记录下当前鼠标按下的位置;
2、捕捉鼠标移动的事件,只有当鼠标按下左键时并且Dragging时,如果上次有绘制的矩形先擦除,然后绘制当前要绘制的矩形,记录当前绘制的矩形的位置;

3、当鼠标左键弹起的时候,重新绘制擦除刚才的矩形,然后用实体矩形重新绘制


void StudyFrame::OnAllStaticBitmapLeftDown( wxMouseEvent& event )
{
	if (tmpAllFlag == true) {
		startPointOnAllStaticBitmap = event.GetPosition();
		tmpAllIsLeftDown = true;
	}
}

void StudyFrame::OnAllStaticBitmapLeftUp( wxMouseEvent& event )
{
	wxPoint pt(0, 0);
	if (tmpAllFlag == true && pt != oldEndPointOnAllStaticBitmap) {
		wxClientDC dc(tmpAllStaticBitmap);
		wxPen pen(*wxBLACK, 1, wxDOT);
		dc.SetPen(pen);
		//以反逻辑函数绘制
		dc.SetLogicalFunction(wxINVERT);
		wxPoint pt(0,0);
		if (pt != oldEndPointOnAllStaticBitmap) {//擦除上次绘制的矩形
			DrawRectangleLine(dc, startPointOnAllStaticBitmap, oldEndPointOnAllStaticBitmap);
		}
		dc.SetLogicalFunction(wxCOPY);//恢复正常绘制的方法

		wxRect rect(startPointOnAllStaticBitmap, oldEndPointOnAllStaticBitmap);
		wxPen newPen(*wxRED, 3, wxSOLID);
		dc.SetPen(newPen);
		wxBrush brush(wxColour(0, 0, 0), wxTRANSPARENT);
		dc.SetBrush(brush);
		dc.DrawRectangle(rect);
	}

	tmpAllFlag = false;
	tmpAllIsLeftDown = false;
}

void StudyFrame::OnAllStaticBitmapMotion( wxMouseEvent& event )
{
	 if(event.Dragging() && tmpAllIsLeftDown){
		 wxPoint currentPoint(event.GetPosition());
		 wxClientDC dc(tmpAllStaticBitmap);
		 wxPen pen(*wxBLACK, 1, wxDOT);
		 dc.SetPen(pen);
		 //以反逻辑函数绘制
		 dc.SetLogicalFunction(wxINVERT);
		 wxPoint pt(0,0);
		 if (pt != oldEndPointOnAllStaticBitmap) {//擦除上次绘制的矩形
			DrawRectangleLine(dc, startPointOnAllStaticBitmap, oldEndPointOnAllStaticBitmap);
		 }
		 DrawRectangleLine(dc, startPointOnAllStaticBitmap, currentPoint);
		 dc.SetLogicalFunction(wxCOPY);//恢复正常绘制的方法
		 oldEndPointOnAllStaticBitmap = currentPoint;
	 }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值