请教高手关于移动图形的问题? 我在某个地方使用dc.FillRect()画了一个矩形,然后我希望当移动鼠标时移动这个矩形,并将原先画的矩形的位置的背景回复到未画矩形的状态,该如何做?我不希望使用InValidate()重画整个窗口的方式。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 InValidate()是个好办法但是效率有点低,可能出现闪烁,但是你用了内存DC的话,把0nDraw函数写好点,绝对能另你满意,这是消除闪烁最好的办法 在OnMouseMove里面处理,同时在CDocument中保存数据,以便OnDraw的时候绘制 哪用那么复杂。用dc.SetROP2( R2_XORPEN );模式即可你移动鼠标时移动这个矩形,再画新位置的矩形前,先将DC设为R2_XORPEN 模式,然后新画上次矩形位置(因为是XORPEN模式,所以实际是擦除),然后将R2_XORPEN 模式换为正常,在新位置上画矩形就可以了。(注意要设个变量记住上一次的矩形位置) 你可以用InvalidateRect(CRect /*原来矩形的Rect*/);的形式每次只让需要重绘的地方无效这样要好一些! 我觉得NEWFree的回答好像不对,我用dc.SetROP2(R2_XORPEN)重画两次矩形并没有出现实现象画线那般的橡皮筋效果呀! //一段代码,供你参考void CLineState::OnMouseMove(UINT nFlags, CPoint point){ CMyView *pView = (CMyView*)m_pView; ::SetCursor(::LoadCursor(NULL,IDC_CROSS)); if( m_org.x >=0 && m_org.y >= 0 ) { CClientDC dc( pView ); pView->OnPrepareDC( &dc ); CPen pen,* oldPen; int mode; int backmode; COLORREF BkColor = pView->GetDocument( )->m_backGroundColor ; pen.CreatePen( PS_SOLID, pView->m_thick, dc.GetNearestColor( BkColor ^ pView->m_lineColor ) ); mode = dc.SetROP2( R2_XORPEN ); oldPen = dc.SelectObject( &pen ); ////////////////////////////////////////////////// dc.MoveTo( m_org ); dc.LineTo( m_last ); m_last = point; dc.DPtoLP( &m_last ); dc.MoveTo( m_org ); dc.LineTo( m_last ); dc.SetROP2( mode ); dc.SelectObject( oldPen ); pen.DeleteObject(); } else// Not in Drag method { CStateMenu::OnMouseMove(nFlags, point); }} 指针和字符数组的问题。 求救啊!Detected memory leaks! 无界面的HTMLDocument2调用. socket的头文件 不用编辑控件,如何处理中文输入? 在COM里定义的枚举类型,在外面程序里如何才能调用呢? 怎么实现Menu的CheckMenuItem?谢谢关注。 soket的传送类型 弹出模式对话框,如何阻止其他Windows消息的响应 为什么强制类型转换与原来的所属类无关? 同步和冲突的问题 因为我很急,所以求各位了
但是效率有点低,可能出现闪烁,但是你用了内存DC的话,把0nDraw函数写好点,绝对能另你满意,这是消除闪烁最好的办法
你移动鼠标时移动这个矩形,再画新位置的矩形前,先将DC设为R2_XORPEN 模式,然后新画上次矩形位置(因为是XORPEN模式,所以实际是擦除),然后将R2_XORPEN 模式换为正常,在新位置上画矩形就可以了。(注意要设个变量记住上一次的矩形位置)
这样要好一些!
画线那般的橡皮筋效果呀!
void CLineState::OnMouseMove(UINT nFlags, CPoint point)
{
CMyView *pView = (CMyView*)m_pView;
::SetCursor(::LoadCursor(NULL,IDC_CROSS));
if( m_org.x >=0 && m_org.y >= 0 )
{
CClientDC dc( pView ); pView->OnPrepareDC( &dc ); CPen pen,* oldPen; int mode;
int backmode;
COLORREF BkColor = pView->GetDocument( )->m_backGroundColor ;
pen.CreatePen( PS_SOLID, pView->m_thick, dc.GetNearestColor( BkColor ^ pView->m_lineColor ) );
mode = dc.SetROP2( R2_XORPEN );
oldPen = dc.SelectObject( &pen );
//////////////////////////////////////////////////
dc.MoveTo( m_org );
dc.LineTo( m_last ); m_last = point;
dc.DPtoLP( &m_last ); dc.MoveTo( m_org );
dc.LineTo( m_last );
dc.SetROP2( mode );
dc.SelectObject( oldPen );
pen.DeleteObject();
}
else// Not in Drag method
{
CStateMenu::OnMouseMove(nFlags, point);
}
}