/*-------------------------------------------------------- SYSMETS2.C -- Ermittlung der Maße des Systems, Version 2 (c) Charles Petzold, 1992 --------------------------------------------------------*/ #include #include "sysmets.h" #define NODOSTEXT // Quelltext im IBM-Zeichensatz void Oem_Ansi(char *OemStr, char *AnsiStr) { #ifdef DOSTEXT OemToAnsi(OemStr, AnsiStr); #else lstrcpy(AnsiStr, OemStr); #endif } /* Oem_Ansi */ /* already defined in windef.h #define min(a,b) (((a) < (b)) ? (a) : (b)) #define max(a,b) (((a) > (b)) ? (a) : (b)) */ long FAR PASCAL _export WndProc(HWND, UINT, UINT, LONG); /* added following code snippet to avoid warning when linking under cygwin */ #ifdef __CYGWIN__ void WinMainCRTStartup() { mainCRTStartup(); } #endif /* changed PASCAL to APIENTRY and HANDLE to HINSTANCE to get clean compile under cygwin int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow) { */ int APIENTRY WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow) { static char szAppName[] = "SysMets2"; static char szWinTitle[40]; // Fenstertitel HWND hwnd; MSG msg; WNDCLASS wndclass; if (!hPrevInstance) { wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; RegisterClass (&wndclass); } /* if */ Oem_Ansi("Maße des Systems, Version 2", szWinTitle); // Fenstertitel hwnd = CreateWindow(szAppName, szWinTitle, WS_OVERLAPPEDWINDOW | WS_VSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam ; } /* WinMain */ long FAR PASCAL _export WndProc (HWND hwnd, UINT message, UINT wParam, LONG lParam) { static short cxChar, cxCaps, cyChar, cyClient, nVScrollPos; char szBuffer[50]; // für wsprintf und Oem_Ansi HDC hdc; short i, y; PAINTSTRUCT ps; TEXTMETRIC tm; switch (message) { 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); SetScrollRange(hwnd, SB_VERT, 0, NUMLINES, FALSE); SetScrollPos(hwnd, SB_VERT, nVScrollPos, TRUE); return 0; case WM_SIZE : cyClient = HIWORD(lParam); return 0; case WM_VSCROLL : switch (wParam) { case SB_LINEUP : if (nVScrollPos) nVScrollPos -= 1; break; case SB_LINEDOWN : nVScrollPos += 1; break; case SB_PAGEUP : nVScrollPos -= cyClient / cyChar; break; case SB_PAGEDOWN : nVScrollPos += cyClient / cyChar; break; case SB_THUMBPOSITION : nVScrollPos = LOWORD(lParam); break; default : break; } /* switch */ nVScrollPos = max(0, (int)(min(nVScrollPos, NUMLINES))); if (nVScrollPos != GetScrollPos(hwnd, SB_VERT)) { SetScrollPos(hwnd, SB_VERT, nVScrollPos, TRUE); InvalidateRect(hwnd, NULL, TRUE); } /* if */ return 0; case WM_PAINT : hdc = BeginPaint(hwnd, &ps); for (i = 0; i < NUMLINES; i++) { y = cyChar * (1 - nVScrollPos + i); TextOut(hdc, cxChar, y, sysmetrics[i].szLabel, lstrlen(sysmetrics[i].szLabel)); Oem_Ansi(sysmetrics[i].szDesc, szBuffer); TextOut(hdc, cxChar + 22 * cxCaps, y, szBuffer, lstrlen (szBuffer)); SetTextAlign(hdc, TA_RIGHT | TA_TOP); TextOut(hdc, cxChar + 22 * cxCaps + 40 * cxChar, y, szBuffer, wsprintf(szBuffer, "%5d", GetSystemMetrics(sysmetrics[i].nIndex))); SetTextAlign(hdc, TA_LEFT | TA_TOP); } /* for */ EndPaint(hwnd, &ps); return 0; case WM_DESTROY : PostQuitMessage(0); return 0; } /* switch */ return DefWindowProc (hwnd, message, wParam, lParam) ; } /* WndProc */