问题描述
- 滚动条问题为什么是iVertPos-si.nPos,而不是si.nPos-iVertPos
-
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);
}
解决方案
已结题..........