» »

Program v c++

Program v c++

Bela01 ::

Zopet se oglašam za pomoč. V c++ delam program, ki izračuna presečišče dveh daljic. Problem pa je sledeč. Npr. na okno programa naklikam tri točke, torej eno daljico in eno točko, potem pa grem npr. vmes še delat kaj drugega na drugem programu in ko grem spet nazaj na tega opazim da je narisal še drugi premico in to tako, da je tisti klik, ko sem jaz kliknila na drug program spodaj zaznal kot da sem na okno kliknila, finta pa je v tem, da mi vseeno ne izračuna presečišče ampak morem še enkrat kliknit nekje, da mi še eno daljico nariše. Torej imam na oknu narisanih vse skupaj tri daljice. Torej problem je v tem, da za koordinate program uporablja cel zaslon in ne samo tisti del okna, i je namenjen programu. Kak torej zablokirat, da uporablja program samo tisti del okna, kjer je odprt program. In ne, da npr. če klikneš na "Start" vzame tudi tisti klik (samo hec je ko pol vseeno ne izračuna presečišča, ampak samo nariše daljico).
V glavnem jaz ne bi rada da bi melo okno programa neko fiksno velikost (lahko ga zmanjšaš oz. povečaš), vendar naj upošteva samo tisto klikanje kjer je okno. Torej, če klikam na meni start naj tega ne upošteva.
Upam da sem dovolj razumljivo napisala.

LP, Ines

Gundolf ::

Odvisno v čem programiraš ta okna (visual c++, borland, vxwindows, qt, ...). Drugače je pa običajno obnašanje oken tako, da upoštevajo le klike na njih in bi se moral matrat da bi naredil tako obnašanje kot ga imaš ti :D.

Quikee ::

Uh.. na kak nacin pa dobis koordinate daljic (v kateri metodi) saj se mi zdi to cudno, da se tak obnasa.

Aja BTW.. lahko bi kar nadaljevala v prejsnji temi. =)

Zgodovina sprememb…

  • spremenil: Quikee ()

Bela01 ::

Koordinate daljic dobim tako, da prebere točke ki jih naklikam na okno. Te koordinate prebere v posebej razredu in jih prenese v funkcijo, ki potem te koordinate uporabi za risanje. Zanimivo je tudi, da ne nariše tiste točke, ki je ne bi smel prebrat, na tistem mestu kjer sem kliknila, ampak jo naredi višje na okno (torej na isti premici če bi tak gledo, samo ne tak nizko).
A se kermu da da bi vido ta programček kak dela? Samo malo me spomnite kje že grem da ga dokončam (da dobim samo .exe fajl)

No ta zanimivost se najbolj vidi ko recimo vmes prešaltam na Messengerja ;)

Bela01 ::

Aja pa še nekaj. To pa sprašujem za en drug program. Ali obstaja v c++ rand funkcija, kjer lahko nastavljaš da ti npr. naključno meče števila med npr. 0 in 500. Oz. če se da RAND_MAX nastavit na nižji limit?

Bela01 ::

Programiram pa v visual c++

Tutankhamun ::

sej .exe že maš. Tja kamor si shranila projekt, maš mapo debug notr pa je .exe datoteka
AMD Phenom QUAD 9950 Black Edition, 8GB

Bela01 ::

Ja to vem. Samo a ni to da moreš pol še nekaj poleg vključit ne vem točno ker sem že pozabla. A bo delal ta programček (če samo ta .exe fajl pošljem) tut na drugem rač., kjer ni c++ gor inštaliran?
Vrjetno so ostale datoteke tut pomembne, npr. .bsc datoteka je 10× večja od .exe. Ne vem pač sklepam.
Malo sem gledla, vem da moreš v project settings nekaj nastavit, samo nevem kaj :8)

Zgodovina sprememb…

  • spremenila: Bela01 ()

64202 ::

rand() % meja -> [0, meja)
I am NaN, I am a free man!

Zgodovina sprememb…

  • spremenilo: 64202 ()

Quikee ::

Hm.. kaj ne beres koordinat v funkciji OnLButtonDown?
Jaz sem takrat ko sem delal naredil tako v tej OnLButtonDown metodi:
void CDaljicaView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	CView::OnLButtonDown(nFlags, point);
	switch(k) {
	case 1: 
		daljica1.tocka1=point;
		k++;
		return;
	case 2: 
		daljica1.tocka2=point;
		k++;
		Invalidate();
		return;
	case 3:
		daljica2.tocka1=point;
		k++;
		return;
	case 4:
		daljica2.tocka2=point;
		k=1;
		Invlalidate();
		IzracunajPresecisce();
		return;
         }
}


Na tak nacin teh problemov nisem mel.

O tem kako se uporablja rand() funkciji si lahko preberes tukaj.

Exe datoteka je dovolj za zagon programa in program bo delal tudi na drugem racunalniku (z windowsi) tudi ce nima c++ instaliranega. Razen ce hoces zraven poslat se izvorno kodo.. v tem primeru iz mape od projekta zbrisi vsebino Release oz. Debug mape razen .exe. Vsa izvorna koda se tako ali tako nahaja v mapi projekta.. Release in Debug sta le mapi, kjer se naredi exe datoteka za zagon ter zacasne datoteke, ki jih ustvari VC++.

Gundolf ::

Verjetno uporabljaš MFC? Ali Windows API? To je še pomemben podatek. Če MFC, potem ti program izgleda podobno kot je Quikee nakazal, v drugem primeru pa je povsem drugačen.

Poleg exeja pa večinoma rabiš še eno ali dve microsoftove knjižnice z imenom a la msvc70.dll. Odvisno od tega kater visual uporabljaš in kako scompilaš. Drugače pa misli da exe pri reševanju tvojega problema ne bo nikomur pomagal.

Quikee ::

Gundolf: program pise v MFC.. ker smo mi tudi pri geometriji pisali presecisce dveh daljic v MFC. =) Ta tema pa je v bistvu nadaljevanje "c++: MessageBox in (ne)brisanje okna z njim" teme.

Gundolf ::

Aha, OK. Se pravi ji boš ti v pomoč.

Kaj vas to na FMF mučijo s programiranjem?

Quikee ::

Ne.. na FERI-ju RI. =) V bistvu je zelo zanimiv predmet to.. izracun presecisca dveh daljic je samo tak za segrevanje (da vidis kako se efektivno uporablja vektorski produkt). Kasneje pridejo se na vrsto konveksna lupina (iskanje konvkesne lupine okoli danih (random generiranih) tock) ter vsebnostni test (ce se tocka nahaja v poljubnem mnogokotniku ali izven nje). Poudarek je predvsem na samih algoritmih in je teorije zelo malo (ce prav je odzadaj teh algoritmov dosti teorije in racunanja ampak ta bi bili pomoje res za kaksen FMF =) ).

Gundolf ::

Aha zanimivo. No očitno imate v mariboru malo bolj zanimiv študij kot tu na FRI. Čeprav ne vem kako je zdaj po spremenjenem programu.

Bela01 ::

Ja to je na feriju. No jaz nisem s ferija :P, ampak s pef, tja pa hodim k temu predmetu ker mam vezavo rač. No saj vseeno. Predmet je v glavnem zelo zanimiv. V algoritmih sploh ni problem, niso ravno tak težki.Konveksno lupino že tut delamo. Jaz bi samo rada malo sfrizirala programček, da bi boljše zgledal, drugače v osnovi dela vse.

Quikee: podobno mam jaz nareto, le da brez kazalcev, vendar to nima veze. Pa jaz še pol sproti rišem daljice.
Torej po vseh pravilih torej program tega ne bi smel delat. Koordinate dobivam na dva načina: ali da likam na okno in jih berem s point ali pa jih vnesem v dialog. No če jih vnesem v dialog problema itak ni ker te program tako dolgo gnjavi da moraš vse vstavit. Problem torej nastane ko klikam na okno in vmes kliknem še na drug program, no takrat si pa on kar zmisli koordinato in nariše daljico, vendar ničesar ne izračuna.

Tak zgleda moja koda:
CDC *okno= GetDC(); //za delo po oknu

	switch (klik)
	{
	case 0:
		tockaA= point;
		okno->MoveTo(tockaA);
		okno->TextOut(tockaA.x-6,tockaA.y-6,"A");
		klik++;
		break;
	case 1:
		tockaB= point;

		if (tockaA == tockaB)
		{
			MessageBox("Nelogični podatki!","Sporočilo");
			OnFileNew();
		}
		else
		{
			okno->MoveTo(tockaB);
			okno->TextOut(tockaB.x-6,tockaB.y-6,"B");
			okno->MoveTo(tockaA);
			okno->LineTo(tockaB);
			klik++;
		}
		break;
	case 2:
		tockaC= point;
		okno->MoveTo(tockaC);
		okno->TextOut(tockaC.x+6,tockaC.y+6,"C");
		klik++;
		break;
	case 3:		//ob zadnjem kliku se pokliče proceduro, ki ugotovi ali se daljici sekata
		tockaD= point;

		if (tockaC == tockaD)
		{
			MessageBox("Nelogični podatki!","Sporočilo");
			OnFileNew();
		}
		else
		{
			okno->MoveTo(tockaD);
			okno->TextOut(tockaD.x+6,tockaD.y+6,"D");
			okno->MoveTo(tockaC);
			okno->LineTo(tockaD);
			klik++;
		
			Izpis();
		}

		break;
	}

Tak pa zgleda ko ga mimo vseka: Slika

Zgodovina sprememb…

  • spremenilo: CCfly ()

Bela01 ::

Navpična daljica (s točkama c in d) je tista, ki si jo je program izmislil.

Quikee ::

No to je OK... samo v tej metodi ne rabis nic risat ker lahko poklices metodo OnDraw(), ki ti bo narisala na zaslon daljici.. tako da lahko nadomestis vse metode risanja z Invalidate();. V OnDraw() pa implementiraj le:

if(klik >= 1)
{
	pDC->TextOut(tockaA.x+6,tockaC.y+6,"A");
}

if (klik >= 2)
{
	pDC->MoveTo(tockaA); 
	pDC->LineTo(tockaB);
	pDC->TextOut(tockaB.x+6,tockaB.y+6,"B");
}

if (klik >= 3)
{
	pDC->TextOut(tockaC.x+6,tockaC.y+6,"C");
}

if (klik >= 4)
{
	pDC->MoveTo(tockaC); 
	pDC->LineTo(tockaD);
	pDC->TextOut(tockaD.x+6,tockaC.y+6,"D");
}


Moralo bi delat identicno.. lahko pa da sem se kje zmotil saj sem to napisal na pamet. Aja TextOut metoda ne rabi MoveTo ker metodi podas koordinate kot parameter. MoveTo je le za risanje daljic.

BTW. Kaj si mela do zdaj v OnDraw metodi?

Bela01 ::

Hvala za odgovor. No bom probala zdaj to malo spremenit pa videt. V bistvu ostale stvari pa to mam itak tam v OnDraw funkciji nareto. Bom zaj te to malo spremenila. a misliš da bi to potem vplivalo na to, da si več ne bi zišljeval točke in risal?

Bela01 ::

Zdaj sem dala vse v OnDraw funkcijo i zdaj dela vse tak kot mora 0:) .
Hvala za pomoč - vrjetno se še oglasim :P


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

enačba krožnice

Oddelek: Šola
121566 (1045) Unilseptij
»

Arduino - krmiljenje stepper motorjev

Oddelek: Elektrotehnika in elektronika
153586 (2765) steling
»

[C++] preprosto risanje

Oddelek: Programiranje
71594 (1471) popec
»

c++: MessageBox in (ne)brisanje okna z njim

Oddelek: Programiranje
81100 (1057) Bela01
»

Pomoč pri nalogi iz C++

Oddelek: Programiranje
5975 (932) Quikee

Več podobnih tem