代码是书中的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。