Картина вне события PaintC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Картина вне события Paint

Сообщение Anonymous »

Я относительно новичок в C# и Winform. Я пытаюсь поиграть, нарисовав на панели заданное количество прямоугольников разной высоты с учетом значения, введенного пользователем через трекбар. Я могу успешно рисовать прямоугольники, однако мне также нужна возможность рисовать другие объекты на панели без использования события рисования.
public partial class UCQuickSort : UserControl
{
private DisplayRectangles displayRecs;
private int numRectangles;
private bool shouldDraw;

public UCQuickSort()
{
InitializeComponent();
//this.Resize += Redraw_Resize;

displayRecs = new DisplayRectangles(qsGraphPanel);

this.numRectangles = 0;
this.shouldDraw = false;

}

//private void Redraw_Resize(object sender, EventArgs e) {
// Invalidate();
//}

private void UCQuickSort_Load(object sender, EventArgs e)
{
//qsGraphPanel.BackColor = Color.FromArgb(235, 0, 0, 0);
}

private void setNumberOfRectangles() {
int trackBarValue = sizeInput.Value;

switch (trackBarValue)
{
case 0:
numRectangles = 10;
break;

case 1:
numRectangles = 50;
break;

case 2:
numRectangles = 100;
break;

case 3:
numRectangles = 250;
break;

case 4:
numRectangles = 500;
break;

case 5:
numRectangles = 1000;
break;
}

displayRecs.NumRectangles = numRectangles;
}

private void qsGraphPanel_Paint(object sender, PaintEventArgs e) {
Graphics graphics = qsGraphPanel.CreateGraphics();
displayRecs.Graphics = graphics;

if (shouldDraw) displayRecs.generateRectangles();
shouldDraw = true;
}

private void sizeInput_ValueChanged(object sender, EventArgs e)
{
setNumberOfRectangles();

// Display rectangles
displayRecs.populateRectangles();
qsGraphPanel.Invalidate(true);
}

private void testBtn_Click(object sender, EventArgs e)
{
displayRecs.test();
}
}

public class DisplayRectangles : Form
{
private int[] rectangleHeights;
private int numRectangles;
private Panel panel; // Current panel to paint on
private Random rnd;

private Graphics graphics;

public DisplayRectangles(Panel panel) {

this.panel = panel;
this.graphics = this.panel.CreateGraphics();
this.numRectangles = 10;
this.rnd = new Random();

}

// Getter, Setter function for numRectangles
public int NumRectangles {
get { return numRectangles; }
set {
numRectangles = value;
rectangleHeights = new int[numRectangles];
}

}

public Graphics Graphics {
set {
graphics = value;
}
}

// Populate Rectangles arr with random height values
public void populateRectangles() {
Console.WriteLine("Panel height: " + panel.Height);
for (int i = 0; i < numRectangles; i++) {
rectangleHeights = rnd.Next(0, panel.Height);
}

}

// Display all rectangles on panel
public void generateRectangles() {
Brush fillBrush = Brushes.White;

int width = this.panel.Width/numRectangles; // Width is proportional to numRectangles and panel width

for (int i = 0; i < numRectangles; i++) {
int xPos = i * width;
int yPos = this.panel.Height - rectangleHeights;
int height = rectangleHeights;

//g.FillRectangle(fillBrush, new Rectangle(xPos, yPos, width, height));
graphics.FillRectangle(fillBrush, new Rectangle(xPos, yPos, width, height));
}

}

public void test()
{
Brush myBrush = Brushes.Red;
graphics.FillRectangle(myBrush, new Rectangle(0, 0, 100, 100));
}

}

Я попытался сохранить экземпляр объекта Graphics в своем классе отображения, но нужный мне дополнительный объект не рисуется при нажатии кнопки проверки. Есть какие-нибудь подсказки, как мне это сделать, не проходя через событие рисования?
private void qsGraphPanel_Paint(object sender, PaintEventArgs e) {
Graphics graphics = qsGraphPanel.CreateGraphics();
displayRecs.Graphics = graphics;

if (shouldDraw) displayRecs.generateRectangles();
shouldDraw = true;
}

public void test()
{
Brush myBrush = Brushes.Red;
graphics.FillRectangle(myBrush, new Rectangle(0, 0, 100, 100));
}


Подробнее здесь: https://stackoverflow.com/questions/790 ... aint-event
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Почему простой тестовый шифр не работает в php8 на Manjaro Linux 24? Картина:
    Anonymous » » в форуме Php
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Почему простой тестовый шифр не работает в php8 на Manjaro Linux 24? Картина:
    Anonymous » » в форуме Php
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Нужна большая картина, когда использовать интерфейс в качестве возврата типа в C#
    Anonymous » » в форуме C#
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Повторяющая картина режима на Java
    Anonymous » » в форуме JAVA
    0 Ответы
    1 Просмотры
    Последнее сообщение Anonymous
  • Как использовать Graphics.DrawImage в событии Paint, но в форме круга?
    Гость » » в форуме C#
    0 Ответы
    24 Просмотры
    Последнее сообщение Гость

Вернуться в «C#»