tak jak to jest w OpenGL środek okna to punkt (0,0) lewy górny róg (-1,1) prawy dolny róg (1,-1) i według tego skalujesz - czyli nie ważne jaki rozmiar okna proporcje są te same. ja właśnie zaczynam się brać za to zadanko. niby wszystko to samo, ale lepiej zrobić to od zera wprowadzając kilka udoskonaleń. chyba się oprę o książkę Visual C++ dla każdego, bo było tam coś podobnego....
Offline
kurde ... sprobowalem wpisac tak jak kisielewicz mi mowil i nie dziala. powiedzial zeby zastosowac funkcje GetClientRect();
czyli bedzie cos takiego:
CRect rc; GetClientRect(rc); rc.NormalizeRect();
ale mimo wszystko dalej mi to nie dziala
nawet jesli mi wpisze stale
CRect rc; GetClientRect(rc); rc.bottom = -1; rc.top = 1; rc.left = -1; rc.right = 1;
to i tak nie chula :/
mysle ze powinnien pobierac z mainframe wymiary standardowe okna i na podstawie tego przy pomocy getclientrect skalowac, gdyz z tego co czytalem na necie ta funkcja powieksza "wykresy" (prostokaty) jesli sa zbyt male i ledwo je widac lub pomniejsza je jesli sa za duze i bez skalowania beda wychodzic poza standardowy wymiar okna.
ClientRect to obszar roboczy jakby co :P
Ostatnio edytowany przez ShaguaR (2011-04-11 11:47:58)
Offline
ja wymyśliłem sobie takie funkcje oraz zmienne typu int w klasie Cpolab52Doc o nazwach szer i wys:
void Cpolab52View::MyUpdateView() { Cpolab52Doc* pDoc=GetDocument(); CRect cr; GetWindowRect(cr); pDoc->szer=int(cr.Width()/2); //tutaj bierzemy środek okna (ustalenie punktu (0,0) pDoc->wys=int(cr.Height()/2); pDoc->m_a=m_A; pDoc->m_b=m_B; pDoc->m_c=m_C; pDoc->UpdateAllViews(FALSE); } int Cpolab52Doc::X(double x) //x w konwencji OpenGL <-1;1> { return szer+int(x*szer); //dla x<0 będzie na lewo od środka, dla x>0 na prawo } int Cpolab52Doc::Y(double y) { return wys-int(y*wys); //dla x<0 będzie w dół od środka, dla x>0 w górę }
nie sprawdzałem czy dobrze rysuje, bo padłem podczas pisania...
Ostatnio edytowany przez januszs (2011-04-11 12:09:08)
Offline
januszs napisał:
Kod:
CRect cr; GetWindowRect(cr); pDoc->szer=int(cr.Width()/2); pDoc->wys=int(cr.Height()/2);
a probowales to chociaz skompilowac ? bo jesli dobrze pamietam to cos podobnego probowalem i jesli dobrze pamietam to nie mozesz porownywac zmiennej typu int lub double do Rect, gdyz VS kojarzy to tak jakbys chcial porownac zmienna np. m_c do funkcji void np. Oblicz (jesli robiles obliczenia po case'ach).
powinien ci wywalic blad o to ... daj znac jak skompilujesz to czy dziala czy jednak wywallilo ci blad.
Ostatnio edytowany przez ShaguaR (2011-04-11 13:28:29)
Offline
chodzi ci o metody height i width? w pracy nie mam jak tego sprawdzić. w sumie to ja to pisałem z pamięci i chciałem zrobić skrót. obawiam się, że jednak może się nie skompilować. trzeba by najpierw do zmiennych szer i wys przypisać wartości rc.Width() oraz rc.Height() poprzez rzutowanie na typ int a potem wykonać dzielenie przez 2 i wtedy nie powinno już wywalić błędu...
Offline
a w jaki sposob zrobiles wykresy ?
bo u mnie to dlugie wyszlo i moze ty bedziesz mial krocej.
ja mam cos takiego:
CString s; // TEXT danych s.Format(_T("A=%.2lf"),pDoc->m_a); pDC->SetTextColor(RGB(255, 0, 0)); pDC->TextOutW(10,20,s); s.Format(_T(" B=%.2lf"),pDoc->m_b); pDC->SetTextColor(RGB(0, 125, 5)); pDC->TextOutW(80,20,s); // kolory CBrush RED(RGB(250, 25, 5)); CBrush BLUE(RGB(0, 2, 255)); CBrush GREEN(RGB(0, 125, 5)); // wykres danych CBrush *pBrush = pDC->SelectObject(&RED); pDC->Rectangle(10, 40, 10+pDoc->m_a, 45); pDC->SelectObject(&GREEN); pDC->Rectangle(10, 50, 10+pDoc->m_b, 55); pDC->SelectObject(pBrush); if (pDoc->dp==1) { // dodawanie s.Format(_T("A=%.2lf"),pDoc->m_a); pDC->SetTextColor(RGB(255, 0, 0)); pDC->TextOutW(10,20,s); s.Format(_T("+ B=%.2lf"),pDoc->m_b); pDC->SetTextColor(RGB(0, 125, 5)); pDC->TextOutW(80,20,s); s.Format(_T("= %.2lf"),pDoc->m_c); pDC->SetTextColor(RGB(0, 2, 255)); pDC->TextOutW(165,20,s); // wykres dodawania CBrush *pBrush = pDC->SelectObject(&BLUE); pDC->Rectangle(10, 60, 10+pDoc->m_c, 80); pDC->SelectObject(pBrush); }
itd.
nie bede wrzucal calego bo jest 2x tyle :P
Offline
nie wiem ... juz tyle probowalem ze nie mam pomyslow.
ja moge miec reszte inaczej to zrobione niz ty, ale to i tak skalowanie powinno dzialac.
jak chcesz to ci moge podeslac rysowanie wykresow bo duzo jest pisania :P
a ze mi sie nudzilo ostatnio to sie bawilem zeby bylo ladnie kolorowo ^-^]
najgorsze ze wszedzie w necie jest ta funkcja zastosowana w visual c++ a tam troszke inaczej on tworzy pliki niz w visual studio, ale i tak nawet jak to przerobilem na VS to niby dziala, ale skalowania jak nibyyyy mialo dzialac tak nie chula ...
Ostatnio edytowany przez ShaguaR (2011-04-11 19:32:47)
Offline