Windows Forms button i druga linia

0

Jakich użyć parametrów w private void OnButton_OK (object sender, EventArgs e) aby wywołać ponownie private void OnPaint_Rezistor (PaintEventArgs e) by narysowało drugą linię a może jest inny sposób by po narysowaniu jednej linii po użyciu np. buttona program narysował drugą linię.

using System;
using System.Windows.Forms;
using System.Drawing;

namespace Nowy_Program
{

	public class Window:Form
	{
		Pen Pen_Rezistor;
		Button Button_OK;
		int iA;
		
		private void OnPaint (object sender, PaintEventArgs e)
		{
			OnPaint_Rezistor(e);
		}

		private void OnPaint_Rezistor (PaintEventArgs e)
		{
			Pen_Rezistor = new Pen(Color.Red, 2);
			e.Graphics.DrawLine(Pen_Rezistor, 30, 20, 150, 20);
			
			if (iA ==1)
			e.Graphics.DrawLine(Pen_Rezistor, 30, 60, 150, 60);
			
		}

		private void OnButton_OK (object sender, EventArgs e)
		{

			iA = 1;
			//  ??
		}

		public Window()
		{
			iA = new int ();
			
			this.Width=350;
			this.Height=420;
			this.Text = "Window";
			this.Paint += new PaintEventHandler(OnPaint);
			
			Button_OK = new Button();
			Button_OK.Parent = this;
			Button_OK.Location = new Point (140,160);
			Button_OK.Text = "OK";
			Button_OK.Click += new System.EventHandler(OnButton_OK);	
			
			this.Controls.Add(Button_OK);		
			
		}
		[STAThread]
		public static void Main()
		{
			Application.EnableVisualStyles();
			Application.Run (new Window());
		}
	}
}
1

Zasadą ogólną jest, nie woła się "ręcznie" OnPaint.
System wywołuje po jakiejś inwalidacji dostarczając argument 'Panit Event' w chwili na którą nie bardzo masz wpływ

Rozwiązujesz nie ten problem, co trzeba (i niejasno piszesz)
Co cię powstrzymuje przed wymalowanie całego rezystora, skoro sugerujesz, ze pierwsza kreska się udaje?

0

@AnyKtokolwiek: Piszę prosty program, którego zadaniem będzie rozkodowanie wartości opornika po przez podane przez użytkownika kolory pasków. Pomysł jest taki by przy starcie programy rysował się ogólny zarys rezystora a następnie jak użytkownik wybiera kolory (combobox) by na tym schemacie pojawiały się kolory. Na zakończeniu program ma zwrócić wartość opornika. Opcjonalnie można by sam rezystor z kolorami pojawiał się po wybraniu wszystkich kolorów, lub podłożenie obrazka, ale pierwszy pomysł był taki i stąd to pytanie.

0

wywołaj Invalidate() żeby oznaczyć narysowany obszar jako nieaktualny - obszar się odrysuje o ile jest widoczny. Ale możesz tę kreskę po prostu narysować w tamtym miejscu.
Nie pamiętam dobrze WinForms ale w WPF miałbyś łatwiej bo mógłbyś nakładać kształty i zmieniać po prostu ich kolor. Nie musiałbyś się w ogóle martwić o rysowanie. Zaryzykuję stwierdzenie że ten program w WPF dałoby się stworzyć w samym XAMLu bez żadnego kodu.

1

Odkładasz w strukturze danych wiedzę o rezystorze.
W oparciu o to w ortodoksyjnym OnPaint() malujesz CAŁY rezystor, żadnego dzielenia w myślach na etapy, na miarę ile informacji posiadasz (ile pasków kolorowych)
zapominasz, że jest jakaś zależność chronologiczna pomiędzy klikaniem a malowaniem, zdajesz to na system

W szczególności NIE WOŁASZ OnPaint() jak uzyskałeś trochę informacji o rezystorze, najwyżej Invalidate() j/w

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