Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Zaobilazenje mouseMoveEventa u Builder-u

[es] :: C/C++ programiranje :: Zaobilazenje mouseMoveEventa u Builder-u

[ Pregleda: 2409 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

seymour
student
Novi sad

Član broj: 57634
Poruke: 65
*.nat-pool.nsad.sbb.co.yu.

Sajt: www.extrafull.com


Profil

icon Zaobilazenje mouseMoveEventa u Builder-u07.05.2005. u 20:10 - pre 230 meseci
Imam sledeci problem u aplikaciji koju razvijam.Aplikacija se sastoji od glavne forme koja je MDIParent i proizvoljnog broja MDIChild formi gde svaka sadrzi PaintBox na sebi.Recimo da u aplikaciji imam neko stanje gde se na svako pomeranje misa vrsi iscrtavanje nije bitno cega na paintbox-u aktivnog child-a.I to sve treba da se desava dok taster misa nije pritisnut,a na pritisak tastera misa(na mouse down) se izlazi iz tog stanja.Problem je sledeci:u ovom stanju potrebno je da mi se registruje mouse move samo na paintBoxu(znaci i ako izadjem kursorom misa van paintBox-a treba mi poziv mog PaintBox::onMouseMove eventa(treba mi pozicija kursora misa relativna u odnosu na PaintBox),a ne mouseMove eventa glavne forme).Hocu da eliminisem mogucnost biranja kontrola glavne forme(toolbar,meni...) kad se nalazim u tom stanju i automatsku promeni izgleda kursora koju vrsi borland.Moja ideja je da zaobidjem borlandove handlere za dogadjaje(napisao sam je otprilike,naravno sintaksno je neispravna),a voleo bih da mi odgovorite sto detaljnije(sa punim kodom) za resenje.

while (!leftButtonDown){ //kako to proveriti(koja api funkcije)?
p=mouseCursor; //apsolutna pozicija kursora na ekranu(mislim da se u
//Screen promenljivoj ovo moze naci)
p=convertToPaintBox(p); //konverzija apsolutnih koordinata u relativne u odnosu
//na poziciju paintBox-a(koju funkciju za to treba
//pozvati?)
if (p.x!=prosli.x || p.y!=prosli.y){
//..radi vec nesto--nije bitno
prosli=p;
}
}
"necu da budem hipster kao ovi arhitekti koji znaju svakom ime, sta je radio, gde zivi, gde mu je office, gde drzi predavanja i sl... I onda kada vidis neku gradjevinu prvi put treba da pogodis cija je na osnovu stila. Bljak!"
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4901
*.nat-pool.po.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Zaobilazenje mouseMoveEventa u Builder-u08.05.2005. u 08:34 - pre 229 meseci
Citat:

Recimo da u aplikaciji imam neko stanje gde se na svako pomeranje misa...


Kako ulaziš u to stanje (rekao si da izlaziš sa LEVIM klikom)?

Citat:

Problem je sledeci:u ovom stanju potrebno je da mi se registruje mouse move
samo na paintBoxu(znaci i ako izadjem kursorom misa van paintBox-a treba mi
poziv mog PaintBox::onMouseMove eventa


U svakom slučaju savetujem da se koristi istovremeno i TForm OnMouseMove,
jer tada možeš da izračunaš da li je kursor miša unutar TPaintBox::OnMouseMove()

Citat:

(treba mi pozicija kursora misa relativna u odnosu na PaintBox),a ne mouseMove eventa glavne forme).


Trebalo bi da okvir TPaintBox-a možeš da izračunaš /pseudo/

Left + ActiveChild()->PaintBox->Left
Left + ActiveChild()->PaintBox->Left+Width

Top + ActiveChild()->PaintBox->Top
Top + ActiveChild()->PaintBox->Top+Height

... pa ako je kursor u okviru onda mozeš bez problema da ručno pozoveš
odgovarajući TPaintBox OnMouseMove event, pri čemu ćeš argumente morati
sam da izračunaš na osnovu ovih gore parametara.

Mada lično smatram da ti uopšte nije potreban TPainBox OnMouseMove event,
već radi samo sa OnMouseMove glavne forme a kod za iscrtavanje uradi u
običnoj funkciji.

Citat:

Hocu da eliminisem mogucnost biranja kontrola glavne forme(toolbar,meni...) kad se nalazim u tom stanju


To se obično radi sa disablovanjem svih (ili samo kritičnih) stavki menija, a slično je
i za ToolBar koji mislim da može ceo Enabled = false

Code:

// netestirano za MainMenu, probaj i jedan i drugi i vidi da li rade i koji je bolji
void __fastcall TMainForm::SwitchCtrlsMainMenu(bool onoff) 

   // PRVI NACIN:
   if ( onoff )
      Menu=MainMenu;
   else Menu=NULL;

}

void __fastcall TMainForm::SwitchCtrlsMainMenu(bool onoff) 

   // DRUGI NACIN:
   for ( i=0;i<MainMenu->Items->Coun­t; ++i ) 
      MainMenu->Items[i]->Enabled=onoff;  
}


Citat:

i automatsku promeni izgleda kursora koju vrsi borland.


I kursore možeš da podesiš da se ponašaju prema tvojoj želji.

Citat:

while (!leftButtonDown){ //kako to proveriti(koja api funkcije)?


Ne. To se tako ne radi (ne kažem da ne može, jednostavno - tako se ne radi).
Treba:
Code:

while ( SessionInProgress )
{
   // gde je SessionInProgress 'bool' koji će se menjati...
   // ...uklaskom/izlaskom iz tog stanja
   // Zašto, zato što (pored ostalog) sutra možeš da izmisliš kako će se sutra
   // tastaturom menjati stanje a algoritam ostaje isti - menja se samo
   // implementacija
}


Citat:

p=mouseCursor; //apsolutna pozicija kursora na ekranu(mislim da se u


Da li ti treba pomeranje kursora miša dok si u:
1) oblasti galvne forme
2) dok se šetaš mišem po ostatku ekrana dok si van glavne forme (ovo je mnogo
složenije)

Citat:

if (p.x!=prosli.x || p.y!=prosli.y){
//..radi vec nesto--nije bitno
prosli=p;


Ovo bi teoretski trebalo da bude sitnica, a u praksi možeš da iskusiš puno
problema sa iscrtavanjem kada se prebzo budeš "šetao" po formi ;)

Mislim da bi ipak trebao da nam daš više detalja ŠTA tačno želiš da uradiš,
jer se mi ovde možemo ubiti rešavajući nešto što se u konkretnom slučaju
rešava drugačije.

 
Odgovor na temu

seymour
student
Novi sad

Član broj: 57634
Poruke: 65
*.nat-pool.nsad.sbb.co.yu.

Sajt: www.extrafull.com


Profil

icon Re: Zaobilazenje mouseMoveEventa u Builder-u08.05.2005. u 12:14 - pre 229 meseci
Mozda me nisi najbolje razumeo.
Pod stanjem mislim na neko stanje apstraktnog konacnog automata koji opisuje sve moguce dogadjaje u mom programu.Da li si familijaran sa alatom Power designer(alat za izradu class,activity,use case dijagrama,itd.)?E pa ja(i ostatak moje ekipe) imamo zadatak na fakultetu da napravimo Graficki editor dijagrama aktivnosti koji je slican prethodno navedenom alatu.Na stanje koje sam mislio je dodavanje linka koji povezuje dva objekta.Taj link je u stvari isprekidana linija(koja moze da poseduje vise tacaka cvorova) i koja predstavlja smer kretanja algoritma u dijagramu aktivnosti. Neka sam u stanju dodavanja linka.Na prvi mouse down(ako se pogodio neki objekat) se kreira prva(pocetna) i druga(zasad krajnja) tacka linka(tj ulazi se u stanje dodavanja tacke linka).Sada tacka linka prati svaki mouse move koji se dogodi.Na mouse up se proverava da li je pogodjen neki objekat.Ako jeste link se dodaje u listu elemenata dijagrama i vraca se u prethodno stanje,ali ako nije,dodaje se treca(prelomna) tacka linka.Sada se na svaki mouse move pomera treca tacka linka(obrati paznju da taster misa nije pritisnut),a na mouse up(sada se na mouse down ne desava nista) se proverava da li je pogodjen neki objekat.Ako jeste dodaje se link(sa tri tacke) i vraca u prethodno stanje,a ako ne,opet se vrsi pomeranje (sada cetvrte prelomne) tacke linka na mouse move dogadjaj.I tako sve dok se na mouse up ne pogodi objekta ili ako se on desi van PaintBox(tada se prekida ovo stanje i vraca u ono prethodno).Ako se pomeri mis van paint box-a desava se auto scroll(to sam resio,nije predmet rasprave),ali ne sme da dodje do promene izgleda kursora misa,i ne sme se omoguciti fokus neke od controla glavne forme(ne zelim da budu disablovane,jer tako nije ni u Power Designeru),tj treba mi da pomeranje misa bude uvek registrovano samo na paintbox-u.Znaci nije problem kod dodavanja prve dve tacke linka jer se podrazumeva da se tad mouse up desio na paint boxu,pa se i mouse move uvek registruje na paintbox-u,medjutim u ovim drugim slucajevima(ostale tacke,ne drzi se taster misa) ovo nije moguce na ovaj nacin.
Nadam se da si me sada bolje razumeo i da vidis zasto ona tvoja ideja(koja je i meni inace pala na pamet) ne pije vodu(treba menjati mouse move forme,proveriti slektovanje svake od controla glavne forme,ne znam kako zabraniti promenu izgleda kursora,itd...).Mozda neko ima resenje da se nekako naredi borlandu da obradjuje mouse move,mouse down i mouse up dogadjaje uvek na Paint box-u,tj da se preskoce obradjivaci tih dogadjaja van paint box-a(to bi verovatno bilo najbolje)?Ako ne onda neko da predlozi resenje koje bi ispratilo onu prvu moju ideju?
"necu da budem hipster kao ovi arhitekti koji znaju svakom ime, sta je radio, gde zivi, gde mu je office, gde drzi predavanja i sl... I onda kada vidis neku gradjevinu prvi put treba da pogodis cija je na osnovu stila. Bljak!"
 
Odgovor na temu

seymour
student
Novi sad

Član broj: 57634
Poruke: 65
*.ftn.ns.ac.yu.

Sajt: www.extrafull.com


Profil

icon Re: Zaobilazenje mouseMoveEventa u Builder-u10.05.2005. u 16:34 - pre 229 meseci
Ljudi resio sam problem.Postoji funkcija(ili procedure kako neko voli) u unit-u QControls:
extern PACKAGE void __fastcall SetCaptureControl(TControl* Control);
Uz pomoc nje mozemo da preusmerimo sve dogadjaje koji se dese zeljenoj kontroli(u mom slucaju PaintBox-u).Tek se klikom misa na neku drugu kontrolu prebacuje fokus na tu kontrolu,ali tek nakon sto se pozove obradjivac dogadjaja kontrole koju smo capture-ovali.

"necu da budem hipster kao ovi arhitekti koji znaju svakom ime, sta je radio, gde zivi, gde mu je office, gde drzi predavanja i sl... I onda kada vidis neku gradjevinu prvi put treba da pogodis cija je na osnovu stila. Bljak!"
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
..31.216.81.gus.vf.siwnet.net.

Sajt: dejan.lekic.org


+2 Profil

icon Re: Zaobilazenje mouseMoveEventa u Builder-u11.05.2005. u 11:57 - pre 229 meseci
seymour, iz onoga sto si na pocetku pricao ne vidim razlog za koriscenje SetCaptureControl() jer za tako banalnu stvar nema smisla koristiti tu funkciju.
Zasto? - Zato sto u OnMouseMove za celi prozor (recimo) mozes prosto imati jednu proveru da li je kursor iznad neke odredjene kontrole gde nesto radis, ili nije. Ako jeste onda ukljucis dodatnu logiku (menjas kursor, menjas vrednosti nekih drugih kontrola, ili sta vec radis), ako nije onda prosto izadjes iz tog callback-a ...

Uradi samo sledece: selektuj svoj PaintBox objekat u Builder-u, i u Object Inspector-u klikni na tab "Events". Tu odaberi OnMouseMove i dvoklikni kada ti je kursor unutar tekst boksa gde unosis naziv callback-funkcije (Borland ce automatski da kreira jednu za tebe). Tu edituj kod koji ti treba SAMO ZA PAINTBOX OBJEKAT.

U "Properties" delu Object Inspector-a selektuj "Cursor" stavku i tu izaberi crCross da bi ti se kursor promenio kada prelazi preko PaintBox-a. To je sve, koliko ja kapiram iz tvog teksta, sto tebi treba.

Prilazem i projekat uz to pa pogledaj sam.
Snimak
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
Prikačeni fajlovi
 
Odgovor na temu

seymour
student
Novi sad

Član broj: 57634
Poruke: 65
*.nat-pool.nsad.sbb.co.yu.

Sajt: www.extrafull.com


Profil

icon Re: Zaobilazenje mouseMoveEventa u Builder-u13.05.2005. u 09:43 - pre 229 meseci
Hvala ti,ali me ocigledno nisi razumeo.Meni je bio cilj da se i kad se mis nalazi van paint boxa,a ne drzim taster misa,pri svakom mouse Move-u poziva handler malo pre navedenog dogadjaja iz Paint Box-a(tj da capturujem PaintBox da se pri svakom dogadjaju pozivaju njegovi obradjivaci).Recimo,zelja mi je bila da pomeram mis po bilo kom delu glavne forme(po bilo kojoj kontroli koja nije Paint Box),a borland mi poziva PaintBox::onMouseMove metodu,a ne OnMouseMove te druge kontrole.Shvatas?A ti si mi poceo da objasnjavati kako se pise SW jednostavnog ponasanja.Pa valjda znam kako se handluju(obradjuju) dogadjaji.U krajnjem slucaju pravimo alatku slicnu Power designeru(samo sa mnogo,mnogo manje komponenata) i dosta smo odmakli(ostao je jos Undo-redo,cut-copy-paste,eventualno ubacivanje sinonima,iteratora i jos neke ispravke),a ti si mi prikazao crtez programa koji je jednostavan da jednostavniji ne moze biti.Pravo da ti kazem malo si mi povredio sujetu :) Salim se.U svakom slucaju pretpostavljao sam da postoji ovakva neka fu-ja,samo nisam bio siguran,jer nisam puno koristio vizualne alate kakav je Builder.U stvari, otkako sam ove cetiri godine na faksu(FTN NS,racunarstvo) nisam ni programirao nista posebno :))Mislim da ni crackovati bilo sta vise ne bih mogao :((E da kad sam kod crackovanja jer se koristi jos uvek Soft Ice za Windows platforme?
"necu da budem hipster kao ovi arhitekti koji znaju svakom ime, sta je radio, gde zivi, gde mu je office, gde drzi predavanja i sl... I onda kada vidis neku gradjevinu prvi put treba da pogodis cija je na osnovu stila. Bljak!"
 
Odgovor na temu

[es] :: C/C++ programiranje :: Zaobilazenje mouseMoveEventa u Builder-u

[ Pregleda: 2409 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.