Visual cpp .NET - rysowanie

0

Witam wszystkich,
Niestety, nie mam wyboru i muszę się publicznie ośmieszyć:
Czy ktoś mógłby mi napisać gdzie się rysuje figury, wykresy funkcji itp. w środowisku Visual Studio (Cpp) .NET?
Chciałbym nie rysować na niewygodnym formie, a nawet z tym mam problemy(to jest zresztą niewygodne i w innych środowiskach były inne metody na obiektach do tego stworzonych).

Serdecznie dziękuję za każdą odpowiedź,
Arrowman

Może, ktoś miałby też warty polecenia kurs jak rysować w direct(2D)? Pod , to środowisko i z prockiem 64bitowym(intel core 2 duo)(próbowałem coś w tym robić, ale na starcie wywalało biblioteki, mimo, że mam system 32bity, to potrzebuję 64bitów? W sumie, to na obie mi wywalało błędy).
Chyba ten kto wymyśliłby kurs, po którym by wszystko każdemu działało w nim zawarte, zasługiwałby na Nobla... I z 10mld $.

0

Pod C#/Forms wyglada to podobnie jak GDI+, wlasciwie to to samo.
Przejrzyj metody obiektu System.Drawing.Graphics - powinienes znalezc sporo w tym temacie.
Czy masz problem ze zliczeniem statystyki/histogramu z danych wejsciowych, czy tylko przypadkiem tam odpisales?

Totalna podstawa jest wpiecie sie w event Control/Form/UserControl::Paint, w parametrach eventhandlera dostaniesz wlasnie obiekt Graphics i nim mozesz sobie rysowac dowoli po formie/control..

Ale, to w [On]Paint. Jesli chcesz moc bezpiecznie rysowac 'skadkolwiek/kiedykolwiek', powinienes zrobic sobie jakas tymczasowa bitmape (System.Drawing.Bitmap/Image), na niej stworzyc nowy swoj obiekt Graphics (przejrzyj jego konstruktory i metody statyczne) i za pomoca niego bedziesz mogl rysowac kiedykolwiek. Potem zas, w Form/Control/itp w zdarzeniu [On]Paint bedziesz mogl przerysowac ja (za pomoca e.Graphic.Draw/Image/BitBlit itp) z 'tymczasowej' bitmapy na wlasciwe miejsce formatki. Albo bedziesz mogl uzyc PictureBoxa i jego .Image ustawic na te 'tymczasowa' bitmape..

I drobiazg: jak juz sobie napiszesz kod ktory narysuje cos na czyms, czasami warto wywolac recznie Form/Control.Invalidate[Rect], gdyz bez tego system nie wpadnie magicznie sam na to, kiedy warto odswiezac okno/animacje/etc

ps. nie pamietam zebym odkogokolwiek wzial jakies pieniadze za pomoc na forum, wiec sie hamuj łaskawie..

0

Dziękuję serdecznie za odpowiedź. Okazała się bardzo pomocna. Umiem już rysować punkty na tej bitmapie i funkcje też:-)

Mam jednak problem z tym stworzeniem na tej bitmapie obiektu graphics. Wywala mi taki błąd:

System.NullReferenceException: Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.
   w System.Drawing.Pen.set_Color(Color value)
   w Rysowanie.Form1.button1_Click(Object sender, EventArgs e) w c:\users\arrowman\documents\visual studio 2008\projects\rysowanie\rysowanie\form1.h:wiersz 151
   w System.Windows.Forms.Control.OnClick(EventArgs e)
   w System.Windows.Forms.Button.OnClick(EventArgs e)
(...)

Kod buttona(rysuj - jest, to pictureBox, ta - textbox, jest parametrem 'a' funkcji y = a*x^2):

	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
				       int i,y,y2,x,j;
					   double a;
					   
					   // Tworzę obiekt Bitman z pliku
					   Bitmap^ myBitmap = gcnew Bitmap( "Grapes.bmp" );
						
					   Graphics ^ g;
					   // Ustaiwam(?) obiekt na myBitmap
					   g->FromImage(myBitmap);
					   // Tworzę pędzel
					   Pen ^P;
					   // Kolor pędzla 
					   P->Color = Color::Black;
					   // Wielkość pędzla
					   P->Width = 2;

					   // Pobieram kolor piksela z myBitmap
					   Color pixelColor = myBitmap->GetPixel( 50, 50 );
					   
					   // tworzę konwerter
					   //System::ComponentModel::TypeConverter^ converter = System::ComponentModel::TypeDescriptor::GetConverter( pixelColor );
					   // Pobieram kolor z RGB
					   pixelColor = Color::FromArgb(255,255,255);
					   // Nadaję kolor pikselowi
					   myBitmap->SetPixel(10,40,pixelColor);

					   if (ta->Text=="") ta->Text = "1";
					   a = Convert::ToDouble(ta->Text);

					   for(i = 0; i < 300; i++) {
						   x = i;
						   y = Convert::ToInt32(a*(x*x));
						   y2 = Convert::ToInt32(a*((x-1)*(x-1)));
						   if ( ( (y-y2)>1 )&&( y2<=299 ) ) 
							   for(j = 1; j < (y-y2); j++) {
								   if ( (y2+j)>299 ) break;
								   myBitmap->SetPixel(x,299-(y2+j),pixelColor);
							   }

						   if (y > 299) {
								y = 299;
						   } else {
						      myBitmap->SetPixel(x,299-y,pixelColor);
						   }
					   }
					   
					   myBitmap->Save("g.bmp");
					   g->DrawRectangle(P,0,0,10,10); // TUTAJ BŁĄD!!!

					   //l1->Text = Convert::ToString(converter->ConvertToString( pixelColor ));
					   rysuj->Load( "g.bmp" );
					   


			 }
	};

1 użytkowników online, w tym zalogowanych: 0, gości: 1