1 //SYSMETS.H -- System metrics display structure
2 #include <Windows.h>
3
4 #define NUMLINES ((int) (sizeof(sysmetrics) / sizeof(sysmetrics[0])))
5
6 struct
7 {
8 int iIndex;
9 TCHAR *szLabel;
10 TCHAR *szDesc;
11 }
12 sysmetrics[] =
13 {
14 SM_CXSCREEN, TEXT("SM_CXSCREEN"), TEXT("Screen width in pixels"),
15 SM_CYSCREEN, TEXT("SM_CYSCREEN"), TEXT("Screen height in pixels"),
16 SM_CXVSCROLL, TEXT("SM_CXVSCROLL"), TEXT("Vertical scroll width"),
17 SM_CYHSCROLL, TEXT("SM_CYHSCROLL"), TEXT("Horizontal scroll height"),
18 SM_CYCAPTION, TEXT("SM_CYCAPTION"), TEXT("Caption bar height"),
19 SM_CXBORDER, TEXT("SM_CXBORDER"), TEXT("Window border width"),
20 SM_CYBORDER, TEXT("SM_CYBORDER"), TEXT("Window border height"),
21 SM_CXFIXEDFRAME, TEXT("SM_CXFIXEDFRAME"), TEXT("Dialog window frame width"),
22 SM_CYFIXEDFRAME, TEXT("SM_CYFIXEDFRAME"), TEXT("Dialog window frame height"),
23 SM_CYVTHUMB, TEXT("SM_CYVTHUMB"), TEXT("Vertical scroll thumb height"),
24 SM_CXHTHUMB, TEXT("SM_CXHTHUMB"), TEXT("Horizontal scroll thumb width"),
25 SM_CXICON, TEXT("SM_CXICON"), TEXT("Icon width"),
26 SM_CYICON, TEXT("SM_CYICON"), TEXT("Icon height"),
27 SM_CXCURSOR, TEXT("SM_CXCURSOR"), TEXT("Cursor width"),
28 SM_CYCURSOR, TEXT("SM_CYCURSOR"), TEXT("Cursor height"),
29 SM_CYMENU, TEXT("SM_CYMENU"), TEXT("Menu bar height"),
30 SM_CXFULLSCREEN, TEXT("SM_CXFULLSCREEN"), TEXT("Full screen client area width"),
31 SM_CYFULLSCREEN, TEXT("SM_CYFULLSCREEN"), TEXT("Full screen client area height"),
32 SM_CYKANJIWINDOW, TEXT("SM_CYKANJIWINDOW"), TEXT("Kanji window height"),
33 SM_MOUSEPRESENT, TEXT("SM_MOUSEPRESENT"), TEXT("Mouse present flag"),
34 SM_CYVSCROLL, TEXT("SM_CYVSCROLL"), TEXT("Vertical scroll arrow height"),
35 SM_CXHSCROLL, TEXT("SM_CXHSCROLL"), TEXT("Horizontal scroll arrow width"),
36 SM_DEBUG, TEXT("SM_DEBUG"), TEXT("Debug version flag"),
37 SM_SWAPBUTTON, TEXT("SM_SWAPBUTTON"), TEXT("Mouse buttons swapped flag"),
38 SM_CXMIN, TEXT("SM_CXMIN"), TEXT("Minimum window width"),
39 SM_CYMIN, TEXT("SM_CYMIN"), TEXT("Minimum window height"),
40 SM_CXSIZE, TEXT("SM_CXSIZE"), TEXT("Min/Max/Close button width"),
41 SM_CYSIZE, TEXT("SM_CYSIZE"), TEXT("Min/Max/Close button height"),
42 SM_CXSIZEFRAME, TEXT("SM_CXSIZEFRAME"), TEXT("Window sizing frame width"),
43 SM_CYSIZEFRAME, TEXT("SM_CYSIZEFRAME"), TEXT("Window sizing frame height"),
44 SM_CXMINTRACK, TEXT("SM_CXMINTRACK"), TEXT("Minimum window tracking width"),
45 SM_CYMINTRACK, TEXT("SM_CYMINTRACK"), TEXT("Minimum window tracking height"),
46 SM_CXDOUBLECLK, TEXT("SM_CXDOUBLECLK"), TEXT("Double click x tolerance"),
47 SM_CYDOUBLECLK, TEXT("SM_CYDOUBLECLK"), TEXT("Double click y tolerance"),
48 SM_CXICONSPACING, TEXT("SM_CXICONSPACING"), TEXT("Horizontal icon spacing"),
49 SM_CYICONSPACING, TEXT("SM_CYICONSPACING"), TEXT("Vertical icon spacing"),
50 SM_MENUDROPALIGNMENT, TEXT("SM_MENUDROPALIGMENT"), TEXT("Left or right menu drop"),
51 SM_PENWINDOWS, TEXT("SM_PENWINDOWS"), TEXT("Pen extensions installed"),
52 SM_DBCSENABLED, TEXT("SM-DBCSENABLED"), TEXT("Double-Byte Char Set enable"),
53 SM_CMOUSEBUTTONS, TEXT("SM_CMOUSEBUTTONS"), TEXT("Number of mouse buttons"),
54 SM_SECURE, TEXT("SM_SECURE"), TEXT("Security present flag"),
55 SM_CXEDGE, TEXT("SM_CXEDGE"), TEXT("3-D border width"),
56 SM_CYEDGE, TEXT("SM_CYEDGE"), TEXT("3-D border height"),
57 SM_CXMINSPACING, TEXT("SM_CXMINSPACING"), TEXT("Minimized window spacing width"),
58 SM_CYMINSPACING, TEXT("SM-CYMINSPACING"), TEXT("Minimized window spacing height"),
59 SM_CXSMICON, TEXT("SM_CXSMICON"), TEXT("Small icon width"),
60 SM_CYSMICON, TEXT("SM_CYSMICON"), TEXT("Small icon height"),
61 SM_CYSMCAPTION, TEXT("SM_CYSMCAPTION"), TEXT("Small caption height"),
62 SM_CXSMSIZE, TEXT("SM_CXSMSIZE"), TEXT("Small caption button width"),
63 SM_CYSMSIZE, TEXT("SM_CYSMSIZE"), TEXT("Small caption button height"),
64 SM_CXMENUSIZE, TEXT("SM_CXMENUSIZE"), TEXT("Menu bar button width"),
65 SM_CYMENUSIZE, TEXT("SM_CYMENUSIZE"), TEXT("Menu bar button height"),
66 SM_ARRANGE, TEXT("SM_ARRANGE"), TEXT("How minimized windows arranged"),
67 SM_CXMINIMIZED, TEXT("SM_CXMINIMIZED"), TEXT("Minimized window width"),
68 SM_CYMINIMIZED, TEXT("SM_CYMINIMIZED"), TEXT("Minimized window height"),
69 SM_CXMAXTRACK, TEXT("SM_CXMAXTRACK"), TEXT("Maximum draggable width"),
70 SM_CYMAXTRACK, TEXT("SM_CYMAXTRACK"), TEXT("Maximum draggable height"),
71 SM_CXMAXIMIZED, TEXT("SM_CXMAXIMIZED"), TEXT("Width of maximized window"),
72 SM_CYMAXIMIZED, TEXT("SM_CYMAXIMIZED"), TEXT("Height of maximized windwo"),
73 SM_NETWORK, TEXT("SM_NETWORK"), TEXT("Network present flag"),
74 SM_CLEANBOOT, TEXT("SM_CLEANBOOT"), TEXT("How system was booted"),
75 SM_CXDRAG, TEXT("SM_CXDRAG"), TEXT("Avoid drag x tolerance"),
76 SM_CYDRAG, TEXT("SM_CYDRAG"), TEXT("Avoid drag x tolerance"),
77 SM_SHOWSOUNDS, TEXT("SM_SHOWSOUNDS"), TEXT("Present sounds visually"),
78 SM_CXMENUCHECK, TEXT("SM_CXMENUCHECK"), TEXT("Menu check-mark width"),
79 SM_CYMENUCHECK, TEXT("SM_CYMENUCHECK"), TEXT("Menu check-mark height"),
80 SM_SLOWMACHINE, TEXT("SM_SLOWMACHINE"), TEXT("Slow processor flag"),
81 SM_MIDEASTENABLED, TEXT("SM_MIDEASTENABLE"), TEXT("Hebrew and Arabic enabled flag"),
82 SM_MOUSEWHEELPRESENT, TEXT("SM_MOUSEWHEELPRESENT"), TEXT("Mouse wheel present flag"),
83 SM_XVIRTUALSCREEN, TEXT("SM_XVIRTUALSCREEN"), TEXT("Virtual screen x origin"),
84 SM_YVIRTUALSCREEN, TEXT("SM_YVIRTUALSCREEN"), TEXT("Virtual screen y origin"),
85 SM_CXVIRTUALSCREEN, TEXT("SM_CXVIRTUALSCREEN"), TEXT("Virtual screen width"),
86 SM_CYVIRTUALSCREEN, TEXT("SM_CYVIRTUALSCREEN"), TEXT("Virtual screen height"),
87 SM_CMONITORS, TEXT("SM_CMONITORS"), TEXT("Number of monitors"),
88 SM_SAMEDISPLAYFORMAT, TEXT("SM_SAMEDISPLAYFORMAT"), TEXT("Same color format flag")
89 };
SYSMETS.H
1 /*-----------------------------------------------
2 SYSMETS4.C -- System Metrics Display Program No.4
3 (c) Charles Petzold, 1998
4 -----------------------------------------------*/
5
6 #include <Windows.h>
7 #include "SYSMETS.h"
8
9 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
10
11 int WINAPI WinMain( __in HINSTANCE hInstance
12 , __in_opt HINSTANCE hPrevInstance
13 , __in LPSTR lpCmdLine
14 , __in int nShowCmd )
15 {
16 static TCHAR szAppName[] = TEXT("SysMets4");
17 HWND hwnd;
18 MSG msg;
19 WNDCLASS wndclass;
20
21 wndclass.style = CS_HREDRAW | CS_VREDRAW;
22 wndclass.lpfnWndProc = WndProc;
23 wndclass.cbClsExtra = 0;
24 wndclass.cbWndExtra= 0;
25 wndclass.hInstance = hInstance;
26 wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
27 wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
28 wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
29 wndclass.lpszMenuName = NULL;
30 wndclass.lpszClassName = szAppName;
31
32 if (!RegisterClass(&wndclass))
33 {
34 MessageBox(hwnd, TEXT("Program requires Windows NT !")
35 , szAppName, MB_ICONERROR);
36 return 0;
37 }
38
39 hwnd = CreateWindow(szAppName, TEXT("Get System Metrics No.4")
40 , WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL
41 , CW_USEDEFAULT, CW_USEDEFAULT
42 , CW_USEDEFAULT, CW_USEDEFAULT
43 , NULL, NULL, hInstance, NULL);
44
45 ShowWindow(hwnd, nShowCmd);
46 UpdateWindow(hwnd);
47
48 while (GetMessage(&msg, NULL, 0, 0))
49 {
50 TranslateMessage(&msg);
51 DispatchMessage(&msg);
52 }
53
54 return msg.wParam;
55 }
56
57 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
58 {
59 static int cxChar, cxCaps, cyChar, cxClient, cyClient, iMaxWidth;
60 HDC hdc;
61 int i, x, y, iVertPos, iHorzPos, iPaintBeg, iPaintEnd;
62 PAINTSTRUCT ps;
63 SCROLLINFO si;
64 TCHAR szBuffer[10];
65 TEXTMETRIC tm;
66
67 switch (message)
68 {
69 case WM_CREATE:
70 hdc = GetDC(hwnd);
71 GetTextMetrics(hdc, &tm);
72 cxChar = tm.tmAveCharWidth;
73 cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2;
74 cyChar = tm.tmHeight + tm.tmExternalLeading;
75 ReleaseDC(hwnd, hdc);
76
77 //save the width of the three columns
78 iMaxWidth = 40 * cxChar + 22 * cxCaps;
79 return 0;
80
81 case WM_SIZE:
82 cxClient = LOWORD(lParam);
83 cyClient = HIWORD(lParam);
84
85 //set vertical scroll bar range and page size
86 si.cbSize = sizeof(si);
87 si.fMask = SIF_RANGE | SIF_PAGE;
88 si.nMin = 0;
89 si.nMax = NUMLINES - 1;
90 si.nPage = cyClient / cyChar;
91 SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
92
93 //set horizontal scroll bar range and page size
94 si.cbSize = sizeof(si);
95 si.fMask = SIF_RANGE | SIF_PAGE;
96 si.nMin = 0;
97 si.nMax = 2 + iMaxWidth / cxChar;
98 si.nPage = cxClient / cxChar;
99 SetScrollInfo(hwnd, SB_HORZ, &si, TRUE);
100 return 0;
101
102 case WM_VSCROLL:
103 //get all the vertical scroll bar information
104 si.cbSize= sizeof(si);
105 si.fMask = SIF_ALL;
106 GetScrollInfo(hwnd, SB_VERT, &si);
107
108 //save the position for comparison later on
109 iVertPos = si.nPos;
110
111 switch (LOWORD(wParam))
112 {
113 case SB_TOP:
114 si.nPos = si.nMin;
115 break;
116
117 case SB_BOTTOM:
118 si.nPos = si.nMax;
119 break;
120
121 case SB_LINEUP:
122 si.nPos -= 1;
123 break;
124
125 case SB_LINEDOWN:
126 si.nPos += 1;
127 break;
128
129 case SB_PAGEUP:
130 si.nPos -= si.nPage;
131 break;
132
133 case SB_PAGEDOWN:
134 si.nPos += si.nPage;
135 break;
136
137 case SB_THUMBTRACK:
138 si.nPos = si.nTrackPos;
139 break;
140
141 default:
142 break;
143 }
144
145 //Set the position and then retrieve it. Due to adjustments
146 //by windows it might not be the same as the value set.
147 si.fMask = SIF_POS;
148 SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
149 GetScrollInfo(hwnd, SB_VERT, &si);
150
151 //if the position has changed, scroll the window and update it
152 if (si.nPos != iVertPos)
153 {
154 ScrollWindow(hwnd, 0, cyChar * (iVertPos - si.nPos), NULL, NULL);
155 UpdateWindow(hwnd);
156 }
157 return 0;
158
159 case WM_HSCROLL:
160 //get all the horizontal scroll bar information
161 si.cbSize = sizeof(si);
162 si.fMask = SIF_ALL;
163
164 //save the position for comparison later on
165 GetScrollInfo(hwnd, SB_HORZ, &si);
166 iHorzPos = si.nPos;
167
168 switch (LOWORD(wParam))
169 {
170 case SB_LINELEFT:
171 si.nPos -= 1;
172 break;
173
174 case SB_LINERIGHT:
175 si.nPos += 1;
176 break;
177
178 case SB_PAGELEFT:
179 si.nPos -= si.nPage;
180 break;
181
182 case SB_PAGERIGHT:
183 si.nPos += si.nPage;
184 break;
185
186 case SB_THUMBPOSITION:
187 si.nPos = si.nTrackPos;
188 break;
189
190 default:
191 break;
192 }
193
194 //Set the position and then retrieve it. Due to adjustments
195 //by window it might not be the same as the value set.
196 si.fMask = SIF_POS;
197 SetScrollInfo(hwnd, SB_HORZ, &si, TRUE);
198 GetScrollInfo(hwnd, SB_HORZ, &si);
199
200 //if the position has changed, scroll the window.
201 if (si.nPos != iHorzPos)
202 {
203 ScrollWindow(hwnd, cxChar * (iHorzPos - si.nPos), 0, NULL, NULL);
204 UpdateWindow(hwnd);
205 }
206 return 0;
207
208 case WM_KEYDOWN:
209 switch (wParam)
210 {
211 case VK_HOME:
212 SendMessage(hwnd, WM_VSCROLL, SB_TOP, 0);
213 break;
214
215 case VK_END:
216 SendMessage(hwnd, WM_VSCROLL, SB_BOTTOM, 0);
217 break;
218
219 case VK_PRIOR:
220 SendMessage(hwnd, WM_VSCROLL, SB_PAGEUP, 0);
221 break;
222
223 case VK_NEXT:
224 SendMessage(hwnd, WM_VSCROLL, SB_PAGEDOWN, 0);
225 break;
226
227 case VK_UP:
228 SendMessage(hwnd, WM_VSCROLL, SB_LINEUP, 0);
229 break;
230
231 case VK_DOWN:
232 SendMessage(hwnd, WM_VSCROLL, SB_LINEDOWN, 0);
233 break;
234
235 case VK_LEFT:
236 SendMessage(hwnd, WM_HSCROLL, SB_PAGEUP, 0);
237 break;
238
239 case VK_RIGHT:
240 SendMessage(hwnd, WM_HSCROLL, SB_PAGEDOWN, 0);
241 break;
242 }
243 return 0;
244
245 case WM_PAINT:
246 hdc = BeginPaint(hwnd, &ps);
247
248 //get vertical scroll bar position
249 si.cbSize = sizeof(si);
250 si.fMask = SIF_POS;
251 GetScrollInfo(hwnd, SB_VERT, &si);
252 iVertPos = si.nPos;
253
254 //get horizontal scroll bar position
255 GetScrollInfo(hwnd, SB_HORZ, &si);
256 iHorzPos = si.nPos;
257
258 //find paintint limits
259 iPaintBeg = max(0, iVertPos + ps.rcPaint.top / cyChar);
260 iPaintEnd = min(NUMLINES - 1, iVertPos + ps.rcPaint.bottom / cyChar);
261
262 for (i = iPaintBeg; i <= iPaintEnd; ++i)
263 {
264 x = cxChar * (1 - iHorzPos);
265 y = cyChar * (i - iVertPos);
266
267 TextOut(hdc, x, y, sysmetrics[i].szLabel, lstrlen(sysmetrics[i].szLabel));
268
269 TextOut(hdc, x + 22 * cxCaps, y, sysmetrics[i].szDesc, lstrlen(sysmetrics[i].szDesc));
270
271 SetTextAlign(hdc, TA_RIGHT | TA_TOP);
272
273 TextOut(hdc, x + 22 * cxCaps + 40 * cxChar, y, szBuffer
274 , wsprintf(szBuffer, TEXT("%5d"), GetSystemMetrics(sysmetrics[i].iIndex)));
275
276 SetTextAlign(hdc, TA_LEFT | TA_TOP);
277 }
278
279 EndPaint(hwnd, &ps);
280 return 0;
281
282 case WM_DESTROY:
283 PostQuitMessage(0);
284 return 0;
285 }
286
287 return DefWindowProc(hwnd, message, wParam, lParam);
288 }
SYSMETS4.C
本文由澳门新葡亰1495app发布于网络技术,转载请注明出处:官网下载第六章 键盘(SYSMETS4)