//添加了滚动条的SYSMETS
WS_OVERLAPPEDWINDOW|WS_VSCROLL,
//window procedure
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
//Specific
TEXTMETRIC tm;
static int cxChar,cyChar,cxCaps; //大写字母宽度
int i,iLength,iPos,y;
TCHAR szBuf[40];
static int cyClient; //client region height
static int iVscrollPos; //当前滚动框位置
switch(msg)
{
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);
//Initialize SB
SetScrollRange(hwnd,SB_VERT,0,NUMLINES-1,FALSE);
SetScrollPos(hwnd,SB_VERT,iVscrollPos,TRUE);
return 0;
case WM_SIZE:
cyClient=HIWORD(lParam); //lParam高位为客户区高度
return 0;
case WM_VSCROLL: //处理垂直滚动条消息
iPos=GetScrollPos(hwnd,SB_VERT); //保存当前滚动框位置
//以下调整滚动框的位置
switch(LOWORD(wParam)) //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_THUMBTRACK:
iVscrollPos=HIWORD(wParam);
break;
}
iVscrollPos=max(0,min(NUMLINES-cyClient/cyChar,iVscrollPos)); //越界调整
if(iVscrollPos!=iPos) //if position changed
{
SetScrollPos(hwnd,SB_VERT,iVscrollPos,TRUE); //重新设置滚动框的位置
InvalidateRect(hwnd,NULL,TRUE); //刷新用户区
}
return 0;
case WM_PAINT:
y=(i-iVscrollPos)*cyChar;