qq_31198267 2015-11-06 09:08 采纳率: 100%
浏览 1531
已采纳

滚动条问题为什么是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条回答 默认 最新

  • qq_31198267 2016-01-06 14:03
    关注

    已结题..........

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题