/**************************************************************************** PROGRAM: Teht7_10.c PURPOSE: Ohjelma Windows rules OK! - tekstin selailuun Muuteltu ohjelmasta thello.c ****************************************************************************/ #include /* Tarvitaan kaikissa Windows C-ohjelmissa */ #include #include #define MY_BAR 177 /* Oman liukusäätimen tunniste */ #define MY_STATIC 178 /* 1. vakiotekstin tunniste = liun arvo */ #define MY_BARS 179 /* apuvakio seuraaville */ #define MY_SVER (MY_BARS+SB_VERT) /* 2. tekstikenän tunniste = pystyliun */ #define MY_SHOR (MY_BARS+SB_HORZ) /* 3. tekstikentän tunniste = vaakaliun*/ #define RIVEJA 50 #define RIVIKOR 20 #define MIN_BAR 0 #define MAX_BAR (RIVEJA*RIVIKOR) static int value = 0; LONG CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; static char *teksti = "Windows rules OK!"; static char tosoitin[RIVEJA][50]; int i; switch (message) { case WM_CREATE: for (i = 0; i < RIVEJA; i++) sprintf(tosoitin[i],"%3d %s",i,teksti); break; case WM_PAINT: /* Viesti: Piirrä ikkuna uudelleen */ if ( BeginPaint(hWnd,&ps) ) { for (i = 0; i < RIVEJA; i++) TextOut(ps.hdc, 5, i*RIVIKOR - value,tosoitin[i],strlen(tosoitin[i])); EndPaint(hWnd,&ps); } return NULL; case WM_VSCROLL: { /* Johonkin pystyliukuun koskettu */ HWND shWnd = GET_WM_VSCROLL_HWND(wParam,lParam); int fnBar = SB_CTL; int id = GetDlgCtrlID(shWnd); if ( shWnd == NULL ) { shWnd = hWnd; id = SB_VERT; fnBar = SB_VERT; } switch ( GET_WM_VSCROLL_CODE(wParam,lParam) ) { case SB_BOTTOM : value = MIN_BAR; break; case SB_TOP : value = MAX_BAR; break; case SB_LINEDOWN : value++; break;/* Muuta lisäyksiä */ case SB_PAGEDOWN : value += 10; break; case SB_LINEUP : value--; break; case SB_PAGEUP : value -= 10; break; case SB_THUMBPOSITION: case SB_THUMBTRACK : value = GET_WM_VSCROLL_POS(wParam,lParam); break; } if ( value < MIN_BAR ) value = MIN_BAR; if ( value > MAX_BAR ) value = MAX_BAR; SetScrollPos(shWnd,fnBar,value,TRUE); SetDlgItemInt(hWnd,id == MY_BAR ? MY_STATIC : MY_SVER ,value, TRUE); InvalidateRect(hWnd,NULL,1); return NULL; } case WM_DESTROY: /* Viesti: ikkuna hävitetään */ PostQuitMessage(0); return NULL; default: /* Antaa Windowsin käsitellä muut */ break; } return DefWindowProc(hWnd, message, wParam, lParam); } int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HWND hWnd;/* Pääikkunan kahva ja apukahva kontrollien luontiin. */ WNDCLASS wc; /* Ikkunaluokka */ MSG msg; /* Viesti */ (void)lpCmdLine; /* Hämäystä, jottei valitusta param. käytt. */ if (!hPrevInstance) { /* Onko muita esiintymiä käynnisssä? */ wc.style = NULL; wc.lpfnWndProc = MainWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = "WHelloWClass"; if ( !RegisterClass(&wc) ) return 1; } hWnd = CreateWindow("WHelloWClass","Smooth", WS_CAPTION | WS_BORDER | WS_VSCROLL | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX, 50,50,300,300,NULL,NULL,hInstance,NULL); if ( !hWnd ) return 1; SetScrollRange(hWnd,SB_VERT,MIN_BAR,MAX_BAR,TRUE); ShowWindow(hWnd,nCmdShow); /* Näytetään ikkuna */ while ( GetMessage(&msg,NULL,NULL,NULL) ) { TranslateMessage(&msg); /* Tulkitaan virtuaaliset näp. koodit */ DispatchMessage(&msg); /* Lähetetään viesti ikkunalle */ } return msg.wParam; /* Palautetaan PostQuitMessage-funktion arvo */ }