16,471
社区成员
发帖
与我相关
我的任务
分享
#include <windows.h>
#include "sysmets.h"
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )
{
static TCHAR szAppName[] = TEXT("SysMets With VerticalScrollBar");
MSG message;
HWND hWnd;
WNDCLASS wndcls;
wndcls.cbClsExtra = 0;
wndcls.cbWndExtra = 0;
wndcls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndcls.hCursor = LoadCursor(NULL,IDC_ARROW);
wndcls.hIcon = LoadIcon(NULL,IDI_ERROR);
wndcls.hInstance = hInstance;
wndcls.lpfnWndProc = WndProc;
wndcls.lpszClassName = szAppName;
wndcls.lpszMenuName = NULL;
wndcls.style = CS_VREDRAW | CS_HREDRAW;
if (!RegisterClass(&wndcls))
{
MessageBox(NULL,TEXT("对不起,注册窗口类失败!"),TEXT("错误"),MB_OK | MB_ICONERROR);
return 0;
}
hWnd = CreateWindow(szAppName,
TEXT("Sysmets With VScrollBar"),
WS_OVERLAPPEDWINDOW | WS_VSCROLL,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hWnd,nShowCmd);
UpdateWindow(hWnd);
while(GetMessage(&message,NULL,0,0))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
return message.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int cxChar, cxCaps, cyChar, cyClient, iVScrollPos;
HDC hDC;
PAINTSTRUCT ps;
int i, y ;
TCHAR szBuffer[10];
TEXTMETRIC tm;
switch (message)
{
case WM_CREATE:
hDC = GetDC(hwnd);
GetTextMetrics(hDC,&tm);
cxChar = tm.tmAveCharWidth;
cyChar = tm.tmHeight + tm.tmExternalLeading;
cxCaps = (tm.tmPitchAndFamily & 1 ? 3: 2) * cxChar / 2;
ReleaseDC(hwnd,hDC);
SetScrollRange(hwnd,SB_VERT,0,NUMLINES - 1, FALSE);
SetScrollPos(hwnd,SB_VERT,0,TRUE);
return 0;
case WM_SIZE:
cyClient = HIWORD(lParam);
return 0;
case WM_VSCROLL:
switch (LOWORD(wParam))
{
case SB_LINEUP:
iVScrollPos -= 1;
break;
case SB_LINEDOWN:
iVScrollPos += 1;
break;
case SB_PAGEUP:
iVScrollPos -= cyClient / cyChar;
break;
case SB_PAGEDOWN:
iVScrollPos += cyClient / cyChar;
break;
case SB_THUMBPOSITION:
iVScrollPos = HIWORD(wParam);
break;
default:
break;
}
iVScrollPos = max(0,min(iVScrollPos,NUMLINES - 1));
if (iVScrollPos != GetScrollPos(hwnd,SB_VERT))
{
SetScrollPos(hwnd,SB_VERT,iVScrollPos,TRUE);
InvalidateRect(hwnd,NULL,TRUE);
}
return 0;
case WM_PAINT:
hDC = BeginPaint(hwnd,&ps);
for (i = 0; i < NUMLINES; i++)
{
y = cyChar * (i - NUMLINES);
TextOut(hDC,0,y, sysmetrics[i].szLabel,lstrlen(sysmetrics[i].szLabel));
TextOut (hDC, 22 * cxCaps, y,
sysmetrics[i].szDesc,
lstrlen (sysmetrics[i].szDesc)) ;
SetTextAlign (hDC, TA_RIGHT | TA_TOP) ;
TextOut (hDC, 22 * cxCaps + 40 * cxChar, y, szBuffer,
wsprintf (szBuffer, TEXT ("%5d"),
GetSystemMetrics (sysmetrics[i].iIndex))) ;
SetTextAlign (hDC, TA_LEFT | TA_TOP) ;
}
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}