想要达到的效果:鼠标按下为起始点,鼠标移动时画线(要清除上次绘制的直线再绘制),鼠标松开时,清除直线。
坐标指针POINT down,move,up;
能否指点一下,如何实现“清除上次绘制的直线再绘制”
PS:google的网页,一般都是用VC写的,SetROP2函数,还是有些看不懂,能否给个winAPI的代码呢?

解决方案 »

  1.   

    记录下你要画的坐标,起始点和终点,然后直接在ONDROW里画,鼠标点击的时候更新下窗口
      

  2.   

    LButtonDown的时候记录2个点:
        m_textStart=point;
       m_textCurrent=point;
    MouseMove的时候画两次:
        pDC->Rectangle(m_textStart.x, m_textStart.y,m_textCurrent.x, m_textCurrent.y);
       m_textCurrent=point;
       pDC->Rectangle(m_textStart.x, m_textStart.y,point.x, point.y);//绘新图形
    Up的时候再画一次:
       pDC->Rectangle(pOldPoint.x, pOldPoint.y, point.x, point.y);
      

  3.   

    最后一行弄错了~
    pDC->Rectangle(m_textStart.x, m_textStart.y, point.x, point.y); 
      

  4.   

    试过了,好像不行,以前画的不能擦除,MouseMove的时候画两次,是什么意思呢?
      

  5.   

     MoveToEx(hdc,ptBeg.x,ptBeg.y,NULL);
         LineTo(hdc,ptBeg.x+50,ptBeg.y);
         MoveToEx(hdc,ptEnd.x,ptEnd.y,NULL);
         LineTo(hdc,ptEnd.x+50,ptEnd.y);
      

  6.   

    #include <windows.h>LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
         static TCHAR szAppName[] = TEXT ("BlokOut2") ;
         HWND         hwnd ;
         MSG          msg ;
         WNDCLASS     wndclass ;     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
         wndclass.lpfnWndProc   = WndProc ;
         wndclass.cbClsExtra    = 0 ;
         wndclass.cbWndExtra    = 0 ;
         wndclass.hInstance     = hInstance ;
         wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
         wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
         wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
         wndclass.lpszMenuName  = NULL ;
         wndclass.lpszClassName = szAppName ;
         
         if (!RegisterClass (&wndclass))
         {
              MessageBox (NULL, TEXT ("Program requires Windows NT!"), 
                          szAppName, MB_ICONERROR) ;
              return 0 ;
         }     hwnd = CreateWindow (szAppName, TEXT ("Mouse Button & Capture Demo"),
                              WS_OVERLAPPEDWINDOW,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              NULL, NULL, hInstance, NULL) ;
         
         ShowWindow (hwnd, iCmdShow) ;
         UpdateWindow (hwnd) ;
         
         while (GetMessage (&msg, NULL, 0, 0))
         {
              TranslateMessage (&msg) ;
              DispatchMessage (&msg) ;
         }
         return msg.wParam ;
    }void DrawBoxOutline (HWND hwnd, POINT ptBeg, POINT ptEnd)
    {
         HDC hdc ;
         
         hdc = GetDC (hwnd) ;
         
         SetROP2 (hdc, R2_NOT) ;
         SelectObject (hdc, GetStockObject (NULL_BRUSH)) ;
         Rectangle (hdc, ptBeg.x, ptBeg.y, ptEnd.x, ptEnd.y) ;
         
         ReleaseDC (hwnd, hdc) ;
    }LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
         static BOOL  fBlocking, fValidBox ;
         static POINT ptBeg, ptEnd, ptBoxBeg, ptBoxEnd ;
         HDC          hdc ;
         PAINTSTRUCT  ps ;
         
         switch (message)
         {
         case WM_LBUTTONDOWN :
              ptBeg.x = ptEnd.x = LOWORD (lParam) ;
              ptBeg.y = ptEnd.y = HIWORD (lParam) ;
              
              DrawBoxOutline (hwnd, ptBeg, ptEnd) ;          SetCapture (hwnd) ;
              SetCursor (LoadCursor (NULL, IDC_CROSS)) ;
              
              fBlocking = TRUE ;
              return 0 ;
              
         case WM_MOUSEMOVE :
              if (fBlocking)
              {
                   SetCursor (LoadCursor (NULL, IDC_CROSS)) ;
                   
                   DrawBoxOutline (hwnd, ptBeg, ptEnd) ;
                   
                   ptEnd.x = LOWORD (lParam) ;
                   ptEnd.y = HIWORD (lParam) ;
                   
                   DrawBoxOutline (hwnd, ptBeg, ptEnd) ;
              }
              return 0 ;
              
         case WM_LBUTTONUP :
              if (fBlocking)
              {
                   DrawBoxOutline (hwnd, ptBeg, ptEnd) ;
                   
                   ptBoxBeg   = ptBeg ;
                   ptBoxEnd.x = LOWORD (lParam) ;
                   ptBoxEnd.y = HIWORD (lParam) ;
                   
                   ReleaseCapture () ;
                   SetCursor (LoadCursor (NULL, IDC_ARROW)) ;
                   
                   fBlocking = FALSE ;
                   fValidBox  = TRUE ;
                   
                   InvalidateRect (hwnd, NULL, TRUE) ;
              }
              return 0 ;
              
         case WM_CHAR :
              if (fBlocking & wParam == '\x1B')       // i.e., Escape
              {
                   DrawBoxOutline (hwnd, ptBeg, ptEnd) ;
                   ReleaseCapture () ;
                   SetCursor (LoadCursor (NULL, IDC_ARROW)) ;               fBlocking = FALSE ;
              }
              return 0 ;
              
         case WM_PAINT :
              hdc = BeginPaint (hwnd, &ps) ;
              
              if (fValidBox)
              {
                   SelectObject (hdc, GetStockObject (BLACK_BRUSH)) ;
                   Rectangle (hdc, ptBoxBeg.x, ptBoxBeg.y,
                        ptBoxEnd.x, ptBoxEnd.y) ;
              }
              
              if (fBlocking)
              {
                   SetROP2 (hdc, R2_NOT) ;
                   SelectObject (hdc, GetStockObject (NULL_BRUSH)) ;
                   Rectangle (hdc, ptBeg.x, ptBeg.y, ptEnd.x, ptEnd.y) ;
              }
              
              EndPaint (hwnd, &ps) ;
              return 0 ;
              
         case WM_DESTROY :
              PostQuitMessage (0) ;
              return 0 ;
         }
         return DefWindowProc (hwnd, message, wParam, lParam) ;
    }