#include "Windows.h"LRESULT CALLBACK wndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
HDC hdc;
PAINTSTRUCT ps;
TEXTMETRIC tm;
SCROLLINFO si;
static int cxChar, cyChar, cxCap, cxClient, cyClient;
int iVertPos;
switch(message){
case WM_CREATE:
hdc = GetDC(hwnd);
GetTextMetrics(hdc, &tm);
cxChar = tm.tmAveCharWidth;
cxCap = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2;
cyChar = tm.tmHeight + tm.tmExternalLeading;
ReleaseDC(hwnd,hdc);
return 0;
case WM_SIZE:
cyClient = HIWORD(lParam);
si.cbSize = sizeof(si);
si.fMask = SIF_RANGE | SIF_PAGE;
si.nMin = 0;
si.nMax = 200;
si.nPage = cyClient / cyChar;
SetScrollInfo(hwnd, SB_VERT, &si, true);
return 0;
case WM_VSCROLL:
si.cbSize = sizeof(si);
si.fMask = SIF_ALL;
GetScrollInfo(hwnd,SB_VERT,&si);
iVertPos = 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(hwnd, SB_VERT, &si, false);
GetScrollInfo(hwnd, SB_VERT, &si);
if(si.nPos != iVertPos){    
ScrollWindow(hwnd, 0, cyChar * (iVertPos - si.nPos), 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;
for(int i = 0;i <= 200;++i){
TCHAR buffer[10];
int length = wsprintf(buffer, TEXT("%d"), i);
TextOut(hdc, 0, (i - iVertPos) * cyChar, buffer, length);
}
EndPaint(hwnd, &ps);
return 0;
case WM_KEYDOWN:
switch(wParam){
case VK_HOME:
SendMessage(hwnd, WM_VSCROLL, SB_TOP, 0);
break;
case VK_END:
SendMessage(hwnd, WM_VSCROLL, SB_BOTTOM, 0);
break;
case VK_PRIOR:
SendMessage(hwnd, WM_VSCROLL, SB_PAGEUP, 0);
break;
case VK_NEXT:
SendMessage(hwnd, WM_VSCROLL, SB_PAGEDOWN, 0);
break;
case VK_UP:
SendMessage(hwnd, WM_VSCROLL, SB_LINEUP, 0);
break;
case VK_DOWN:
SendMessage(hwnd, WM_VSCROLL, SB_LINEDOWN, 0);
break;
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR ipCmdLine, int nCmdShow){
HWND hwnd;
MSG msg;
WNDCLASS wndClass; wndClass.style = CS_HREDRAW | CS_VREDRAW;
wndClass.lpfnWndProc = wndProc;
wndClass.cbClsExtra = 0;
wndClass.cbWndExtra = 0;
wndClass.hInstance = hInstance;
wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndClass.lpszMenuName = NULL;
wndClass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wndClass.lpszClassName = TEXT("Hello"); if(!RegisterClass(&wndClass)){
return 0;
}

hwnd = CreateWindow(TEXT("Hello"), 
TEXT("Hello"),
WS_OVERLAPPEDWINDOW | WS_VSCROLL,
0, 
0, 
500, 
500, 
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg, NULL, 0, 0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
} return msg.wParam;
}按了END,HOME,UP,DOWN,PAGE UP,PAGE DOWN以后,屏幕上的显示发生了变化,但是不知道为什么滚动条的位置没有发生变化

解决方案 »

  1.   


    #include "Windows.h" 
    LRESULT CALLBACK wndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ 
    HDC hdc; 
    PAINTSTRUCT ps; 
    TEXTMETRIC tm; 
    SCROLLINFO si; 
    static int cxChar, cyChar, cxCap, cxClient, cyClient; 
    int iVertPos; 
    switch(message){ 
    case WM_CREATE: 
    hdc = GetDC(hwnd); 
    GetTextMetrics(hdc, &tm); 
    cxChar = tm.tmAveCharWidth; 
    cxCap = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2; 
    cyChar = tm.tmHeight + tm.tmExternalLeading; 
    ReleaseDC(hwnd,hdc); 
    return 0; 
    case WM_SIZE: 
    cyClient = HIWORD(lParam); 
    si.cbSize = sizeof(si); 
    si.fMask = SIF_RANGE | SIF_PAGE; 
    si.nMin = 0; 
    si.nMax = 200; 
    si.nPage = cyClient / cyChar; 
    SetScrollInfo(hwnd, SB_VERT, &si, true); 
    return 0; 
    case WM_VSCROLL: 
    si.cbSize = sizeof(si); 
    si.fMask = SIF_ALL; 
    GetScrollInfo(hwnd,SB_VERT,&si); 
    iVertPos = 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(hwnd, SB_VERT, &si, false); 
    GetScrollInfo(hwnd, SB_VERT, &si); 
    if(si.nPos != iVertPos){    
    SetScrollPos(hwnd, SB_VERT, si.nPos, TRUE);
    ScrollWindow(hwnd, 0, cyChar * (iVertPos - si.nPos), 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; 
    for(int i = 0;i <= 200;++i){ 
    TCHAR buffer[10]; 
    int length = wsprintf(buffer, TEXT("%d"), i); 
    TextOut(hdc, 0, (i - iVertPos) * cyChar, buffer, length); 

    EndPaint(hwnd, &ps); 
    return 0; 
    case WM_KEYDOWN: 
    switch(wParam){ 
    case VK_HOME: 
    SendMessage(hwnd, WM_VSCROLL, SB_TOP, 0); 
    break; 
    case VK_END: 
    SendMessage(hwnd, WM_VSCROLL, SB_BOTTOM, 0); 
    break; 
    case VK_PRIOR: 
    SendMessage(hwnd, WM_VSCROLL, SB_PAGEUP, 0); 
    break; 
    case VK_NEXT: 
    SendMessage(hwnd, WM_VSCROLL, SB_PAGEDOWN, 0); 
    break; 
    case VK_UP: 
    SendMessage(hwnd, WM_VSCROLL, SB_LINEUP, 0); 
    break; 
    case VK_DOWN: 
    SendMessage(hwnd, WM_VSCROLL, SB_LINEDOWN, 0); 
    break; 

    return 0; 
    case WM_DESTROY: 
    PostQuitMessage(0); 
    return 0; 

    return DefWindowProc(hwnd, message, wParam, lParam); 
    } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR ipCmdLine, int nCmdShow){ 
    HWND hwnd; 
    MSG msg; 
    WNDCLASS wndClass;  wndClass.style = CS_HREDRAW | CS_VREDRAW; 
    wndClass.lpfnWndProc = wndProc; 
    wndClass.cbClsExtra = 0; 
    wndClass.cbWndExtra = 0; 
    wndClass.hInstance = hInstance; 
    wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); 
    wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wndClass.lpszMenuName = NULL; 
    wndClass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); 
    wndClass.lpszClassName = TEXT("Hello");  if(!RegisterClass(&wndClass)){ 
    return 0; 
    }  hwnd = CreateWindow(TEXT("Hello"), 
    TEXT("Hello"), 
    WS_OVERLAPPEDWINDOW | WS_VSCROLL, 
    0, 
    0, 
    500, 
    500, 
    NULL, 
    NULL, 
    hInstance, 
    NULL); 
    ShowWindow(hwnd,nCmdShow); 
    UpdateWindow(hwnd); 
    while(GetMessage(&msg, NULL, 0, 0)){ 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
    }  return msg.wParam; 
      

  2.   

    SetScrollPos(hwnd, SB_VERT, si.nPos, TRUE);
    加了这么一句话
    我明明插入的颜色,怎么没颜色呢
      

  3.   

    谢谢了,但是我还是没明白为什么已经SetScrollInfo了还是没有换位置
      

  4.   

    SetScrollInfo(hwnd, SB_VERT, &si, TRUE); 
    这样也可以