操作如下:
鼠标左键弹起时,开始拖动鼠标,出现预画的线,到再次点击鼠标左键弹起,变成实实在在的线,然后继续拖动鼠标,可以继续画线,如此可以一直下去,直到按鼠标右键,取消操作。
问题如下:
我在鼠标左键按下时,捕获鼠标,在右键弹起时,释放鼠标。
采用pDC->SetROP2(R2_NOT)这个预画模式,在按下鼠标右键前,我的上述操作都可以完成。但在我点击鼠标右键后,最后一根预画的线(即最后一次鼠标左键点击的位置到鼠标右键点击的位置)没有被取消,还是画了出来,如何让这根线取消?
是不是还可以采用其他预画模式,望高手指点!

解决方案 »

  1.   

    这还不简单,鼠标右击时再用R2_NOT模式画一根到上次左击位置就OK啦
      

  2.   

    ctl2008(烈火狂奔) 的方法我觉得可行
    就是在鼠标右键响应时得到的点取为与上次鼠标左键的点重合
    因为是两个点重合,不会多一根线。
      

  3.   

    在你的鼠标右键消息函数里面OnRightButtonDown()再画一次最后一条直线段不就删除了,我不久前做过。
      

  4.   

    双缓冲技术,很不错,给你参考一下。
    HBRUSH aBrush; HBRUSH OldBrush; ATLTRACE("Enter Drawing\n"); RECT& Rec = *(RECT*)di.prcBounds; mDevRect=Rec; HDC hDC=::CreateCompatibleDC(di.hdcDraw); HBITMAP hBitMap=CreateCompatibleBitmap(di.hdcDraw,Rec.right,Rec.bottom); HBITMAP hOldBitMap=(HBITMAP)::SelectObject(hDC,hBitMap); //底色 LOGBRUSH logBrush; logBrush.lbColor=RGB(0xCE,0xF3,0xFF); logBrush.lbStyle=BS_SOLID; logBrush.lbHatch=NULL; aBrush=(HBRUSH)::CreateBrushIndirect(&logBrush); OldBrush=(HBRUSH)::SelectObject(hDC,aBrush); Rectangle(hDC, Rec.left,Rec.top,Rec.right-Rec.left,Rec.bottom-Rec.top); ::SelectObject(hDC,OldBrush); ::DeleteObject(aBrush); ::SetGraphicsMode(hDC,GM_ADVANCED); //保存原DC投影参数 XFORM oldWorldTrans; ::GetWorldTransform(hDC,&oldWorldTrans); INT oldMapMode; oldMapMode=::GetMapMode(hDC); POINT oldOriPt; ::GetViewportOrgEx(hDC,&oldOriPt); XFORM WorldTrans={mAmplify,0,0,mAmplify,0,0};  //放大比例 if(mLastAmplify!=mAmplify) { if(mLastAmplify!=0) { //放大系数改变,需要重新计算坐标原点,使参考中心点显示在窗口中心 //如果是第一次显示(mLastAmplify=0),初值决定图显示位置,此时mCenter的值用世界坐标系,经纬度*1000 WorldTrans.eM11=mLastAmplify; //将缩放设置为上次放大系数 WorldTrans.eM22=mLastAmplify; ::SetWorldTransform(hDC,&WorldTrans); ::SetMapMode(hDC,MM_LOMETRIC); ::SetViewportOrgEx(hDC,mOriOffset.x,mOriOffset.y,NULL); DPtoLP(hDC,&mCenter,1); //转换到逻辑坐标 } WorldTrans.eM11=mAmplify; //设置为当前缩放系数 WorldTrans.eM22=mAmplify; ::SetWorldTransform(hDC,&WorldTrans); ::SetMapMode(hDC,MM_LOMETRIC); ::SetViewportOrgEx(hDC,0,0,NULL); LPtoDP(hDC,&mCenter,1);//转换回设备坐标系 //新坐标原点 mOriOffset.x=(Rec.right-Rec.left)/2-mCenter.x; mOriOffset.y=(Rec.bottom-Rec.top)/2-mCenter.y; //当前中心 mCenter.x=(Rec.left+Rec.right)/2; mCenter.y=(Rec.bottom +Rec.top)/2; mLastAmplify=mAmplify; } //绘图投影模式 ::SetWorldTransform(hDC,&WorldTrans); ::SetMapMode(hDC,MM_LOMETRIC); ::SetViewportOrgEx(hDC,mOriOffset.x,mOriOffset.y,NULL); POINT MouseGeo=mMouseP; ::DPtoLP(hDC,&MouseGeo,1); //鼠标 物理-〉地理位置 //绘各层 tDrawInfo DrawInfo; DrawInfo.hDC=hDC; DrawInfo.hOriginalDC=di.hdcDraw; DrawInfo.ClientRec=Rec; DrawInfo.Amplify=mAmplify; DrawInfo.GraphicsMode=GetGraphicsMode(hDC); GetWorldTransform(hDC,&DrawInfo.WorldTrans); GetViewportOrgEx(hDC,&DrawInfo.OriPt); DrawInfo.MapMode=GetMapMode(hDC); mLayers.Draw(&DrawInfo); //恢复原投影方式 ::SetWorldTransform(hDC,&oldWorldTrans); ::SetMapMode(hDC,oldMapMode); ::SetViewportOrgEx(hDC,oldOriPt.x,oldOriPt.y,NULL); //鼠标位置 if(mbShowMousePos) { _TCHAR szStr[256]; _stprintf(szStr,_T("(%.3f, %.3f)"),MouseGeo.x/1000.f,MouseGeo.y/1000.f); INT OldBkMode=::GetBkMode(hDC); //::SetBkMode(hDC,TRANSPARENT); ::SetTextColor(hDC,RGB(0xff,0x0,0x0)); ::SetTextAlign(hDC,TA_BOTTOM|TA_LEFT); LOGFONT logFont; logFont.lfHeight=16; logFont.lfWidth=0; logFont.lfEscapement=0; logFont.lfOrientation=0; logFont.lfWeight=FW_DONTCARE; logFont.lfItalic=FALSE; logFont.lfUnderline=FALSE; logFont.lfStrikeOut=FALSE; logFont.lfCharSet=ANSI_CHARSET; logFont.lfOutPrecision=OUT_CHARACTER_PRECIS; logFont.lfClipPrecision=CLIP_CHARACTER_PRECIS; logFont.lfQuality=DEFAULT_QUALITY; logFont.lfPitchAndFamily=DEFAULT_PITCH|FF_DONTCARE; _tcscpy(logFont.lfFaceName,_T("\0")); HFONT hFont=::CreateFontIndirect(&logFont); HFONT hOldFont=(HFONT)SelectObject(hDC,hFont); ::TextOut(hDC,mMouseP.x,mMouseP.y,szStr,_tcslen(szStr)); ::SelectObject(hDC,hOldFont); ::DeleteObject(hFont); ::SetBkMode(hDC,OldBkMode); // //_stprintf(szStr,_T("(%i,%i,hWnd=%i,This:%i,Amp:%f)"),&StdInfo,_StdInfo,&_Module,&mAmplify,mAmplify); //::TextOut(hDC,10,50,szStr,_tcslen(szStr)); } //外框 aBrush=(HBRUSH)::GetStockObject(NULL_BRUSH); OldBrush=(HBRUSH)::SelectObject(hDC,aBrush); Rectangle(hDC, Rec.left,Rec.top,Rec.right-Rec.left-1,Rec.bottom-Rec.top-1); ::SelectObject(hDC,OldBrush); ::BitBlt(di.hdcDraw,Rec.left,Rec.top,Rec.right,Rec.bottom,hDC,Rec.left,Rec.top,SRCCOPY); ::SelectObject(hDC,hOldBitMap); ::DeleteObject(hBitMap); ::DeleteDC(hDC); ATLTRACE("Amplify(Draw):%.4f\n",mAmplify); return S_OK; }
      

  5.   

    这个简单一点:
     hdcCompatible = CreateCompatibleDC(hdcScreen);  hbmScreen = CreateCompatibleBitmap(hdcScreen,                      GetDeviceCaps(hdcScreen, HORZRES),                      GetDeviceCaps(hdcScreen, VERTRES));  SelectObject(hdcCompatible, hbmScreen);//在hdcCompatible画图.....//复制到屏幕 BitBlt(hdcScreen,        0,0,          bmp.bmWidth, bmp.bmHeight,                hdcCompatible,                0,0,                SRCCOPY);