LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) { static POINT pt[MAXPOINT]; static int iCount; HDC hdc; int i,j; PAINTSTRUCT ps; switch(message) { case WM_MBUTTONDOWN: iCount=0; //将窗口放入到更新区域里面,但是不重画。 InvalidateRect(hwnd,NULL,NULL); return 0; case WM_MOUSEMOVE: //在鼠标按住鼠标左键,且总点数小于1000时,将点的坐标放入pt中,并画点。 if(wParam & MK_LBUTTON &&iCount<1000) { pt[iCount].x=LOWORD(lParam); pt[iCount++].y=HIWORD(lParam); hdc=GetDC(hwnd); SetPixel(hdc,LOWORD(lParam),HIWORD(lParam),0); ReleaseDC(hwnd,hdc); } return 0; case WM_LBUTTONUP: //关于最后一个参数,如果为TRUE时,系统会先先向窗口发关一个WM_ERASEBKGND消息,使背景重绘,然后再发送WM_PAINT //如果为FALSE,则只发送WM_PAINT InvalidateRect(hwnd,NULL,FALSE); 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[j].x,pt[j].y); } ShowCursor(FALSE); //设置鼠标形状,注意只有在光标不被使用的情况下才可设置 SetCursor(LoadCursor(NULL,IDC_ARROW)); EndPaint(hwnd,&ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd,message,wParam,lParam); }
上面为第7章CONNECT.c中回调函数代码,我加入了部分注释。本人认为最难理解的就是InvalidateRect(hwnd,NULL,FALSE);
关于这个问题,大家可以看一下
http://jokerkiss98.blog.sohu.com/171609682.html
http://blog.csdn.net/sdeeds/article/details/6859530