说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

一个鼠标画图的小问题(关于刷新整个客户区)!!!

编辑:说三道四文库 发布时间:2018-04-26 03:59
HTML文档下载 WORD文档下载 PDF文档下载
一个鼠标画图的小问题(关于刷新整个客户区)!!!

 switch (message)
     {
//鼠标左键画图
 case WM_LBUTTONDOWN:
 iCount = 0;
 InvalidateRect(hwnd,NULL,FALSE);
  return 0;

//鼠标右键刷新整个客户区,变白。

//画几条线,但按下右键总有最后画的一条还在!
 case WM_RBUTTONDOWN:
 hdc = GetDC (hwnd);
 rect.left = 0;
      rect.top = 0;
         rect.right = LOWORD(lParam);
     rect.bottom = HIWORD(lParam);
 //单独用InvalidateRect(hwnd,NULL,TRUE);也不行。
 InvalidateRect(hwnd,NULL,TRUE);
         ReleaseDC (hwnd,hdc);
  return 0;
//
case WM_MOUSEMOVE:
 if( wParam & MK_LBUTTON && iCount < 1000 )
 {
 pt[iCount  ].x = LOWORD(lParam);
 pt[iCount  ].y = HIWORD(lParam);
 iCount++;

 hdc = GetDC (hwnd);
 InvalidateRect(hwnd,NULL,FALSE);
 ReleaseDC (hwnd,hdc);
 }  
 return 0;

     case WM_PAINT:
          hdc = BeginPaint (hwnd, &ps) ;

  for ( i=0; i < iCount - 1 ;i++)
    // for( j = i + 1; j < iCount; j++)
 {
 MoveToEx(hdc,pt[i].x,pt[i].y,NULL);
 LineTo (hdc,pt[i+1].x,pt[i+1].y);
 }
 EndPaint (hwnd, &ps) ;
          return 0 ;

我不知道你在:WM_RBUTTONDOWN和WM_MOUSEMOVE中使用GetDC()干什么用?
WM_MOUSEMOVE中使用GetDC()是为了鼠标在客户区中拖动时留下痕迹。

《Windows 程序设计》中用了GetDC()。



WM_RBUTTONDOWN我想让鼠标右键刷新客户区,使之变白。
没有实现,就乱试一下。的确不该用。
    switch (message)
     {

 case WM_LBUTTONDOWN:
 iCount = 0;
 InvalidateRect(hwnd,NULL,FALSE);
  return 0;

 case WM_RBUTTONDOWN:
 InvalidateRect(hwnd,NULL,TRUE);
  return 0;
             
 case WM_MOUSEMOVE:
 if( wParam & MK_LBUTTON && iCount < 1000 )
 {
 pt[iCount  ].x = LOWORD(lParam);
 pt[iCount  ].y = HIWORD(lParam);
 iCount++;
 
 hdc = GetDC (hwnd);
 InvalidateRect(hwnd,NULL,FALSE);
 ReleaseDC (hwnd,hdc);
 
 }
 
 return 0;

     case WM_PAINT:
          hdc = BeginPaint (hwnd, &ps) ;

  SetCursor(LoadCursor(NULL,IDC_WAIT));
  ShowCursor(TRUE);

  for ( i=0; i < iCount - 1 ;i++)
    // for( j = i + 1; j < iCount; j++)
 {
 MoveToEx(hdc,pt[i].x,pt[i].y,NULL);
 LineTo (hdc,pt[i+1].x,pt[i+1].y);
 }

 ShowCursor(FALSE);
 SetCursor ( LoadCursor(NULL,IDC_ARROW));
          
          EndPaint (hwnd, &ps) ;
          return 0 ;
鼠标右建点下后应该先把记录点的数组pt清空再InvalidateRect.因为InvalidateRect会导致
WM_PAINT消息啊。
这样好了!
 case WM_RBUTTONDOWN:
       iCount = 0;
       InvalidateRect(hwnd,NULL,TRUE);
       return 0;
          
谢谢!
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘