主题:我的水平滚动条为什么不能正常工作 为什么?
#include<windows.h>
#include"SYSMETS.H"
#include<string>
#pragma comment(lib, "winmm.lib")
using std::string;
LRESULT CALLBACK wndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdline,int ICmdShow){
const TCHAR szAppName[]=TEXT("HelloWin");
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.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndClass.lpszMenuName=NULL;
wndClass.lpszClassName=szAppName;
if(!RegisterClass(&wndClass)){
MessageBox(NULL,TEXT("the window class can't be regist"),TEXT("HELLOWIN"),MB_ICONERROR);
return 0;
}
hwnd=CreateWindow(szAppName,TEXT("我家养猪"),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){
HDC hdc;
PAINTSTRUCT ps;
TCHAR lable[20];
static int ixChar,iyChar,ixCaps,ixClient,iyClient,iVertPos,iHorzPos,iCountPigs,iPaintBeg,iPaintEnd;
TEXTMETRIC tm;
SCROLLINFO si;
iCountPigs=100;
switch(message){
case WM_CREATE:
PlaySound(TEXT("hellowin.wav"),NULL,SND_FILENAME|SND_ASYNC);
hdc=GetDC(hwnd);
GetTextMetrics(hdc,&tm);
ixChar=tm.tmAveCharWidth;
iyChar=tm.tmHeight+tm.tmExternalLeading;
ixCaps=(tm.tmPitchAndFamily&1?3:2)*ixChar/2;
ReleaseDC(hwnd,hdc);
return 0;
case WM_SIZE:
ixClient=LOWORD(lParam);
iyClient=HIWORD(lParam);
si.cbSize=sizeof(si);
si.fMask=SIF_RANGE|SIF_PAGE;
si.nMin=0;
si.nMax=iCountPigs;
si.nPage=iyClient/iyChar;
SetScrollInfo(hwnd,SB_VERT,&si,TRUE);
si.cbSize=sizeof(si);
si.fMask=SIF_RANGE|SIF_PAGE;
si.nMin=0;
si.nMax=1000;
si.nPage=ixClient/ixCaps;
SetScrollInfo(hwnd,SB_HORZ,&si,TRUE);
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/iyChar);
iPaintEnd = min(iCountPigs,iVertPos+ps.rcPaint.bottom/iyChar);
for(int i=iPaintBeg;i<=iPaintEnd;i++){
wsprintf(lable,"我家养了%i只猪",i);
TextOut(hdc,0,iyChar*(i-iVertPos),lable,lstrlen(lable));
TextOut(hdc,500,iyChar*(i-iVertPos),lable,lstrlen(lable));
TextOut(hdc,1000,iyChar*(i-iVertPos),lable,lstrlen(lable));
}
EndPaint(hwnd,&ps);
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_LINEUP:
si.nPos--;
break;
case SB_LINEDOWN:
si.nPos++;
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,TRUE);
GetScrollInfo(hwnd,SB_VERT,&si);
if(iVertPos!=si.nPos){
ScrollWindow(hwnd,0,iyChar*(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);
iVertPos=si.nPos;
switch(LOWORD(wParam)){
case SB_LINEUP:
si.nPos--;
break;
case SB_LINEDOWN:
si.nPos++;
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_HORZ,&si,TRUE);
GetScrollInfo(hwnd,SB_HORZ,&si);
if(iHorzPos!=si.nPos){
ScrollWindow(hwnd,ixCaps*(iHorzPos-si.nPos),0,NULL,NULL);
UpdateWindow(hwnd);
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
#include"SYSMETS.H"
#include<string>
#pragma comment(lib, "winmm.lib")
using std::string;
LRESULT CALLBACK wndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdline,int ICmdShow){
const TCHAR szAppName[]=TEXT("HelloWin");
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.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndClass.lpszMenuName=NULL;
wndClass.lpszClassName=szAppName;
if(!RegisterClass(&wndClass)){
MessageBox(NULL,TEXT("the window class can't be regist"),TEXT("HELLOWIN"),MB_ICONERROR);
return 0;
}
hwnd=CreateWindow(szAppName,TEXT("我家养猪"),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){
HDC hdc;
PAINTSTRUCT ps;
TCHAR lable[20];
static int ixChar,iyChar,ixCaps,ixClient,iyClient,iVertPos,iHorzPos,iCountPigs,iPaintBeg,iPaintEnd;
TEXTMETRIC tm;
SCROLLINFO si;
iCountPigs=100;
switch(message){
case WM_CREATE:
PlaySound(TEXT("hellowin.wav"),NULL,SND_FILENAME|SND_ASYNC);
hdc=GetDC(hwnd);
GetTextMetrics(hdc,&tm);
ixChar=tm.tmAveCharWidth;
iyChar=tm.tmHeight+tm.tmExternalLeading;
ixCaps=(tm.tmPitchAndFamily&1?3:2)*ixChar/2;
ReleaseDC(hwnd,hdc);
return 0;
case WM_SIZE:
ixClient=LOWORD(lParam);
iyClient=HIWORD(lParam);
si.cbSize=sizeof(si);
si.fMask=SIF_RANGE|SIF_PAGE;
si.nMin=0;
si.nMax=iCountPigs;
si.nPage=iyClient/iyChar;
SetScrollInfo(hwnd,SB_VERT,&si,TRUE);
si.cbSize=sizeof(si);
si.fMask=SIF_RANGE|SIF_PAGE;
si.nMin=0;
si.nMax=1000;
si.nPage=ixClient/ixCaps;
SetScrollInfo(hwnd,SB_HORZ,&si,TRUE);
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/iyChar);
iPaintEnd = min(iCountPigs,iVertPos+ps.rcPaint.bottom/iyChar);
for(int i=iPaintBeg;i<=iPaintEnd;i++){
wsprintf(lable,"我家养了%i只猪",i);
TextOut(hdc,0,iyChar*(i-iVertPos),lable,lstrlen(lable));
TextOut(hdc,500,iyChar*(i-iVertPos),lable,lstrlen(lable));
TextOut(hdc,1000,iyChar*(i-iVertPos),lable,lstrlen(lable));
}
EndPaint(hwnd,&ps);
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_LINEUP:
si.nPos--;
break;
case SB_LINEDOWN:
si.nPos++;
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,TRUE);
GetScrollInfo(hwnd,SB_VERT,&si);
if(iVertPos!=si.nPos){
ScrollWindow(hwnd,0,iyChar*(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);
iVertPos=si.nPos;
switch(LOWORD(wParam)){
case SB_LINEUP:
si.nPos--;
break;
case SB_LINEDOWN:
si.nPos++;
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_HORZ,&si,TRUE);
GetScrollInfo(hwnd,SB_HORZ,&si);
if(iHorzPos!=si.nPos){
ScrollWindow(hwnd,ixCaps*(iHorzPos-si.nPos),0,NULL,NULL);
UpdateWindow(hwnd);
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}