《Windows程序设计》之鼠标滚轮

代码是书中的SYSTEM.C一部分。

直接上代码:

	case WM_CREATE:
		hdc=GetDC(hwnd);
		GetTextMetrics(hdc,&tm);
		cxChar=tm.tmAveCharWidth;
		cxCaps=(tm.tmPitchAndFamily & 1? 3:2)*cxChar/2;
		cyChar=tm.tmHeight+tm.tmExternalLeading;
		ReleaseDC(hwnd,hdc);

		iMaxWidth=40*cxChar+22*cxCaps;
		//这个地方需要注意一下,这里没有return 0,一开始怎么都没调试出来,最后才发现的这个问题。
		//没有return 0,这样才会直接调用WM_SETTINGCHANGE,不然是不会调用的。
	case WM_SETTINGCHANGE:
		SystemParametersInfo(SPI_GETWHEELSCROLLLINES,0,&ulScrollLines,0);
		if(ulScrollLines)
			//这里iDeltaPerLine是在根据控制面板中的设置而计算而来的。我电脑上是40
			iDeltaPerLine=WHEEL_DELTA/ulScrollLines;
		else
			iDeltaPerLine=0;
		return 0;
	case WM_MOUSEWHEEL:
		if(iDeltaPerLine==0)
			break;
		//一开始下面的wParam被我写成了lParam,无论怎么操作滚轮,屏幕都没有变化。
		//但是跟踪却显示调用了SendMessage,但是为什么没有变化,于是我做了一个测试。
		//用鼠标拖动滚动条放到中间,再滚动滚轮,这次就出来效果了,但是无论怎么滚动,滚动条都向上运动。
		//这就是为什么一开始滚动滚轮没有效果的原因了。
		iAccumDelta+=(short)HIWORD(wParam);//iAccumDelta只有120或-120两个值
		while(iAccumDelta>=iDeltaPerLine)
		{
			SendMessage(hwnd,WM_VSCROLL,SB_LINEUP,0);
			iAccumDelta-=iDeltaPerLine;
		}
		while(iAccumDelta<=-iDeltaPerLine)
		{
			SendMessage(hwnd,WM_VSCROLL,SB_LINEDOWN,0);
			iAccumDelta+=iDeltaPerLine;
		}
		return 0;

下面是WM_MOUSEWHEEL相关信息:

对于鼠标滑轮,可以提供非常友好的滚动操作,比如我们常常用滑轮滚动来控制滚动条,而编程需要知道的关键的信息一般就是

1.滚动的方向
2.滚动的大小

通过响应WM_MOUSEWHEEL消息可以得到有用的信息

(short)HIWORD(wParam) 返回一个滚动的大小,一般是120的倍数,正数代表滚动向前,负数代表向后

(short)LOWORD(wParam) 返回当前同时用鼠标键的时候按下了哪些键

系统只有更改了系统相关设置,才会调用WM_SETTINGCHANGE。

你可能感兴趣的:(编程,windows,测试)