Eli tässä on koodi yksinkertaiseen "näytönsäästäjään". ja tottakait mukana on myös yksi pienehkö bugikin, eli koodi ei missään vaiheessa tarkasta lähteekö viiva menemään ikkunassa vaaka- tai pystysuunnassa kohtisuoraan. Tämän tapahtuessa ei lopputulos ole visuaalisesti toivottu, mutta kuitenkin asianmukaisesti toimiva.
//Yksinkertainen näytönsäästäjä // INCLUDET /////////////////////////////////////////////// #define WIN32_LEAN_AND_MEAN #include <windows.h> // windowsin otsikkotiedostot #include <stdlib.h> // VAKIOT //////////////////////////////////////////////// #define WINDOW_CLASS_NAME "WINCLASS" #define WINDOW_WIDTH 800 #define WINDOW_HEIGHT 600 // MAKROT ///////////////////////////////////////////////// #define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) // GLOBAALIT //////////////////////////////////////////////// HWND main_window_handle = NULL; // Ikkunan kahvaa varten HINSTANCE hinstance_app = NULL; // ikkunan ilmentymää varten // FUNCTIOT ////////////////////////////////////////////// //ikkunan päävisestin käsittelijä LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { PAINTSTRUCT ps; // WM_PAINT käyttää HDC hdc; // kahva laitteeseen // tarkastetaan viesti switch(msg) { case WM_CREATE: { return(0); } break; case WM_PAINT: { // valitaan maalattavaksi koko ikkuna hdc = BeginPaint(hwnd,&ps); // lopetetaan maalaaminen EndPaint(hwnd,&ps); // palataan onnistuneesti return(0); } break; case WM_DESTROY: { // Lähetetään WM_QUIT viesti viesti jonoon PostQuitMessage(0); // Palataan onnistuneesti return(0); } break; default:break; } // end switch // Lähetetään kaikki loput viestit windowsille... return (DefWindowProc(hwnd, msg, wparam, lparam)); } // end WinProc // WINMAIN //////////////////////////////////////////////// int WINAPI WinMain( HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) { WNDCLASSEX winclass; // ikkunaluokkaa varten HWND hwnd; // ikkunan kahva MSG msg; // viestille HDC hdc; // piirto "laite" HPEN pen=NULL; // tällä kynällä piirretään viivat HPEN e_pen=NULL; // tällä kynällä pyyhitään viivat int color_change = 50; // värin vaihtoa varten // täytetään ikkuna structuurista tarvittavat kohdat winclass.cbSize = sizeof(WNDCLASSEX); winclass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW; winclass.lpfnWndProc = WindowProc; winclass.cbClsExtra = 0; winclass.cbWndExtra = 0; winclass.hInstance = hinstance; winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); winclass.hCursor = LoadCursor(NULL, IDC_ARROW); winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); winclass.lpszMenuName = NULL; winclass.lpszClassName = WINDOW_CLASS_NAME; winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); // tallennetaan ikkunan ilmentymä globaaliksi hinstance_app = hinstance; // rekisteröidään ikkuna windowsiin if (!RegisterClassEx(&winclass)) return(0); // Luodaan ikkuna if (!(hwnd = CreateWindowEx(NULL, WINDOW_CLASS_NAME, "Yksinkertainen 'näytönsäästäjä'", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0,0, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hinstance, NULL))) return(0); // tallennetaan ikkunan kahva globaaliksi main_window_handle = hwnd; //haetaan DC hdc = GetDC(hwnd); // otetaan rand:lle satunnais luku siemen srand(GetTickCount()); // asetetaan viivojen päätepisteet int x1 = rand()%WINDOW_WIDTH-10; int y1 = rand()%WINDOW_HEIGHT-30; int x2 = rand()%WINDOW_WIDTH-10; int y2 = rand()%WINDOW_HEIGHT-30; int x3 = rand()%WINDOW_WIDTH-10; int y3 = rand()%WINDOW_HEIGHT-30; int x4 = rand()%WINDOW_WIDTH-10; int y4 = rand()%WINDOW_HEIGHT-30; // asetetaan nopeudet int x1v = 1 + rand()%8; int y1v = 1 + rand()%8; int x2v = 1 + rand()%8; int y2v = 1 + rand()%8; int x3v = 1 + rand()%8; int y3v = 1 + rand()%8; int x4v = 1 + rand()%8; int y4v = 1 + rand()%8; //luodaan puyyhintä kynä e_pen = CreatePen(PS_SOLID,1,RGB(0,0,0)); //ohjelman päälooppi while(TRUE) { // haetaan alkuaika piirrolle DWORD start_time = GetTickCount(); // testanaan onko viestiä jonossa if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { // onko mahdollisesti WM_QUIT viesti if (msg.message == WM_QUIT) break; TranslateMessage(&msg); // Lähetetään visti eteenpäin viestinkäsittelijälle DispatchMessage(&msg); } // end if // tarkastetaan joko pitää vaihtaa väriä if (++color_change >= 50) { // nollataan laskuri color_change = 0; //jos pen jo olemassa niin poistetaan se if (pen) DeleteObject(pen); // luodaan uusikynä uudella värillä pen = CreatePen(PS_SOLID,1,RGB(rand()%256,rand()%256,rand()%256)); } // end if // liikutetaan viivojen päitä x1+=x1v; y1+=y1v; x2+=x2v; y2+=y2v; x3+=x3v; y3+=y3v; x4+=x4v; y4+=y4v; // Testataan ollaanko osuttu ikkunan reunoihin //ensimmäinen piste if (x1 < 0 || x1 >= WINDOW_WIDTH-10) { // käännetään suunta x1v=-x1v; // tönäistään viiva takaisin reunasta x1+=x1v; } // end if if (y1 < 0 || y1 >= WINDOW_HEIGHT-30) { // käännetään suunta y1v=-y1v; // tönäistään viiva takaisin reunasta y1+=y1v; } // end if //toinen piste if (x2 < 0 || x2 >= WINDOW_WIDTH-10) { x2v=-x2v; x2+=x2v; } // end if if (y2 < 0 || y2 >= WINDOW_HEIGHT-30) { y2v=-y2v; y2+=y2v; } // end if //kolmas piste if (x3 < 0 || x3 >= WINDOW_WIDTH-10) { x3v=-x3v; x3+=x3v; } // end if if (y3 < 0 || y3 >= WINDOW_HEIGHT-30) { y3v=-y3v; y3+=y3v; } // end if // neljäs piste if (x4 < 0 || x4 >= WINDOW_WIDTH-10) { x4v=-x4v; x4+=x4v; } // end if if (y4 < 0 || y4 >= WINDOW_HEIGHT-30) { y4v=-y4v; y4+=y4v; } // end if // valitaan kynä jolla piirretään SelectObject(hdc,pen); //sijoitetaan piirron aloituskohta MoveToEx(hdc, x1,y1, NULL); //piirretään viivat LineTo(hdc,x2,y2); LineTo(hdc,x3,y3); LineTo(hdc,x4,y4); LineTo(hdc,x1,y1); // lukitaan piirto noin 33millisekuntiin while((GetTickCount() - start_time) < 33); //valitaan kynä jolla pyyhitään SelectObject(hdc,e_pen); //sijoitetaan piirron aloituskohta MoveToEx(hdc, x1,y1, NULL); //piirretään viivat LineTo(hdc,x2,y2); LineTo(hdc,x3,y3); LineTo(hdc,x4,y4); LineTo(hdc,x1,y1); // katsotaan onko painettu esc nappia if (KEYDOWN(VK_ESCAPE)) SendMessage(hwnd, WM_CLOSE, 0,0); } // end while // vapautetaan DC ReleaseDC(hwnd,hdc); // lopetetaan ohjelma ja palataan windowsiin return(msg.wParam); } // end WinMain ///////////////////////////////////////////////////////////
Taitaa olla Visual C++.
Unohtakaa tuo edellinen :)
Voi kun gcc kääntäisi cplusplussaa...
KimmoKM eikö se sitten käännä? g++ komento kääntää gcc:ssä
Kun on tarvittavat includet ja kirjastot, niin gcc paska.cpp -liostream tekee sen, mitä pitääkin. Normaalit käännösoptiot toimivat myös.
Jos ei jaksa kirjoittaa -liostreamia jokaisen komentorivin jälkeen, pitäisi gxx (jne).. komennon workkia.
Jos ei jaksa kirjoittaa -/iostreamia jokaisen komentorivin jälkeen, voi tehdä batin, joka pistää iostreamin sinne minne pitääkin.
No g++ kääntää (en tiennytkään siitä)
Eipä taida DJGPP kääntää tota...
Ei DJGPP osaa Windowsille kääntää. www.mingw.org
Aihe on jo aika vanha, joten et voi enää vastata siihen.