Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C: Pyörivä Neliö

Sivun loppuun

HtH [29.08.2002 12:08:06]

#

Pieni esimerkki, joka näyttää pyörivän neliön tyhjässä ikkunassa käyttäen GDI:tä. Kääntyy ainakin Visual C++:lla, saattaa jopa Borlandilla. Pienenä plussana nuolinäppäillä voi muuttaa neliön paksuutta, ja kokoa. Mitäpä tässä enää muuta sepostamaan.. No ainkin että http://koti.mbnet.fi/~haraa/files/nelio.exe löytyy valmiiksi käännetty versio, jos et jaksa kääntäjää availla/jotain muuta.

// Neliö By:HtH
/*
Todella paska demo, joka näyttää pyörivän neliön, joka tosin välkkyy pahasti.
Koodi kääntyy ainakin Visual C++:lla, ehkäpä jopa Borlandilla.
Koodista löytyy varmasti optimoimisen varaa, eikä GDI:llä piirtäminen ei ole nopeata.
*/

#define WIN32_LEAN_AND_MEAN

#include <stdio.h>
#include <windows.h>
#include <windowsx.h>
#include <stdlib.h>
#include <math.h>

#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) /* pieni makro, joka katsoo näpin painallusta */

	int WINDOW_WIDTH = 400;
	int WINDOW_HEIGHT = 300;


LRESULT CALLBACK WindowProc(HWND hwnd,  // Tapahtuma käsittelijä, joka hoitaa taloustyöt.
							UINT msg,
							WPARAM wparam,
							LPARAM lparam) {
	HDC gdc;
	switch(msg) {
	case WM_ACTIVATE: {
		return(0);
					  } break;
	case WM_DESTROY: {
		PostQuitMessage(0); return(0); } break;
	case WM_SIZE: {
		WINDOW_WIDTH = LOWORD(lparam);
		WINDOW_HEIGHT = HIWORD(lparam);
		return(0);

					} break;
	default:break;
	}
	return(DefWindowProc(hwnd, msg, wparam, lparam));
} // End WindowProc


int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int nshowcmd)
{
	WNDCLASSEX winclass; // Luodaan wndclassex
		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_CROSS);
		winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
		winclass.lpszMenuName = "MainMenu";
		winclass.lpszClassName = "mainwin";
		winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
		HWND hwnd;
		MSG msg;
		HDC gdc;
		RegisterClassEx(&winclass); //Kerrotaan luokasta myös Windowsille.
		srand(10);
int jr = 0, jg=0, jb=0;
double p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y, k=0;
int thickness=2;
int pyyhithickness = thickness;
int size=100;
int piirra=0;
unsigned char r = 0, g = 0, b = 0;
		if(!(hwnd = CreateWindowEx(NULL, "mainwin", "Yet another GDI test", /*Luodaan ikkuna*/
			WS_OVERLAPPEDWINDOW | WS_VISIBLE,
			10,10,WINDOW_WIDTH,WINDOW_HEIGHT,NULL,NULL,hinstance, NULL))) return(0);
			DWORD alku = GetTickCount();
			DWORD juttu = alku;
		while(TRUE) {
			if(!PeekMessage(&msg , NULL, 0, 0, PM_REMOVE)) {
				if(msg.message == WM_QUIT) {break;}
			} // End If
			TranslateMessage(&msg);
			gdc = GetDC(hwnd);
			alku=GetTickCount();

			COLORREF vari = RGB(127,127,255);
			HPEN pen_thick = CreatePen(PS_SOLID, thickness, vari); // Tehdään piirto, ja pyyhinkynä.
			HPEN pen_pyyhi = CreatePen(PS_SOLID, pyyhithickness, RGB(0, 0, 0));
			HPEN old_pen = (HPEN)SelectObject(gdc, pen_pyyhi);
			MoveToEx(gdc, p1x, p1y, NULL); // Pyyhitään neliö
			LineTo(gdc, p2x, p2y);
			LineTo(gdc, p3x, p3y);
			LineTo(gdc, p4x, p4y);
			LineTo(gdc, p1x, p1y);
			p1x = WINDOW_WIDTH / 2 + sin(k) * size;
			p2x = WINDOW_WIDTH / 2 + sin(k + (3.14/2)) * size;
			p3x = WINDOW_WIDTH / 2 + sin(k + 3.14) * size;
			p4x = WINDOW_WIDTH / 2 + sin(k + 3.14 + (3.14/2)) * size;
			p1y = WINDOW_HEIGHT / 2 + cos(k) * size;
			p2y = WINDOW_HEIGHT / 2 + cos(k + (3.14/2)) * size;
			p3y = WINDOW_HEIGHT / 2 + cos(k + 3.14) * size;
			p4y = WINDOW_HEIGHT / 2 + cos(k + 3.14 + (3.14/2)) * size;
			SelectObject(gdc, pen_thick);
			MoveToEx(gdc, p1x, p1y, NULL); // ... ja piirretään
			LineTo(gdc, p2x, p2y);
			LineTo(gdc, p3x, p3y);
			LineTo(gdc, p4x, p4y);
			LineTo(gdc, p1x, p1y);
			ReleaseDC(hwnd, gdc);
			k+=0.1;
			SelectObject(gdc, old_pen);
			DeleteObject(pen_thick);
			DeleteObject(pen_pyyhi);
			DispatchMessage(&msg);
			while((GetTickCount() - alku) < 33);
			pyyhithickness = thickness;
			if(!KEYDOWN(VK_UP) && thickness < 100) thickness+=3;
			if(!KEYDOWN(VK_DOWN) && thickness > 1) {pyyhithickness = thickness; thickness-=3;}
			if(!KEYDOWN(VK_LEFT) && size > 1) size-=3;
			if(!KEYDOWN(VK_RIGHT) && size < 500) size+=3;

		} //End While
		return(msg.wParam);
} // End WinMain

HtH [30.08.2002 21:53:43]

#

ohoh... sisennys mennyt vähän perseelleen... >:(

Joni_ [30.08.2002 21:54:25]

#

jeah. way to go harripoi!

Joni_ [30.08.2002 22:10:54]

#

jeah. way to go harripoi!

Joni_ [30.08.2002 22:11:04]

#

jeah. way to go harripoi!

Vilikki [02.09.2002 19:55:58]

#

Hieno...

Lord Juha [02.10.2002 16:36:03]

#

Kyllähän se siinä pyörii
HITON SIISTI OHJELMA!!!!

progo [10.02.2003 20:14:01]

#

Tyylikäs ohjelma, enempää ei tarvitse vaatia windows-koodivinkistä :)

Olli Vanhoja [27.06.2003 14:07:38]

#

Ei toimi, kaatuu kokoajan :'(

Ilmuri [04.08.2003 12:19:27]

#

aijai! kommentti alussa auki...

Mazku [31.08.2003 14:26:03]

#

ihan hyvä mut huomaa heti et ei oo kaksois puskurointii, ai ai!

Mazku [31.08.2003 14:26:08]

#

ihan hyvä mut huomaa heti et ei oo kaksois puskurointii, ai ai!

tejeez [02.09.2003 16:42:10]

#

Mazku, teeppäs sä se kaksoispuskurointi tohon jos semmosen haluut ;>

AL_e [13.11.2003 20:51:09]

#

tosta oli hyötyä mun autopeliin :D kiitti! tein samal kaksoispuskurointi version sdlläl... sen löytää tuolta koodivinkeistä kans :P

Linkku [07.05.2004 17:32:16]

#

Hienoo! Kääntyy ainakin Borlandin C++BuilderX:llä.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta