if(si.nPos!=iVertPos) //si.nPos:當前位置
{ ScrollWindow(hwnd,0,cyChar*(iVertPos-si.nPos),NULL,NULL);
UpdateWindow(hwnd);
} 中為什麼是iVertPos-si.nPos,而不是si.nPos-iVertPos,(若滾動條下移,si.nPos增大,iVertPos-si.nPos為負,調用函數ScrollWindow(hwnd,0,cyChar*(iVertPos-si.nPos),NULL,NULL); 後滾動條不是上移嗎?)
#include
#include"sysmets.h"
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
static TCHAR szAppName[]=TEXT("SyMets1");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style =CS_HREDRAW | CS_VREDRAW;
wndclass.cbClsExtra =0;
wndclass.cbWndExtra =0;
wndclass.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor =LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon =LoadIcon(NULL,IDI_APPLICATION);
wndclass.hInstance =hInstance;
wndclass.lpfnWndProc =WndProc;
wndclass.lpszClassName =szAppName;
wndclass.lpszMenuName =NULL;
if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("ERROR"),szAppName,MB_ICONERROR);
return 0;
}
hwnd=CreateWindow(szAppName,
TEXT("Get System Metrics No.1"),
WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
);
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static int cxChar,cyChar,cxCaps,cxClient,cyClient,iMaxWidth;
int i,x,y,iVertPos,iHorzPos,iPaintBeg,iPaintEnd;
HDC hdc;
PAINTSTRUCT ps;
SCROLLINFO si;
TEXTMETRIC tm;
TCHAR szBuffer[10];
switch(message)
{
case WM_CREATE:
hdc=GetDC(hwnd);
GetTextMetrics(hdc,&tm);
cxChar=tm.tmAveCharWidth; //tmAveCharWidth平均字符寬度
cxCaps=(tm.tmPitchAndFamily & 1 ? 3:2)*cxChar/2; //tmPitchAndFamily:字體間距(低4位)和族(高4位)
cyChar=tm.tmHeight+tm.tmExternalLeading; //tmExternalLeading:夾在兩行之間的空間數目,tmHeight;:字符高度TEXTMETRIC結構字段的圖示
ReleaseDC(hwnd,hdc);
// Save the width of the three columns
iMaxWidth=40*cxChar+22*cxCaps;
return 0;
case WM_SIZE:
cxClient=LOWORD(lParam);
cyClient=HIWORD(lParam); //cxClient和cyClient是當用戶調節了窗口尺寸後的,客戶區的長度和高度.
// Set vertical scroll bar range and page size
si.cbSize =sizeof(si);
si.fMask =SIF_RANGE | SIF_PAGE; //SIF_RANGE:必須在nMin和nMax中指定滾動條的范圍 SIF_PAGE:用於指定或獲取頁面大小
si.nMin =0;
si.nMax =NUMLINES-1;
si.nPage =cyClient/cyChar; //客戶區的行數
SetScrollInfo(hwnd,SB_VERT,&si,TRUE);
// Set horizontal scroll bar range and page size
si.cbSize =sizeof(si);
si.fMask =SIF_RANGE | SIF_PAGE; //SIF_RANGE:必須在nMin和nMax中指定滾動條的范圍 SIF_PAGE:用於指定或獲取頁面大小
si.nMin =0;
si.nMax =2+iMaxWidth/cxChar;
si.nPage =cxClient/cxChar;
SetScrollInfo(hwnd,SB_HORZ,&si,TRUE);
case WM_VSCROLL:
si.cbSize =sizeof(si);
si.fMask =SIF_ALL; //SIF_ALL:SIF_RANGE、SIF_PAGE、SIF_POS和SIF_TRACKPOS的組合
GetScrollInfo(hwnd,SB_VERT,&si);
iVertPos =si.nPos; //si.nPos:當前位置
switch(LOWORD(wParam))
{
case SB_TOP:
si.nPos=si.nMin;
break;
case SB_BOTTOM:
si.nPos=si.nMax;
break;
case SB_LINEUP:
si.nPos-=1;
break;
case SB_LINEDOWN:
si.nPos+=1;
break;
case SB_PAGEUP:
si.nPos-=si.nPage;
break;
case SB_PAGEDOWN:
si.nPos+=si.nPage;
break;
case SB_THUMBTRACK:
si.nPos=si.nTrackPos;
break;
default:
break;
}
si.fMask=SIF_POS; //當通過SetScrollInfo使用它時,必須把結構的nPos字段設定為所需的位置。可以通過GetScrollInfo使用SIF_POS標志來取得目前位置。
SetScrollInfo(hwnd,SB_VERT,&si,TRUE);
GetScrollInfo(hwnd,SB_VERT,&si);
if(si.nPos!=iVertPos) //si.nPos:當前位置
{
ScrollWindow(hwnd,0,cyChar*(iVertPos-si.nPos),NULL,NULL);
UpdateWindow(hwnd);
}
return 0;
case WM_HSCROLL:
si.cbSize =sizeof(si);
si.fMask =SIF_ALL;
GetScrollInfo(hwnd,SB_HORZ,&si);
iHorzPos =si.nPos;
switch(LOWORD(wParam))
{
case SB_LINELEFT:
si.nPos-=1;
break;
case SB_LINERIGHT:
si.nPos+=1;
break;
case SB_PAGELEFT:
si.nPos-=si.nPage;
break;
case SB_PAGERIGHT:
si.nPos+=si.nPage;
break;
case SB_THUMBPOSITION:
si.nPos=si.nTrackPos;
break;
default:
break;
}
si.fMask=SIF_POS;
SetScrollInfo(hwnd,SB_HORZ,&si,TRUE);
GetScrollInfo(hwnd,SB_HORZ,&si);
if(si.nPos!=iHorzPos)
{
ScrollWindow(hwnd,cxChar*(iHorzPos-si.nPos),0,NULL,NULL);
UpdateWindow(hwnd);
}
return 0;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
si.cbSize =sizeof(si);
si.fMask =SIF_POS;
GetScrollInfo(hwnd,SB_VERT,&si);
iVertPos =si.nPos;
GetScrollInfo(hwnd,SB_HORZ,&si);
iHorzPos =si.nPos;
iPaintBeg =max(0,iVertPos+ps.rcPaint.top/cyChar);
iPaintEnd =min(NUMLINES-1,iVertPos+ps.rcPaint.bottom/cyChar);
for(i=iPaintBeg;i<=iPaintEnd;i++)
{
x=cxChar*(1-iHorzPos);
y=cyChar*(i-iVertPos);
TextOut (hdc,x,y,sysmetrics[i].szLabel,lstrlen(sysmetrics[i].szLabel));
TextOut (hdc,22*cxCaps+x,y,sysmetrics[i].szDesc,lstrlen(sysmetrics[i].szDesc));
SetTextAlign(hdc,TA_RIGHT | TA_TOP);
TextOut (hdc,22*cxCaps+40*cxChar+x,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);
}
已結題..........