Scroll2
#include <Windows.h> #include <stdio.h> #include "resource.h" //#include <afxwin.h> LRESULT CALLBACK MyWindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) { HWND hwnd; WNDCLASS wndclass; MSG msg; static TCHAR MyAppName[]=TEXT("My first windows app"); wndclass.style=CS_HREDRAW|CS_VREDRAW; wndclass.lpfnWndProc=MyWindowProc; wndclass.cbClsExtra=0;//预留的额外空间 wndclass.cbWndExtra=0; wndclass.hInstance=hInstance; wndclass.hIcon=::LoadIcon(NULL,IDI_INFORMATION); wndclass.hCursor=::LoadCursor(hInstance,MAKEINTRESOURCE(IDC_CURSOR1)); wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName=NULL; wndclass.lpszClassName=TEXT("My first windows app"); if (!RegisterClass(&wndclass)) { int i=GetLastError(); //char str[25]={0}; wchar_t chResult[128]={0}; _itow(i,chResult,10); //sprintf(str,TEXT("%d"),i); //sprintf(buffer,L"Key State = 0X%X ",key_state); MessageBox(NULL,chResult,TEXT("Error"),MB_OK); //AfxMessageBox(TEXT("Error") ); } hwnd=CreateWindow( MyAppName, TEXT("My first windows"), WS_OVERLAPPEDWINDOW|WS_VSCROLL|WS_HSCROLL, CW_USEDEFAULT , CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL,NULL, hInstance, NULL ); ShowWindow(hwnd,SW_SHOWNORMAL); //ShowWindow(hwnd,iCmdShow); UpdateWindow(hwnd); while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK MyWindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { PAINTSTRUCT lp; RECT rect; HDC hdc; TEXTMETRIC tm; static int cxChar,cyChar,cxCaps; static int cxClient,cyClient,iVscrollPos; SCROLLINFO si; int inVertPos,iPaintBeg,iPaintEnd,y; switch(uMsg) { case WM_CREATE: hdc=GetDC(hwnd); GetTextMetrics(hdc,&tm); cxChar=tm.tmAveCharWidth; cyChar=tm.tmHeight/*+tm.tmExternalLeading*/; cxCaps=(tm.tmPitchAndFamily&1?3:2)*cxChar/2;//平均宽度 ReleaseDC(hwnd,hdc); //SetScrollRange(hwnd,SB_VERT,0,999,FALSE); //SetScrollPos(hwnd,SB_VERT,iVscrollPos,TRUE); return 0; case WM_PAINT: /*HDC*/ hdc=BeginPaint(hwnd,&lp);// /* 在case里面不能直接声明变量 你有两种选择 1. 将变量j的声明提取到switch的外面 2. 将case的语句块用大括号(“{” “}”)括起来 */ //GetClientRect(hwnd,&rect); //DrawText(dc,TEXT("Hello World"),-1,&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE); //TextOut(dc,(rect.right-rect.left)/2,(rect.bottom-rect.top)/2,TEXT("hello world"),wcslen(TEXT("hello world"))); si.cbSize=sizeof(si); si.fMask=SIF_POS; GetScrollInfo(hwnd,SB_VERT,&si); inVertPos=si.nPos; iPaintBeg=max(0,inVertPos+lp.rcPaint.top/cyChar);// iPaintEnd=min(999,inVertPos+lp.rcPaint.bottom/cyChar); for(int i=iPaintBeg;i<=iPaintEnd;i++) { y=cyChar*(i-inVertPos); TextOut(hdc,0,y,TEXT("Hello World"),wcslen(TEXT("Hello World"))); TextOut(hdc,22*cxCaps,y,TEXT("Hello World"),wcslen(TEXT("Hello World"))); SetTextAlign(hdc,TA_RIGHT|TA_TOP); TextOut(hdc,22*cxCaps+40*cxChar,y,TEXT("Hello World"),wcslen(TEXT("Hello World"))); SetTextAlign(hdc,TA_LEFT|TA_TOP); } EndPaint(hwnd,&lp); return 0; case WM_SIZE: cyClient=HIWORD(lParam); si.cbSize=sizeof(si); //si.fMask=SIF_PAGE|SIF_POS; si.fMask=SIF_PAGE|SIF_RANGE; si.nMax=999; si.nMin=0; si.nPage=cyClient/cyChar; //SetScrollInfo(hwnd,SB_VERT,&si,FALSE); SetScrollInfo(hwnd,SB_VERT,&si,TRUE); return 0; case WM_VSCROLL: si.cbSize=sizeof(si); si.fMask=SIF_ALL; GetScrollInfo(hwnd,SB_VERT,&si); inVertPos = si.nPos ; switch(LOWORD(wParam)) { case SB_LINEDOWN: si.nPos+=1; break; case SB_LINEUP: si.nPos-=1; break; case SB_PAGEDOWN: si.nPos+=si.nPage; break; case SB_PAGEUP: si.nPos-=si.nPage; break; case SB_THUMBPOSITION: si.nPos=HIWORD(wParam); default: break; } si.fMask=SIF_POS; SetScrollInfo(hwnd,SB_VERT,&si,TRUE); GetScrollInfo(hwnd,SB_VERT,&si); if (si.nPos!=inVertPos) { ScrollWindow(hwnd,0,cyChar*(inVertPos-si.nPos),NULL,NULL); UpdateWindow(hwnd); } //iVscrollPos=max(0,min(iVscrollPos,999)); /* if (iVscrollPos!=GetScrollPos(hwnd,SB_VERT)) { SetScrollPos(hwnd,SB_VERT,iVscrollPos,TRUE); InvalidateRect(hwnd,NULL,TRUE); }*/ return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd,uMsg, wParam,lParam ); }