#include <windows.h>#include <stdio.h>HWND     MainHwnd;
HWND     TrackHwnd;
HWND     Hd;
POINT    point;
POINT    pos;
UINT     xCoor ;
UINT     yCoor ;
UINT     g_nXCoor;   
UINT     g_nYCoor; LRESULT CALLBACK WndProcMain (HWND hWnd, UINT message, WPARAM wParam ,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev,
   char * lpCmdLine, int nShowCmd )
   
{WNDCLASSEX     WndClassEx;//窗口类定义
WndClassEx.cbSize   = sizeof( WNDCLASSEX );
WndClassEx.style   = NULL;
WndClassEx.lpfnWndProc  = WndProcMain;WndClassEx.cbClsExtra  = 0;
WndClassEx.cbWndExtra  = 0;
WndClassEx.hInstance  = hInstance;
WndClassEx.hIcon   = LoadIcon( NULL, IDI_APPLICATION );  //窗口的最小化图标为默认图标
WndClassEx.hIconSm   = LoadIcon( NULL, IDI_APPLICATION ); 
WndClassEx.hCursor   = LoadCursor( NULL, IDC_ARROW );  //窗口采用箭头光标
WndClassEx.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);//窗口背景为灰色
WndClassEx.lpszMenuName  = NULL;
WndClassEx.lpszClassName = "MyWndClassMain";
::RegisterClassEx( &WndClassEx );  MainHwnd = CreateWindow ( "MyWndClassMain", "My First Windows", WS_OVERLAPPEDWINDOW,
        100, 100, 600, 600, NULL, NULL, hInstance, NULL);  
Hd = GetDesktopWindow();ShowWindow (MainHwnd, nShowCmd );
UpdateWindow(MainHwnd);MSG msg;
while( GetMessage( &msg,NULL,NULL,NULL ) )

TranslateMessage(&msg);  
DispatchMessage( &msg );
}
return 0;
}LRESULT CALLBACK WndProcMain (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
 switch( message )
 {
   case WM_MOUSEMOVE:   g_nXCoor = LOWORD( lParam );  
   g_nYCoor = HIWORD( lParam );     GetCursorPos(&pos);
   xCoor = pos.x;
   yCoor = pos.y;
   point.x = g_nXCoor;
   point.y = g_nYCoor;
   Hd = GetDesktopWindow();
 
//ClientToScreen(hWnd, &point);   InvalidateRect( NULL,NULL,TRUE );                   
                  /*RedrawWindow(NULL, 
                 NULL, 
                 NULL, 
                  RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_UPDATENOW | RDW_ALLCHILDREN); */
      case WM_LBUTTONDOWN:
    SetCapture(MainHwnd);
InvalidateRect(NULL,NULL,TRUE);
   break;
   case WM_LBUTTONUP:
    ReleaseCapture();
InvalidateRect(NULL,NULL,TRUE);
   break;  case WM_PAINT:


  HDC     hDC;
  RECT    rectClient;
  PAINTSTRUCT  PS;
  
  hDC = GetDC(NULL);
 
  GetWindowRect(Hd, &rectClient); //划线
  MoveToEx (hDC, pos.x, rectClient.top, NULL );
  LineTo (hDC, pos.x, rectClient.bottom);     MoveToEx (hDC, rectClient.left, pos.y, NULL );
  LineTo (hDC, rectClient.right, pos.y);    CHAR   strMousePosition[100];hDC = BeginPaint (hWnd, &PS); 
  sprintf (strMousePosition, "Mouse Pt: x= %4d y = %4d", pos.x, pos.y);
  TextOut (hDC, 0, 0, strMousePosition, strlen ( strMousePosition));//文字输出
  EndPaint(hWnd, &PS);  ReleaseDC(Hd,hDC);}
break;case WM_DESTROY:  
   PostQuitMessage ( 0 );   
break;default:  
   return DefWindowProc(hWnd, message, wParam, lParam );
}return TRUE;
}

解决方案 »

  1.   

    InvalidateRect(NULL,NULL,TRUE);
    -------->
    InvalidateRect(NULL,NULL,FALSE);
      

  2.   

     你想做图形编辑? MOUSEMOVE消息不要重画窗口,一般只有当一次编辑操作结束后才重画。
    如果操作简单的矩形可以用CRectTracker,编辑其它的图形就自己做一个类,做法可以参考CRectTracker.
    想抹掉以前化的内容可以看一下SetROP2这个函数,参数用R2_XORPEN。不懂可以再问