鱼C论坛

 找回密码
 立即注册
查看: 1705|回复: 3

有关滚动条的问题,

[复制链接]
发表于 2013-11-1 12:31:59 | 显示全部楼层 |阅读模式
1鱼币
本帖最后由 付笑 于 2013-11-1 12:38 编辑

有两个程序

第一个滚动条程序:


  1. #define WINVER 0x0500
  2. #include <windows.h>


  3. #define NUMLINES ((int) (sizeof sysmetrics / sizeof sysmetrics [0]))

  4. struct
  5. {
  6. int iIndex ;
  7. TCHAR * szLabel ;
  8. TCHAR * szDesc ;
  9. }
  10. sysmetrics [] =
  11. {
  12. SM_CXSCREEN, TEXT ("SM_CXSCREEN"),
  13. TEXT ("Screen width in pixels"),
  14. SM_CYSCREEN, TEXT ("SM_CYSCREEN"),
  15. TEXT ("Screen height in pixels"),
  16. SM_CXVSCROLL, TEXT ("SM_CXVSCROLL"),
  17. TEXT ("Vertical scroll width"),
  18. SM_CYHSCROLL, TEXT ("SM_CYHSCROLL"),
  19. TEXT ("Horizontal scroll height"),
  20. SM_CYCAPTION, TEXT ("SM_CYCAPTION"),
  21. TEXT ("Caption bar height"),
  22. SM_CXBORDER, TEXT ("SM_CXBORDER"),
  23. TEXT ("Window border width"),
  24. SM_CYBORDER, TEXT ("SM_CYBORDER"),
  25. TEXT ("Window border height"),
  26. SM_CXFIXEDFRAME, TEXT ("SM_CXFIXEDFRAME"),
  27. TEXT ("Dialog window frame width"),
  28. SM_CYFIXEDFRAME, TEXT ("SM_CYFIXEDFRAME"),
  29. TEXT ("Dialog window frame height"),
  30. SM_CYVTHUMB, TEXT ("SM_CYVTHUMB"),
  31. TEXT ("Vertical scroll thumb height"),
  32. SM_CXHTHUMB, TEXT ("SM_CXHTHUMB"),
  33. TEXT ("Horizontal scroll thumb width"),
  34. SM_CXICON, TEXT ("SM_CXICON"),
  35. TEXT ("Icon width"),
  36. SM_CYICON, TEXT ("SM_CYICON"),
  37. TEXT ("Icon height"),
  38. SM_CXCURSOR, TEXT ("SM_CXCURSOR"),
  39. TEXT ("Cursor width"),
  40. SM_CYCURSOR, TEXT ("SM_CYCURSOR"),
  41. TEXT ("Cursor height"),
  42. SM_CYMENU, TEXT ("SM_CYMENU"),
  43. TEXT ("Menu bar height"),
  44. SM_CXFULLSCREEN, TEXT ("SM_CXFULLSCREEN"),
  45. TEXT ("Full screen client area width"),
  46. SM_CYFULLSCREEN, TEXT ("SM_CYFULLSCREEN"),
  47. TEXT ("Full screen client area height"),
  48. SM_CYKANJIWINDOW, TEXT ("SM_CYKANJIWINDOW"),
  49. TEXT ("Kanji window height"),
  50. SM_MOUSEPRESENT, TEXT ("SM_MOUSEPRESENT"),
  51. TEXT ("Mouse present flag"),
  52. SM_CYVSCROLL, TEXT ("SM_CYVSCROLL"),
  53. TEXT ("Vertical scroll arrow height"),
  54. SM_CXHSCROLL, TEXT ("SM_CXHSCROLL"),
  55. TEXT ("Horizontal scroll arrow width"),
  56. SM_DEBUG, TEXT ("SM_DEBUG"),
  57. TEXT ("Debug version flag"),
  58. SM_SWAPBUTTON, TEXT ("SM_SWAPBUTTON"),
  59. TEXT ("Mouse buttons swapped flag"),
  60. SM_CXMIN, TEXT ("SM_CXMIN"),
  61. TEXT ("Minimum window width"),
  62. SM_CYMIN, TEXT ("SM_CYMIN"),
  63. TEXT ("Minimum window height"),
  64. SM_CXSIZE, TEXT ("SM_CXSIZE"),
  65. TEXT ("Min/Max/Close button width"),
  66. SM_CYSIZE, TEXT ("SM_CYSIZE"),
  67. TEXT ("Min/Max/Close button height"),
  68. SM_CXSIZEFRAME, TEXT ("SM_CXSIZEFRAME"),
  69. TEXT ("Window sizing frame width"),
  70. SM_CYSIZEFRAME, TEXT ("SM_CYSIZEFRAME"),
  71. TEXT ("Window sizing frame height"),
  72. SM_CXMINTRACK, TEXT ("SM_CXMINTRACK"),
  73. TEXT ("Minimum window tracking width"),
  74. SM_CYMINTRACK, TEXT ("SM_CYMINTRACK"),
  75. TEXT ("Minimum window tracking height"),
  76. SM_CXDOUBLECLK, TEXT ("SM_CXDOUBLECLK"),
  77. TEXT ("Double click x tolerance"),
  78. SM_CYDOUBLECLK, TEXT ("SM_CYDOUBLECLK"),
  79. TEXT ("Double click y tolerance"),
  80. SM_CXICONSPACING, TEXT ("SM_CXICONSPACING"),
  81. TEXT ("Horizontal icon spacing"),
  82. SM_CYICONSPACING, TEXT ("SM_CYICONSPACING"),
  83. TEXT ("Vertical icon spacing"),
  84. SM_MENUDROPALIGNMENT, TEXT ("SM_MENUDROPALIGNMENT"),
  85. TEXT ("Left or right menu drop"),
  86. SM_PENWINDOWS, TEXT ("SM_PENWINDOWS"),
  87. TEXT ("Pen extensions installed"),
  88. SM_DBCSENABLED, TEXT ("SM_DBCSENABLED"),
  89. TEXT ("Double-Byte Char Set enabled"),
  90. SM_CMOUSEBUTTONS, TEXT ("SM_CMOUSEBUTTONS"),
  91. TEXT ("Number of mouse buttons"),
  92. SM_SECURE, TEXT ("SM_SECURE"),
  93. TEXT ("Security present flag"),
  94. SM_CXEDGE, TEXT ("SM_CXEDGE"),
  95. TEXT ("3-D border width"),
  96. SM_CYEDGE, TEXT ("SM_CYEDGE"),
  97. TEXT ("3-D border height"),
  98. SM_CXMINSPACING, TEXT ("SM_CXMINSPACING"),
  99. TEXT ("Minimized window spacing width"),
  100. SM_CYMINSPACING, TEXT ("SM_CYMINSPACING"),
  101. TEXT ("Minimized window spacing height"),
  102. SM_CXSMICON, TEXT ("SM_CXSMICON"),
  103. TEXT ("Small icon width"),
  104. SM_CYSMICON, TEXT ("SM_CYSMICON"),
  105. TEXT ("Small icon height"),
  106. SM_CYSMCAPTION, TEXT ("SM_CYSMCAPTION"),
  107. TEXT ("Small caption height"),
  108. SM_CXSMSIZE, TEXT ("SM_CXSMSIZE"),
  109. TEXT ("Small caption button width"),
  110. SM_CYSMSIZE, TEXT ("SM_CYSMSIZE"),
  111. TEXT ("Small caption button height"),
  112. SM_CXMENUSIZE, TEXT ("SM_CXMENUSIZE"),
  113. TEXT ("Menu bar button width"),
  114. SM_CYMENUSIZE, TEXT ("SM_CYMENUSIZE"),
  115. TEXT ("Menu bar button height"),
  116. SM_ARRANGE, TEXT ("SM_ARRANGE"),
  117. TEXT ("How minimized windows arranged"),
  118. SM_CXMINIMIZED, TEXT ("SM_CXMINIMIZED"),
  119. TEXT ("Minimized window width"),
  120. SM_CYMINIMIZED, TEXT ("SM_CYMINIMIZED"),
  121. TEXT ("Minimized window height"),
  122. SM_CXMAXTRACK, TEXT ("SM_CXMAXTRACK"),
  123. TEXT ("Maximum dragable width"),
  124. SM_CYMAXTRACK, TEXT ("SM_CYMAXTRACK"),
  125. TEXT ("Maximum dragable height"),
  126. SM_CXMAXIMIZED, TEXT ("SM_CXMAXIMIZED"),
  127. TEXT ("Width of maximized window"),
  128. SM_CYMAXIMIZED, TEXT ("SM_CYMAXIMIZED"),
  129. TEXT ("Height of maximized window"),
  130. SM_NETWORK, TEXT ("SM_NETWORK"),
  131. TEXT ("Network present flag"),
  132. SM_CLEANBOOT, TEXT ("SM_CLEANBOOT"),
  133. TEXT ("How system was booted"),
  134. SM_CXDRAG, TEXT ("SM_CXDRAG"),
  135. TEXT ("Avoid drag x tolerance"),
  136. SM_CYDRAG, TEXT ("SM_CYDRAG"),
  137. TEXT ("Avoid drag y tolerance"),
  138. SM_SHOWSOUNDS, TEXT ("SM_SHOWSOUNDS"),
  139. TEXT ("Present sounds visually"),
  140. SM_CXMENUCHECK, TEXT ("SM_CXMENUCHECK"),
  141. TEXT ("Menu check-mark width"),
  142. SM_CYMENUCHECK, TEXT ("SM_CYMENUCHECK"),
  143. TEXT ("Menu check-mark height"),
  144. SM_SLOWMACHINE, TEXT ("SM_SLOWMACHINE"),
  145. TEXT ("Slow processor flag"),
  146. SM_MIDEASTENABLED, TEXT ("SM_MIDEASTENABLED"),
  147. TEXT ("Hebrew and Arabic enabled flag"),
  148. SM_MOUSEWHEELPRESENT, TEXT ("SM_MOUSEWHEELPRESENT"),
  149. TEXT ("Mouse wheel present flag"),
  150. SM_XVIRTUALSCREEN, TEXT ("SM_XVIRTUALSCREEN"),
  151. TEXT ("Virtual screen x origin"),
  152. SM_YVIRTUALSCREEN, TEXT ("SM_YVIRTUALSCREEN"),
  153. TEXT ("Virtual screen y origin"),
  154. SM_CXVIRTUALSCREEN, TEXT ("SM_CXVIRTUALSCREEN"),
  155. TEXT ("Virtual screen width"),
  156. SM_CYVIRTUALSCREEN, TEXT ("SM_CYVIRTUALSCREEN"),
  157. TEXT ("Virtual screen height"),
  158. SM_CMONITORS, TEXT ("SM_CMONITORS"),
  159. TEXT ("Number of monitors"),
  160. SM_SAMEDISPLAYFORMAT, TEXT ("SM_SAMEDISPLAYFORMAT"),
  161. TEXT ("Same color format flag")
  162. } ;






  163. LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

  164. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
  165. PSTR szCmdLine, int iCmdShow)
  166. {
  167. static TCHAR szAppName[] = TEXT ("SysMets2") ;
  168. HWND hwnd ;
  169. MSG msg ;
  170. WNDCLASS wndclass ;

  171. wndclass.style = CS_HREDRAW | CS_VREDRAW ;
  172. wndclass.lpfnWndProc = WndProc ;
  173. wndclass.cbClsExtra = 0 ;
  174. wndclass.cbWndExtra = 0 ;
  175. wndclass.hInstance = hInstance ;
  176. wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
  177. wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
  178. wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
  179. wndclass.lpszMenuName = NULL ;
  180. wndclass.lpszClassName = szAppName ;

  181. if (!RegisterClass (&wndclass))
  182. {
  183. MessageBox (NULL, TEXT ("This program requires Windows NT!"),
  184. szAppName, MB_ICONERROR) ;
  185. return 0 ;
  186. }

  187. hwnd = CreateWindow (szAppName, TEXT ("Get System Metrics No. 2"),
  188. WS_OVERLAPPEDWINDOW | WS_VSCROLL,
  189. CW_USEDEFAULT, CW_USEDEFAULT,
  190. CW_USEDEFAULT, CW_USEDEFAULT,
  191. NULL, NULL, hInstance, NULL) ;

  192. ShowWindow (hwnd, iCmdShow) ;
  193. UpdateWindow (hwnd) ;

  194. while (GetMessage (&msg, NULL, 0, 0))
  195. {
  196. TranslateMessage (&msg) ;
  197. DispatchMessage (&msg) ;
  198. }
  199. return msg.wParam ;
  200. }

  201. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  202. {
  203. static int cxChar, cxCaps, cyChar, cyClient, iVscrollPos ;
  204. HDC hdc ;
  205. int i, y ;
  206. PAINTSTRUCT ps ;
  207. TCHAR szBuffer[10] ;
  208. TEXTMETRIC tm ;

  209. switch (message)
  210. {
  211. case WM_CREATE:
  212. hdc = GetDC (hwnd) ;

  213. GetTextMetrics (hdc, &tm) ;
  214. cxChar = tm.tmAveCharWidth ;
  215. cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ;
  216. cyChar = tm.tmHeight + tm.tmExternalLeading ;

  217. ReleaseDC (hwnd, hdc) ;

  218. SetScrollRange (hwnd, SB_VERT, 0, NUMLINES - 1, FALSE) ;
  219. SetScrollPos (hwnd, SB_VERT, iVscrollPos, TRUE) ;
  220. return 0 ;

  221. case WM_SIZE:
  222. cyClient = HIWORD (lParam) ;
  223. return 0 ;

  224. case WM_VSCROLL:
  225. switch (LOWORD (wParam))
  226. {
  227. case SB_LINEUP:
  228. iVscrollPos -= 1 ;
  229. break ;

  230. case SB_LINEDOWN:
  231. iVscrollPos += 1 ;
  232. break ;

  233. case SB_PAGEUP:
  234. iVscrollPos -= cyClient / cyChar ;
  235. break ;

  236. case SB_PAGEDOWN:
  237. iVscrollPos += cyClient / cyChar ;
  238. break ;

  239. case SB_THUMBPOSITION:
  240. iVscrollPos = HIWORD (wParam) ;
  241. break ;

  242. default :
  243. break ;
  244. }

  245. iVscrollPos = max (0, min (iVscrollPos, NUMLINES - 1)) ;

  246. if (iVscrollPos != GetScrollPos (hwnd, SB_VERT))
  247. {
  248. SetScrollPos (hwnd, SB_VERT, iVscrollPos, TRUE) ;
  249. InvalidateRect (hwnd, NULL, TRUE) ;
  250. }
  251. return 0 ;

  252. case WM_PAINT:
  253. hdc = BeginPaint (hwnd, &ps) ;

  254. for (i = 0 ; i < NUMLINES ; i++)
  255. {
  256. y = cyChar * (i - iVscrollPos) ;

  257. TextOut (hdc, 0, y,
  258. sysmetrics[i].szLabel,
  259. lstrlen (sysmetrics[i].szLabel)) ;

  260. TextOut (hdc, 22 * cxCaps, y,
  261. sysmetrics[i].szDesc,
  262. lstrlen (sysmetrics[i].szDesc)) ;

  263. SetTextAlign (hdc, TA_RIGHT | TA_TOP) ;

  264. TextOut (hdc, 22 * cxCaps + 40 * cxChar, y, szBuffer,
  265. wsprintf (szBuffer, TEXT ("%5d"),
  266. GetSystemMetrics (sysmetrics[i].iIndex))) ;

  267. SetTextAlign (hdc, TA_LEFT | TA_TOP) ;
  268. }
  269. EndPaint (hwnd, &ps) ;
  270. return 0 ;

  271. case WM_DESTROY:
  272. PostQuitMessage (0) ;
  273. return 0 ;
  274. }
  275. return DefWindowProc (hwnd, message, wParam, lParam) ;
  276. }
复制代码

第二个滚动条程序:







  1. #define WINVER 0x0500
  2. #include <windows.h>

  3. #define NUMLINES ((int) (sizeof sysmetrics / sizeof sysmetrics [0]))
  4. struct
  5. {
  6.      int     iIndex ;
  7.      TCHAR * szLabel ;
  8.      TCHAR * szDesc ;
  9. }
  10. sysmetrics [] =
  11. {
  12.      SM_CXSCREEN,             TEXT ("SM_CXSCREEN"),              
  13.                               TEXT ("Screen width in pixels"),
  14.      SM_CYSCREEN,             TEXT ("SM_CYSCREEN"),              
  15.                               TEXT ("Screen height in pixels"),
  16.      SM_CXVSCROLL,            TEXT ("SM_CXVSCROLL"),            
  17.                               TEXT ("Vertical scroll width"),
  18.      SM_CYHSCROLL,            TEXT ("SM_CYHSCROLL"),            
  19.                               TEXT ("Horizontal scroll height"),
  20.      SM_CYCAPTION,            TEXT ("SM_CYCAPTION"),            
  21.                               TEXT ("Caption bar height"),
  22.      SM_CXBORDER,             TEXT ("SM_CXBORDER"),              
  23.                               TEXT ("Window border width"),
  24.      SM_CYBORDER,             TEXT ("SM_CYBORDER"),              
  25.                               TEXT ("Window border height"),
  26.      SM_CXFIXEDFRAME,         TEXT ("SM_CXFIXEDFRAME"),         
  27.                               TEXT ("Dialog window frame width"),
  28.      SM_CYFIXEDFRAME,         TEXT ("SM_CYFIXEDFRAME"),         
  29.                               TEXT ("Dialog window frame height"),
  30.      SM_CYVTHUMB,             TEXT ("SM_CYVTHUMB"),              
  31.                               TEXT ("Vertical scroll thumb height"),
  32.      SM_CXHTHUMB,             TEXT ("SM_CXHTHUMB"),              
  33.                               TEXT ("Horizontal scroll thumb width"),
  34.      SM_CXICON,               TEXT ("SM_CXICON"),               
  35.                               TEXT ("Icon width"),
  36.      SM_CYICON,               TEXT ("SM_CYICON"),               
  37.                               TEXT ("Icon height"),
  38.      SM_CXCURSOR,             TEXT ("SM_CXCURSOR"),              
  39.                               TEXT ("Cursor width"),
  40.      SM_CYCURSOR,             TEXT ("SM_CYCURSOR"),              
  41.                               TEXT ("Cursor height"),
  42.      SM_CYMENU,               TEXT ("SM_CYMENU"),               
  43.                               TEXT ("Menu bar height"),
  44.      SM_CXFULLSCREEN,         TEXT ("SM_CXFULLSCREEN"),         
  45.                               TEXT ("Full screen client area width"),
  46.      SM_CYFULLSCREEN,         TEXT ("SM_CYFULLSCREEN"),         
  47.                               TEXT ("Full screen client area height"),
  48.      SM_CYKANJIWINDOW,        TEXT ("SM_CYKANJIWINDOW"),         
  49.                               TEXT ("Kanji window height"),
  50.      SM_MOUSEPRESENT,         TEXT ("SM_MOUSEPRESENT"),         
  51.                               TEXT ("Mouse present flag"),
  52.      SM_CYVSCROLL,            TEXT ("SM_CYVSCROLL"),            
  53.                               TEXT ("Vertical scroll arrow height"),
  54.      SM_CXHSCROLL,            TEXT ("SM_CXHSCROLL"),            
  55.                               TEXT ("Horizontal scroll arrow width"),
  56.      SM_DEBUG,                TEXT ("SM_DEBUG"),                 
  57.                               TEXT ("Debug version flag"),
  58.      SM_SWAPBUTTON,           TEXT ("SM_SWAPBUTTON"),            
  59.                               TEXT ("Mouse buttons swapped flag"),
  60.      SM_CXMIN,                TEXT ("SM_CXMIN"),                 
  61.                               TEXT ("Minimum window width"),
  62.      SM_CYMIN,                TEXT ("SM_CYMIN"),                 
  63.                               TEXT ("Minimum window height"),
  64.      SM_CXSIZE,               TEXT ("SM_CXSIZE"),               
  65.                               TEXT ("Min/Max/Close button width"),
  66.      SM_CYSIZE,               TEXT ("SM_CYSIZE"),               
  67.                               TEXT ("Min/Max/Close button height"),
  68.      SM_CXSIZEFRAME,          TEXT ("SM_CXSIZEFRAME"),           
  69.                               TEXT ("Window sizing frame width"),
  70.      SM_CYSIZEFRAME,          TEXT ("SM_CYSIZEFRAME"),           
  71.                               TEXT ("Window sizing frame height"),
  72.      SM_CXMINTRACK,           TEXT ("SM_CXMINTRACK"),            
  73.                               TEXT ("Minimum window tracking width"),
  74.      SM_CYMINTRACK,           TEXT ("SM_CYMINTRACK"),            
  75.                               TEXT ("Minimum window tracking height"),
  76.      SM_CXDOUBLECLK,          TEXT ("SM_CXDOUBLECLK"),           
  77.                               TEXT ("Double click x tolerance"),
  78.      SM_CYDOUBLECLK,          TEXT ("SM_CYDOUBLECLK"),           
  79.                               TEXT ("Double click y tolerance"),
  80.      SM_CXICONSPACING,        TEXT ("SM_CXICONSPACING"),         
  81.                               TEXT ("Horizontal icon spacing"),
  82.      SM_CYICONSPACING,        TEXT ("SM_CYICONSPACING"),         
  83.                               TEXT ("Vertical icon spacing"),
  84.      SM_MENUDROPALIGNMENT,    TEXT ("SM_MENUDROPALIGNMENT"),     
  85.                               TEXT ("Left or right menu drop"),
  86.      SM_PENWINDOWS,           TEXT ("SM_PENWINDOWS"),            
  87.                               TEXT ("Pen extensions installed"),
  88.      SM_DBCSENABLED,          TEXT ("SM_DBCSENABLED"),           
  89.                               TEXT ("Double-Byte Char Set enabled"),
  90.      SM_CMOUSEBUTTONS,        TEXT ("SM_CMOUSEBUTTONS"),         
  91.                               TEXT ("Number of mouse buttons"),
  92.      SM_SECURE,               TEXT ("SM_SECURE"),               
  93.                               TEXT ("Security present flag"),
  94.      SM_CXEDGE,               TEXT ("SM_CXEDGE"),               
  95.                               TEXT ("3-D border width"),
  96.      SM_CYEDGE,               TEXT ("SM_CYEDGE"),               
  97.                               TEXT ("3-D border height"),
  98.      SM_CXMINSPACING,         TEXT ("SM_CXMINSPACING"),         
  99.                               TEXT ("Minimized window spacing width"),
  100.      SM_CYMINSPACING,         TEXT ("SM_CYMINSPACING"),         
  101.                               TEXT ("Minimized window spacing height"),
  102.      SM_CXSMICON,             TEXT ("SM_CXSMICON"),              
  103.                               TEXT ("Small icon width"),
  104.      SM_CYSMICON,             TEXT ("SM_CYSMICON"),              
  105.                               TEXT ("Small icon height"),
  106.      SM_CYSMCAPTION,          TEXT ("SM_CYSMCAPTION"),           
  107.                               TEXT ("Small caption height"),
  108.      SM_CXSMSIZE,             TEXT ("SM_CXSMSIZE"),              
  109.                               TEXT ("Small caption button width"),
  110.      SM_CYSMSIZE,             TEXT ("SM_CYSMSIZE"),              
  111.                               TEXT ("Small caption button height"),
  112.      SM_CXMENUSIZE,           TEXT ("SM_CXMENUSIZE"),            
  113.                               TEXT ("Menu bar button width"),
  114.      SM_CYMENUSIZE,           TEXT ("SM_CYMENUSIZE"),            
  115.                               TEXT ("Menu bar button height"),
  116.      SM_ARRANGE,              TEXT ("SM_ARRANGE"),               
  117.                               TEXT ("How minimized windows arranged"),
  118.      SM_CXMINIMIZED,          TEXT ("SM_CXMINIMIZED"),           
  119.                               TEXT ("Minimized window width"),
  120.      SM_CYMINIMIZED,          TEXT ("SM_CYMINIMIZED"),           
  121.                               TEXT ("Minimized window height"),
  122.      SM_CXMAXTRACK,           TEXT ("SM_CXMAXTRACK"),            
  123.                               TEXT ("Maximum dragable width"),
  124.      SM_CYMAXTRACK,           TEXT ("SM_CYMAXTRACK"),            
  125.                               TEXT ("Maximum dragable height"),
  126.      SM_CXMAXIMIZED,          TEXT ("SM_CXMAXIMIZED"),           
  127.                               TEXT ("Width of maximized window"),
  128.      SM_CYMAXIMIZED,          TEXT ("SM_CYMAXIMIZED"),           
  129.                               TEXT ("Height of maximized window"),
  130.      SM_NETWORK,              TEXT ("SM_NETWORK"),               
  131.                               TEXT ("Network present flag"),
  132.      SM_CLEANBOOT,            TEXT ("SM_CLEANBOOT"),            
  133.                               TEXT ("How system was booted"),
  134.      SM_CXDRAG,               TEXT ("SM_CXDRAG"),               
  135.                               TEXT ("Avoid drag x tolerance"),
  136.      SM_CYDRAG,               TEXT ("SM_CYDRAG"),               
  137.                               TEXT ("Avoid drag y tolerance"),
  138.      SM_SHOWSOUNDS,           TEXT ("SM_SHOWSOUNDS"),            
  139.                               TEXT ("Present sounds visually"),
  140.      SM_CXMENUCHECK,          TEXT ("SM_CXMENUCHECK"),           
  141.                               TEXT ("Menu check-mark width"),
  142.      SM_CYMENUCHECK,          TEXT ("SM_CYMENUCHECK"),           
  143.                               TEXT ("Menu check-mark height"),
  144.      SM_SLOWMACHINE,          TEXT ("SM_SLOWMACHINE"),           
  145.                               TEXT ("Slow processor flag"),
  146.      SM_MIDEASTENABLED,       TEXT ("SM_MIDEASTENABLED"),        
  147.                               TEXT ("Hebrew and Arabic enabled flag"),
  148.      SM_MOUSEWHEELPRESENT,    TEXT ("SM_MOUSEWHEELPRESENT"),     
  149.                               TEXT ("Mouse wheel present flag"),
  150.      SM_XVIRTUALSCREEN,       TEXT ("SM_XVIRTUALSCREEN"),        
  151.                               TEXT ("Virtual screen x origin"),
  152.      SM_YVIRTUALSCREEN,       TEXT ("SM_YVIRTUALSCREEN"),        
  153.                               TEXT ("Virtual screen y origin"),
  154.      SM_CXVIRTUALSCREEN,      TEXT ("SM_CXVIRTUALSCREEN"),      
  155.                               TEXT ("Virtual screen width"),
  156.      SM_CYVIRTUALSCREEN,      TEXT ("SM_CYVIRTUALSCREEN"),      
  157.                               TEXT ("Virtual screen height"),
  158.      SM_CMONITORS,            TEXT ("SM_CMONITORS"),            
  159.                               TEXT ("Number of monitors"),
  160.      SM_SAMEDISPLAYFORMAT,    TEXT ("SM_SAMEDISPLAYFORMAT"),     
  161.                               TEXT ("Same color format flag")
  162. } ;



  163. LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

  164. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
  165. PSTR szCmdLine, int iCmdShow)
  166. {
  167. static TCHAR szAppName[] = TEXT ("SysMets3") ;
  168. HWND hwnd ;
  169. MSG msg ;
  170. WNDCLASS wndclass ;

  171. wndclass.style = CS_HREDRAW | CS_VREDRAW ;
  172. wndclass.lpfnWndProc = WndProc ;
  173. wndclass.cbClsExtra = 0 ;
  174. wndclass.cbWndExtra = 0 ;
  175. wndclass.hInstance = hInstance ;
  176. wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
  177. wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
  178. wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
  179. wndclass.lpszMenuName = NULL ;
  180. wndclass.lpszClassName = szAppName ;

  181. if (!RegisterClass (&wndclass))
  182. {
  183. MessageBox (NULL, TEXT ("Program requires Windows NT!"),
  184. szAppName, MB_ICONERROR) ;
  185. return 0 ;
  186. }

  187. hwnd = CreateWindow (szAppName, TEXT ("Get System Metrics No. 3"),
  188. WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL,
  189. CW_USEDEFAULT, CW_USEDEFAULT,
  190. CW_USEDEFAULT, CW_USEDEFAULT,
  191. NULL, NULL, hInstance, NULL) ;

  192. ShowWindow (hwnd, iCmdShow) ;
  193. UpdateWindow (hwnd) ;

  194. while (GetMessage (&msg, NULL, 0, 0))
  195. {
  196. TranslateMessage (&msg) ;
  197. DispatchMessage (&msg) ;
  198. }
  199. return msg.wParam ;
  200. }

  201. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  202. {
  203. static int cxChar, cxCaps, cyChar, cxClient, cyClient, iMaxWidth ;
  204. HDC hdc ;
  205. int i, x, y, iVertPos, iHorzPos, iPaintBeg, iPaintEnd ;
  206. PAINTSTRUCT ps ;
  207. SCROLLINFO si ;
  208. TCHAR szBuffer[10] ;
  209. TEXTMETRIC tm ;

  210. switch (message)
  211. {
  212. case WM_CREATE:
  213. hdc = GetDC (hwnd) ;

  214. GetTextMetrics (hdc, &tm) ;
  215. cxChar = tm.tmAveCharWidth ;
  216. cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ;
  217. cyChar = tm.tmHeight + tm.tmExternalLeading ;

  218. ReleaseDC (hwnd, hdc) ;

  219. // Save the width of the three columns

  220. iMaxWidth = 40 * cxChar + 22 * cxCaps ;
  221. return 0 ;

  222. case WM_SIZE:
  223. cxClient = LOWORD (lParam) ;
  224. cyClient = HIWORD (lParam) ;

  225. // Set vertical scroll bar range and page size

  226. si.cbSize = sizeof (si) ;
  227. si.fMask = SIF_RANGE | SIF_PAGE ;
  228. si.nMin = 0 ;
  229. si.nMax = NUMLINES - 1 ;
  230. si.nPage = cyClient / cyChar ;
  231. SetScrollInfo (hwnd, SB_VERT, &si, TRUE) ;

  232. // Set horizontal scroll bar range and page size

  233. si.cbSize = sizeof (si) ;
  234. si.fMask = SIF_RANGE | SIF_PAGE ;
  235. si.nMin = 0 ;
  236. si.nMax = 2 + iMaxWidth / cxChar ;
  237. si.nPage = cxClient / cxChar ;
  238. SetScrollInfo (hwnd, SB_HORZ, &si, TRUE) ;
  239. return 0 ;

  240. case WM_VSCROLL:
  241. // Get all the vertial scroll bar information

  242. si.cbSize = sizeof (si) ;
  243. si.fMask = SIF_ALL ;
  244. GetScrollInfo (hwnd, SB_VERT, &si) ;

  245. // Save the position for comparison later on

  246. iVertPos = si.nPos ;

  247. switch (LOWORD (wParam))
  248. {
  249. case SB_TOP:
  250. si.nPos = si.nMin ;
  251. break ;

  252. case SB_BOTTOM:
  253. si.nPos = si.nMax ;
  254. break ;

  255. case SB_LINEUP:
  256. si.nPos -= 1 ;
  257. break ;

  258. case SB_LINEDOWN:
  259. si.nPos += 1 ;
  260. break ;

  261. case SB_PAGEUP:
  262. si.nPos -= si.nPage ;
  263. break ;

  264. case SB_PAGEDOWN:
  265. si.nPos += si.nPage ;
  266. break ;

  267. case SB_THUMBTRACK:
  268. si.nPos = si.nTrackPos ;
  269. break ;

  270. default:
  271. break ;
  272. }
  273. // Set the position and then retrieve it. Due to adjustments
  274. // by Windows it may not be the same as the value set.

  275. si.fMask = SIF_POS ;
  276. SetScrollInfo (hwnd, SB_VERT, &si, TRUE) ;
  277. GetScrollInfo (hwnd, SB_VERT, &si) ;

  278. // If the position has changed, scroll the window and update it

  279. if (si.nPos != iVertPos)
  280. {
  281. ScrollWindow (hwnd, 0, cyChar * (iVertPos - si.nPos),
  282. NULL, NULL) ;                                                                                      ////ScrollWindow函数
  283. UpdateWindow (hwnd) ;
  284. }
  285. return 0 ;

  286. case WM_HSCROLL:
  287. // Get all the vertial scroll bar information

  288. si.cbSize = sizeof (si) ;
  289. si.fMask = SIF_ALL ;

  290. // Save the position for comparison later on

  291. GetScrollInfo (hwnd, SB_HORZ, &si) ;
  292. iHorzPos = si.nPos ;

  293. switch (LOWORD (wParam))
  294. {
  295. case SB_LINELEFT:
  296. si.nPos -= 1 ;
  297. break ;

  298. case SB_LINERIGHT:
  299. si.nPos += 1 ;
  300. break ;

  301. case SB_PAGELEFT:
  302. si.nPos -= si.nPage ;
  303. break ;

  304. case SB_PAGERIGHT:
  305. si.nPos += si.nPage ;
  306. break ;

  307. case SB_THUMBPOSITION:
  308. si.nPos = si.nTrackPos ;
  309. break ;

  310. default :
  311. break ;
  312. }
  313. // Set the position and then retrieve it. Due to adjustments
  314. // by Windows it may not be the same as the value set.

  315. si.fMask = SIF_POS ;
  316. SetScrollInfo (hwnd, SB_HORZ, &si, TRUE) ;
  317. GetScrollInfo (hwnd, SB_HORZ, &si) ;

  318. // If the position has changed, scroll the window

  319. if (si.nPos != iHorzPos)
  320. {
  321. ScrollWindow (hwnd, cxChar * (iHorzPos - si.nPos), 0,
  322. NULL, NULL) ;                                                                        //ScrollWindow函数
  323. }
  324. return 0 ;

  325. case WM_PAINT :
  326. hdc = BeginPaint (hwnd, &ps) ;

  327. // Get vertical scroll bar position

  328. si.cbSize = sizeof (si) ;
  329. si.fMask = SIF_POS ;
  330. GetScrollInfo (hwnd, SB_VERT, &si) ;
  331. iVertPos = si.nPos ;

  332. // Get horizontal scroll bar position

  333. GetScrollInfo (hwnd, SB_HORZ, &si) ;
  334. iHorzPos = si.nPos ;

  335. // Find painting limits

  336. iPaintBeg = max (0, iVertPos + ps.rcPaint.top / cyChar) ;
  337. iPaintEnd = min (NUMLINES - 1,
  338. iVertPos + ps.rcPaint.bottom / cyChar) ;

  339. for (i = iPaintBeg ; i <= iPaintEnd ; i++)
  340. {
  341. x = cxChar * (1 - iHorzPos) ;
  342. y = cyChar * (i - iVertPos) ;

  343. TextOut (hdc, x, y,
  344. sysmetrics[i].szLabel,
  345. lstrlen (sysmetrics[i].szLabel)) ;

  346. TextOut (hdc, x + 22 * cxCaps, y,
  347. sysmetrics[i].szDesc,
  348. lstrlen (sysmetrics[i].szDesc)) ;

  349. SetTextAlign (hdc, TA_RIGHT | TA_TOP) ;

  350. TextOut (hdc, x + 22 * cxCaps + 40 * cxChar, y, szBuffer,
  351. wsprintf (szBuffer, TEXT ("%5d"),
  352. GetSystemMetrics (sysmetrics[i].iIndex))) ;

  353. SetTextAlign (hdc, TA_LEFT | TA_TOP) ;
  354. }

  355. EndPaint (hwnd, &ps) ;
  356. return 0 ;

  357. case WM_DESTROY :
  358. PostQuitMessage (0) ;
  359. return 0 ;
  360. }
  361. return DefWindowProc (hwnd, message, wParam, lParam) ;
  362. }
复制代码

我的问题是,第一个程序没有用到ScrollWindow()函数,可以实现屏幕滚动

但是第二个程序把ScrollWindow()函数注释掉后,屏幕就不滚动了,为什么了,ScrollWindow()函数是怎么实现滚动的啊,
这个函数是在此WM_SIZE消息里调用的啊,在WM_PAINT消息处理过程里他是怎么发生作用的呢

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-11-1 17:17:35 | 显示全部楼层
ScrollWindow的操作是根据参数的滚动范围 算出 不会滚出显示区域的矩形,对这部分像素直接BitBlt到新的合适位置,对于滚动出现的新的矩形,擦除背景,设该矩形为无效区域

源代码中的紧随的UpdateWindow没有太大意义,窗口有无效区域会触发WM_PAINT,新的区域也会很及时的刷新

替换成InvalidateRect(hwnd, NULL, TRUE);效果是一样的,但由于刚擦除了整个背景紧接着又画图,两个显示的反差太大,在人看来就是一种闪烁
使用ScrollWindow,大部分的区域是一次性BitBlt更新的,没有擦除背景这个显示的中间状态,只有新出现的矩形经过 擦除 和 重绘的过程,所以闪烁现象不明显得多

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-11-1 17:19:24 | 显示全部楼层
问题如下:
    1. 我大约知道ScrollWindow(程序第50行)是滚动窗口的,但是它到底是怎样的一个实现原理呢?什么是“未被scrollWindow覆盖的区域”?
    2. UpdateWindow(程序第51行)在这里似乎没有什么作用,网上查的说“只绘制未被滚动操作覆盖的一行,加快绘制速度”,没明白什么意思?
    3. 在WM_PAINT下面,其实还是计算出了显示在客户区的行数的范围,只绘制了这个范围内的数据。把ScrollWindow(hwnd, 0, cyChar*(iVPos-si.nPos), NULL, NULL);替换成InvalidateRect(hwnd, NULL, TRUE);也能实现同样的效果,唯一不同的是使用InvalidateRect时屏幕会闪烁。感觉ScrollWindow在这里体现不出比InvalidateRect有更大的优越性?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-8-18 09:51:54 | 显示全部楼层
好多,帮顶
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-20 21:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表