1. 程式人生 > >顯示一個帶滾動條的窗口

顯示一個帶滾動條的窗口

默認 processor += sprint 最終 button max val BE

  1 //main.c
  2 #include <windows.h>
  3 #include "sysmets.h"
  4 
  5 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  6 
  7 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
  8 {
  9     static TCHAR szAppName[] = TEXT("Sysmets1");
 10     HWND    hwnd;
11 MSG msg; 12 WNDCLASS wndclass; 13 14 wndclass.style = CS_HREDRAW | CS_VREDRAW; 15 wndclass.lpfnWndProc = WndProc; 16 wndclass.cbClsExtra = 0; 17 wndclass.cbWndExtra = 0; 18 wndclass.hInstance = hInstance; 19 wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
20 wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); 21 wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 22 wndclass.lpszMenuName = NULL; 23 wndclass.lpszClassName = szAppName; 24 25 if (!RegisterClass(&wndclass)) 26 { 27 MessageBox(NULL, TEXT("
This program requires Windows NT"), szAppName, MB_ICONERROR); 28 return 0; 29 } 30 31 hwnd = CreateWindow(szAppName, TEXT("Get System Metrics No.1"), 32 WS_OVERLAPPEDWINDOW | WS_VSCROLL, //為窗口添加VSCROLL風格 33 CW_USEDEFAULT, CW_USEDEFAULT, 34 CW_USEDEFAULT, CW_USEDEFAULT, 35 NULL, NULL, hInstance, NULL 36 ); 37 38 ShowWindow(hwnd, iCmdShow); 39 UpdateWindow(hwnd); 40 while (GetMessage(&msg, NULL, 0, 0)) 41 { 42 TranslateMessage(&msg); 43 DispatchMessage(&msg); 44 } 45 return msg.wParam; 46 } 47 48 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 49 { 50 static int cxChar, cxCaps, cyChar, cyClient, iVscrollPos; 51 HDC hdc; 52 int i, y; 53 PAINTSTRUCT ps; 54 TCHAR szBuffer[10]; 55 TEXTMETRIC tm; 56 57 switch (message) 58 { 59 case WM_CREATE: 60 hdc = GetDC(hwnd); 61 62 GetTextMetrics(hdc, &tm); 63 cxChar = tm.tmAveCharWidth; 64 cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2; 65 cyChar = tm.tmHeight + tm.tmExternalLeading; 66 67 ReleaseDC(hwnd, hdc); 68 69 SetScrollRange(hwnd, SB_VERT, 0, NUMLINES - 1, FALSE); 70 SetScrollPos(hwnd, SB_VERT, iVscrollPos, TRUE); 71 return 0; 72 73 case WM_SIZE: //當窗口大小發生改變時,發送這條消息 74 cyClient = HIWORD(lParam); //HIWORD獲取高字節;高位字是高度,低位字是客戶區的寬度 75 return 0; 76 77 case WM_VSCROLL: //如果在滾動條的不同部分按住鼠標鍵不放,程序可能收到多條滾動條消息。當松開鼠標鍵時,程序會收到一條帶有SB_ENDSCROLL通知碼的消息 78 switch (LOWORD(wParam)) { 79 case SB_LINEUP: 80 iVscrollPos -= 1; 81 break; 82 case SB_LINEDOWN: 83 iVscrollPos += 1; 84 break; 85 case SB_PAGEUP: 86 iVscrollPos -= cyClient / cyChar; 87 break; 88 case SB_PAGEDOWN: 89 iVscrollPos += cyClient / cyChar; 90 break; 91 case SB_THUMBPOSITION: //當wParam的低位字是SB_THUMBPOSITION時,wParam的高位字是用戶松開鼠標鍵時滑塊的最終位置 92 iVscrollPos = HIWORD(wParam); 93 break; 94 default: 95 break; 96 } 97 98 iVscrollPos = max(0, min(iVscrollPos, NUMLINES - 1)); //stdlib.h中定義的,只能在VS中使用 99 100 if (iVscrollPos != GetScrollPos(hwnd, SB_VERT)) 101 { 102 SetScrollPos(hwnd, SB_VERT, iVscrollPos, TRUE); //不管設置為TRUE還是FALSE位置都會改變,可能是還有消息使用了默認的窗口過程導致的 103 InvalidateRect(hwnd, NULL, TRUE); 104 } 105 106 case WM_PAINT: 107 hdc = BeginPaint(hwnd, &ps); 108 109 for (i = 0; i < NUMLINES; i++) 110 { 111 y = cyChar * (i - iVscrollPos); //設置輸出位置 112 113 TextOut(hdc, 0, y, 114 sysmetrics[i].szLabel, 115 lstrlen(sysmetrics[i].szLabel) 116 ); 117 TextOut(hdc, 22 * cxCaps, y, 118 sysmetrics[i].szDesc, 119 lstrlen(sysmetrics[i].szDesc) 120 ); 121 SetTextAlign(hdc, TA_RIGHT | TA_TOP); 122 123 TextOut(hdc, 22 * cxCaps + 40 * cxChar, y, szBuffer, 124 wsprintf(szBuffer, TEXT("%5d"), 125 GetSystemMetrics(sysmetrics[i].iIndex) 126 ) 127 ); 128 SetTextAlign(hdc, TA_LEFT | TA_TOP); 129 130 } 131 EndPaint(hwnd, &ps); 132 return 0; 133 case WM_DESTROY: 134 PostQuitMessage(0); 135 return 0; 136 } 137 return DefWindowProc(hwnd, message, wParam, lParam); 138 }
//SYSMETS.h
#define NUMLINES ((int)(sizeof sysmetrics / sizeof sysmetrics[0]))

//原來,頭文件中的內容也和頭文件在源文件中的包含有關
struct
{
    int iIndex;
    TCHAR * szLabel;
    TCHAR * szDesc;
}
sysmetrics[] =
{
    SM_CXSCREEN,    TEXT("SM_CXSCREEN"),
                    TEXT("Screen width in pixels"),
    SM_CYSCREEN,    TEXT("SM_CYSCREEN"),
                    TEXT("Screen height in pixels"),
    SM_CXVSCROLL,   TEXT("SM_CXVSCROLL"),
                    TEXT("Vertical scroll width"),
    SM_CYHSCROLL,            TEXT("SM_CYHSCROLL"),
    TEXT("Horizontal scroll height"),
    SM_CYCAPTION,            TEXT("SM_CYCAPTION"),
    TEXT("Caption bar height"),
    SM_CXBORDER,             TEXT("SM_CXBORDER"),
    TEXT("Window border width"),
    SM_CYBORDER,             TEXT("SM_CYBORDER"),
    TEXT("Window border height"),
    SM_CXFIXEDFRAME,         TEXT("SM_CXFIXEDFRAME"),
    TEXT("Dialog window frame width"),
    SM_CYFIXEDFRAME,         TEXT("SM_CYFIXEDFRAME"),
    TEXT("Dialog window frame height"),
    SM_CYVTHUMB,             TEXT("SM_CYVTHUMB"),
    TEXT("Vertical scroll thumb height"),
    SM_CXHTHUMB,             TEXT("SM_CXHTHUMB"),
    TEXT("Horizontal scroll thumb width"),
    SM_CXICON,               TEXT("SM_CXICON"),
    TEXT("Icon width"),
    SM_CYICON,               TEXT("SM_CYICON"),
    TEXT("Icon height"),
    SM_CXCURSOR,             TEXT("SM_CXCURSOR"),
    TEXT("Cursor width"),
    SM_CYCURSOR,             TEXT("SM_CYCURSOR"),
    TEXT("Cursor height"),
    SM_CYMENU,               TEXT("SM_CYMENU"),
    TEXT("Menu bar height"),
    SM_CXFULLSCREEN,         TEXT("SM_CXFULLSCREEN"),
    TEXT("Full screen client area width"),
    SM_CYFULLSCREEN,         TEXT("SM_CYFULLSCREEN"),
    TEXT("Full screen client area height"),
    SM_CYKANJIWINDOW,        TEXT("SM_CYKANJIWINDOW"),
    TEXT("Kanji window height"),
    SM_MOUSEPRESENT,         TEXT("SM_MOUSEPRESENT"),
    TEXT("Mouse present flag"),
    SM_CYVSCROLL,            TEXT("SM_CYVSCROLL"),
    TEXT("Vertical scroll arrow height"),
    SM_CXHSCROLL,            TEXT("SM_CXHSCROLL"),
    TEXT("Horizontal scroll arrow width"),
    SM_DEBUG,                TEXT("SM_DEBUG"),
    TEXT("Debug version flag"),
    SM_SWAPBUTTON,           TEXT("SM_SWAPBUTTON"),
    TEXT("Mouse buttons swapped flag"),
    SM_CXMIN,                TEXT("SM_CXMIN"),
    TEXT("Minimum window width"),
    SM_CYMIN,                TEXT("SM_CYMIN"),
    TEXT("Minimum window height"),
    SM_CXSIZE,               TEXT("SM_CXSIZE"),
    TEXT("Min/Max/Close button width"),
    SM_CYSIZE,               TEXT("SM_CYSIZE"),
    TEXT("Min/Max/Close button height"),
    SM_CXSIZEFRAME,          TEXT("SM_CXSIZEFRAME"),
    TEXT("Window sizing frame width"),
    SM_CYSIZEFRAME,          TEXT("SM_CYSIZEFRAME"),
    TEXT("Window sizing frame height"),
    SM_CXMINTRACK,           TEXT("SM_CXMINTRACK"),
    TEXT("Minimum window tracking width"),
    SM_CYMINTRACK,           TEXT("SM_CYMINTRACK"),
    TEXT("Minimum window tracking height"),
    SM_CXDOUBLECLK,          TEXT("SM_CXDOUBLECLK"),
    TEXT("Double click x tolerance"),
    SM_CYDOUBLECLK,          TEXT("SM_CYDOUBLECLK"),
    TEXT("Double click y tolerance"),
    SM_CXICONSPACING,        TEXT("SM_CXICONSPACING"),
    TEXT("Horizontal icon spacing"),
    SM_CYICONSPACING,        TEXT("SM_CYICONSPACING"),
    TEXT("Vertical icon spacing"),
    SM_MENUDROPALIGNMENT,    TEXT("SM_MENUDROPALIGNMENT"),
    TEXT("Left or right menu drop"),
    SM_PENWINDOWS,           TEXT("SM_PENWINDOWS"),
    TEXT("Pen extensions installed"),
    SM_DBCSENABLED,          TEXT("SM_DBCSENABLED"),
    TEXT("Double-Byte Char Set enabled"),
    SM_CMOUSEBUTTONS,        TEXT("SM_CMOUSEBUTTONS"),
    TEXT("Number of mouse buttons"),
    SM_SECURE,               TEXT("SM_SECURE"),
    TEXT("Security present flag"),
    SM_CXEDGE,               TEXT("SM_CXEDGE"),
    TEXT("3-D border width"),
    SM_CYEDGE,               TEXT("SM_CYEDGE"),
    TEXT("3-D border height"),
    SM_CXMINSPACING,         TEXT("SM_CXMINSPACING"),
    TEXT("Minimized window spacing width"),
    SM_CYMINSPACING,         TEXT("SM_CYMINSPACING"),
    TEXT("Minimized window spacing height"),
    SM_CXSMICON,             TEXT("SM_CXSMICON"),
    TEXT("Small icon width"),
    SM_CYSMICON,             TEXT("SM_CYSMICON"),
    TEXT("Small icon height"),
    SM_CYSMCAPTION,          TEXT("SM_CYSMCAPTION"),
    TEXT("Small caption height"),
    SM_CXSMSIZE,             TEXT("SM_CXSMSIZE"),
    TEXT("Small caption button width"),
    SM_CYSMSIZE,             TEXT("SM_CYSMSIZE"),
    TEXT("Small caption button height"),
    SM_CXMENUSIZE,           TEXT("SM_CXMENUSIZE"),
    TEXT("Menu bar button width"),
    SM_CYMENUSIZE,           TEXT("SM_CYMENUSIZE"),
    TEXT("Menu bar button height"),
    SM_ARRANGE,              TEXT("SM_ARRANGE"),
    TEXT("How minimized windows arranged"),
    SM_CXMINIMIZED,          TEXT("SM_CXMINIMIZED"),
    TEXT("Minimized window width"),
    SM_CYMINIMIZED,          TEXT("SM_CYMINIMIZED"),
    TEXT("Minimized window height"),
    SM_CXMAXTRACK,           TEXT("SM_CXMAXTRACK"),
    TEXT("Maximum dragable width"),
    SM_CYMAXTRACK,           TEXT("SM_CYMAXTRACK"),
    TEXT("Maximum dragable height"),
    SM_CXMAXIMIZED,          TEXT("SM_CXMAXIMIZED"),
    TEXT("Width of maximized window"),
    SM_CYMAXIMIZED,          TEXT("SM_CYMAXIMIZED"),
    TEXT("Height of maximized window"),
    SM_NETWORK,              TEXT("SM_NETWORK"),
    TEXT("Network present flag"),
    SM_CLEANBOOT,            TEXT("SM_CLEANBOOT"),
    TEXT("How system was booted"),
    SM_CXDRAG,               TEXT("SM_CXDRAG"),
    TEXT("Avoid drag x tolerance"),
    SM_CYDRAG,               TEXT("SM_CYDRAG"),
    TEXT("Avoid drag y tolerance"),
    SM_SHOWSOUNDS,           TEXT("SM_SHOWSOUNDS"),
    TEXT("Present sounds visually"),
    SM_CXMENUCHECK,          TEXT("SM_CXMENUCHECK"),
    TEXT("Menu check-mark width"),
    SM_CYMENUCHECK,          TEXT("SM_CYMENUCHECK"),
    TEXT("Menu check-mark height"),
    SM_SLOWMACHINE,          TEXT("SM_SLOWMACHINE"),
    TEXT("Slow processor flag"),
    SM_MIDEASTENABLED,       TEXT("SM_MIDEASTENABLED"),
    TEXT("Hebrew and Arabic enabled flag"),
    SM_MOUSEWHEELPRESENT,    TEXT("SM_MOUSEWHEELPRESENT"),
    TEXT("Mouse wheel present flag"),
    SM_XVIRTUALSCREEN,       TEXT("SM_XVIRTUALSCREEN"),
    TEXT("Virtual screen x origin"),
    SM_YVIRTUALSCREEN,       TEXT("SM_YVIRTUALSCREEN"),
    TEXT("Virtual screen y origin"),
    SM_CXVIRTUALSCREEN,      TEXT("SM_CXVIRTUALSCREEN"),
    TEXT("Virtual screen width"),
    SM_CYVIRTUALSCREEN,      TEXT("SM_CYVIRTUALSCREEN"),
    TEXT("Virtual screen height"),
    SM_CMONITORS,            TEXT("SM_CMONITORS"),
    TEXT("Number of monitors"),
    SM_SAMEDISPLAYFORMAT,    TEXT("SM_SAMEDISPLAYFORMAT"),
    TEXT("Same color format flag")
};

顯示一個帶滾動條的窗口