#include <windows.h>
#include <stdio.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
static char szAppName[ ] = "APP9";
char buf[20];
const char * pszcText = "C++ Programming";
int i;
int iVPos;
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd)
{
WNDCLASS wc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hInstance = hInstance;
wc.lpfnWndProc = WndProc;
wc.lpszClassName = szAppName;
wc.lpszMenuName = NULL;
wc.style = CS_HREDRAW | CS_VREDRAW;
if ( !RegisterClass( &wc ) )
{
MessageBox(NULL, "Can't register class!", "Can't register class!", NULL);
return 1;
}
HWND hwnd = CreateWindow(szAppName,
szAppName,
WS_OVERLAPPEDWINDOW | WS_VSCROLL,
0,
0,
400,
400,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd, SW_SHOWNORMAL);
UpdateWindow(hwnd);
MSG msg;
while ( GetMessage(&msg, NULL, 0, 0) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static int cxChar, cyChar, cyClient;
static HDC hdc;
static PAINTSTRUCT ps;
static TEXTMETRIC tm;
switch ( msg )
{
case WM_CREATE:
hdc = GetDC(hwnd);
GetTextMetrics(hdc, &tm);
cxChar = tm.tmAveCharWidth;
cyChar = tm.tmHeight + tm.tmExternalLeading;
ReleaseDC(hwnd, hdc);
SetScrollRange(hwnd, SB_VERT, 0, 40, FALSE);
SetScrollPos(hwnd, SB_VERT, iVPos, FALSE);
break;
case WM_SIZE:
cyClient = HIWORD(lParam);
break;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
for (i = 0; i < 40; ++i)
{
sprintf(buf, "%d : %s ", i + 1, pszcText);
TextOut(hdc, 10, cyChar * (i - iVPos), buf, lstrlen(buf));
}
EndPaint(hwnd, &ps);
break;
case WM_VSCROLL:
switch (LOWORD(wParam))
{
case SB_LINEDOWN:
iVPos += 1;
break;
case SB_LINEUP:
iVPos -= 1;
break;
case SB_PAGEDOWN:
iVPos += cyClient / cyChar;
break;
case SB_PAGEUP:
iVPos -= cyClient / cyChar;
break;
case SB_THUMBPOSITION:
iVPos = HIWORD(wParam);
break;
}
iVPos = max(0, min(iVPos, 39));
if (iVPos != GetScrollPos(hwnd, SB_VERT))
{
SetScrollPos(hwnd, SB_VERT, iVPos, TRUE);
InvalidateRect(hwnd, NULL, TRUE);
}
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage( 0 );
break;
default:
;
break;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}