显示一个带滚动条的窗口
Posted xiyu714
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了显示一个带滚动条的窗口相关的知识,希望对你有一定的参考价值。
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") };
以上是关于显示一个带滚动条的窗口的主要内容,如果未能解决你的问题,请参考以下文章