《Windows程序设计》之鼠标

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


你可能感兴趣的:(《Windows程序设计》之鼠标)