Zdravím, tak jsem začal plně pracovat na aplikaci na návrh el. obvodů. Jelikož pracuju v MFC uplně poprvé a nemám s ním vůbec žádné zkušenosti tak bych prosil pár rad. (postupně budu přidávat další dotazy)
Zatím je tu první várka :)
- budu potřebovat označit součástku, kterou jsem si přidal do dokumentu a nějak dál s ní pracovat. Zatím mě napadlo řešit to pomocí Rectangle - udělal bych rectangle kolem součástky a pak bych testoval při kliknutí zda je kurzur uvnitř toho rectanglu (myslim že třída Rectangle na to má dokonce i nějakou metodu).
Tak tady je to jasné, udělám to s tím rectanglem
Ovšem zdá se mi, že toto řešení má nějaké nevýhody např.:
- kvůli jedné součástce budu muset kontrolovat celé pole součástek, abych zjistil na kterou součástku jsem klikl, takže by bylo asi výhodnější rozdělit si obrazovku do několika sektorů, kde by každý sektor měl své pole.. Což by asi nebyl takový problém - měl bych třeba 4 velké rectangly a 4 odlišná pole.
Tady asi použiju řešení R-Tree, které se mi na to docela líbí
Napadlo mě - když už bych to takhle rozděloval na 4 rectangly nešlo by to tak udělat i s překreslováním okna? Takhle když přidám součástku, tak dojde k překreslení celého okna znovu
(Zatím to mám řešené tak, že dojde k přidání součástky do bitmapy která je v paměti a tou potom přepíšu celý dokument. Dřív sem ještě používal řešení že sem měl paměť na jednotlivé čáry apod. a překresloval sem celou paměť, teď už by to mělo být o něco leší)
A pak sem se ještě chtěl zeptat zda je lepší řešit součástky pomocí bitmapy v resources pro každou součástku, nebo jí "ručně" vykreslit pomocí GDI funkcí (tak to mám řešené teď) - např. odpor mám vykreslený pomocí 2 LINE a 1 Rectanglu. Cívka jsou 3 Arcs a 2 Line jako ostatně všude - zatím dělám základní součástky R, L, C + zdroje a tam se obejdu se 2 vývody...
A ještě další dotaz :) V eaglu se mi líbí, že když si vyberu součástku, tak se mi přilepí na kurzor a sleduje ho (tak že kurzor je ve středu součástky) chtěl bych to do svého programu taky implementovat, ale jak to udělat bez neustálého překreslování? Lze to vůbec?
(tady je příklad toho jak to myslím, bohužel s překreslováním :( ale alespoň z toho lépe pochopíte o co jde)
http://www.edisk.cz/stahni/45171/Animation.rar_1.21MB.html
(Všiml jsem si, že v eaglu vůbec nedochází k problikávání ani když přidávám moooc součástek hodně rychle, u mého programu stačí přidat trochu rychleji za sebou více součástek a už bliká jak stroboskop.. Natožpak tam ještě cpát to s tim sledováním kurzoru)
Všem děkuji za trpělivost při čtení tohoto celkem dlouhého příspěvku a za případné rady.
P.S: Zítra sem asi hodím zdroják pro lepší představu
Edit: přidal jsem odkaz na ukázku "sledování kurzoru"
Fórum › C / C++
MFC - prosím o pár rad
1, S tim rectanglem bych to resil asi stejne.
2, S tim rozdeleni na boxiky to by slo taky,ale podle me je to zbytecne (zalezi, jak moc velke to ma byt). Pochybuju, ze budes mit schema o 100 000 soucastkach a pokud ano, tak ti ani tohle rozdeleni moc nepomuze.Spise bych to resil asi nejakym stromem nebo podobnou strukturou, ktera by mela uchovane pozice x a y a podle nich bych vyhledaval.
3, To s tema bitmapa, to zalezi spis asi na nejakych potrebach, ale spis bych pouzil bitmapu.Teoreticky bys s tema bitmapa mel i jednodussi praci pro vyhledavani tech komponent apod.
4, Samozrejme, ze to prilepeni lze udelat.Akorat si budes muset propocitavat stred rectanglu a podle toho nastavit pozici te bitmapy nebo toho, co presunujes.
5, To s tim blikanim by mel vyresit double buffering, ale s GDI sem zatim moc nepracoval, tak nemuzu poradit presneji (mozna nekdo jiny bude vedet).
Koukni se na knihovny pro r-stromy (r-tree). To jsou datové struktury pro uchování souřadnic a obdélníků apod. a rychlé dotazování. Založeny jsou právě na principu dělení na boxy, ale rekurzivně. Tedy ty boxíky jsou rozděleny opět na menší, pokud obsahují více součástek apod.
Nevíte někdo pls jak udělat to "sledování kurzoru" (hlavně bez problikávání a tak, aby to nijak neovlivnilo ostatní objekty) ? Ukázkový program:
http://www.edisk.cz/stahni/45171/Animation.rar_1.21MB.html
Zdravím,
neuvedl jsi zdrojáky, takže lze jen odhadovat. Pokud používáš double buffering, tak se ujisti, že v handleru zprávy WM_ERASEBKGND vracíš FALSE, čímž říkáš systému, aby nepřekřesloval pozadní View. Co se týká toho sledování kurzoru, tak předpokladám, že ten rezistor má nějaké své souřadnice levého horního vrcholu, takže pak:
// ten kod si jen vysmyslim, netusim jak to mas napsano
CElectricalElement * pSelected = getSelectedElement();
if( NULL != pSelected )
{
CPoint ptCurr = pSelected->getTopLeft(); // getTopLeft vraci horni bod vybrane soucastky
ptCurr = ptCursor - ptCurr; // ptCursor je souradnice mysi
pSelected->setTopLeft(ptCurr); // a nove nastaveni
}
No, snad to jde pochopit.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Prosím o vysvětlení pár řádků. — založil BT
Pár oprav a pár novinek :-) — založil Curo
Regrese dvou řad — založil fxmag
Hledám RAD SW a vybírám jazyk — založil Matej
Rad cisel, potrebuji pomoc :) — založil janik366
Moderátoři diskuze