应用-滚动条问题为什么是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);

}

解决方案

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

时间: 2024-09-16 12:30:20

应用-滚动条问题为什么是iVertPos-si.nPos,而不是si.nPos-iVertPos的相关文章

win32-滚动条问题 ,为什么是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为

解决单文档滚动条程序中显示图像闪烁问题

1.class CPictureProcessView : public CScrollView 如果原来是继承自CView,则把程序中所有的CView替换成CScrollView. 注意,一定要重载 virtual   void   OnInitialUpdate();   否则可能出错.   2.添加内存DC,内存位图成员.   CDC m_MemDC; //内存DC CBitmap m_MemBitmap; //内存位图     3.在打开文件后,要完成内存DC,和位图的初始化,同时设置滚

win32 滚动条的问题 不知道哪里的问题。 找了好久了。@求大婶@

问题描述 win32 滚动条的问题 不知道哪里的问题. 找了好久了.@求大婶@ 请问 为什么往下翻页 没问题 往上翻译 文字就只显示一半@ #include "stdafx.h" #include "demo.h" #define MAX_LOADSTRING 100 #define MY_LINE 100 HINSTANCE hInst; // TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本 TCHAR szWindowClass[

域名baidu.si已通过信产部备案 证非雨林木风所有

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断淘宝客 站长团购 云主机 技术大厅 6月10日消息 近日,baidu.si的域名之争迅速引起了众多网友和业界人士的关注,甚至有人猜测,这可能是网友友的恶作剧. 登陆中国工业和信息化部备案网站管理系统(http://www.miibeian.gov.cn)查询之后发现,www.baidu.si的域名备案号是: 苏ICP备10103650号. 从备案信息上来看,该域名所有人

windows常用 API函数

系统API查询 http://www.vbgood.com/api.html http://hi.baidu.com/3582077/item/9cc3483b581f53c5392ffae3 第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄, 这个函数的定义是这样的 HWND WINAPI FindWindow(LPCSTR lpClassName,LPCSTR lpWindowName);第一个参数填窗口的类名,第二个填窗口的标题名,其实是不需要同时

windows常用API函数

系统API查询 http://www.vbgood.com/api.html http://hi.baidu.com/3582077/item/9cc3483b581f53c5392ffae3 第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄, 这个函数的定义是这样的 HWND WINAPI FindWindow(LPCSTR lpClassName,LPCSTR lpWindowName);第一个参数填窗口的类名,第二个填窗口的标题名,其实是不需要同时

MFC程序设计常用技巧汇总_C 语言

本文实例总结了MFC程序设计常用技巧.分享给大家供大家参考.具体如下: 1.属性页的添加: 创建对话框的类,该类要从CpropertyPage继承:然后在要添加该对话框为属性页的类(头文件)里创建CpropertySheet类的一个对象m_tabsheet和新创建的对话框类的对象m_skatch:最后,在.cpp文件里的OnInitDialog()之类的函数里实现如下代码: 复制代码 代码如下: m_tabsheet.Create(this, WS_CHILD | WS_VISIBLE, 0);

VC/MFC 编程技巧大总结

 1 toolbar默认位图左上角那个点的颜色是透明色,不喜欢的话可以自己改. 2 VC++中 WM_QUERYENDSESSION WM_ENDSESSION 为系统关机消息. 3 Java学习书推荐:<java编程思想> 4 在VC下执行DOS命令 a. system("md c:\\12"); b. WinExec("Cmd.exe /C md c:\\12", SW_HIDE); c. ShellExecute ShellExecute(NULL

C++ 算法大全

第3章 控制语句  /* 1.打印出所有的"水仙花数".所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身.例如,153是一水仙花数,因为153 = 13 + 53 + 33. */ #include<iostream.h> void main() { int i, a=0, b=0, c=0; for(i=100;i<1000;i++) { a=i%10; b=i/10%10; c=i/100%10; if(a*a*a+b*b*b+c*