程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> 應用-滾動條問題為什麼是iVertPos-si.nPos,而不是si.nPos-iVertPos

應用-滾動條問題為什麼是iVertPos-si.nPos,而不是si.nPos-iVertPos

編輯:編程綜合問答
滾動條問題為什麼是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);

}

最佳回答:


已結題..........

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved