Заполнение поля изображения некоторыми процентами

Я очень новичок в C-программировании. У меня такой дизайн, как показано ниже.

Моя концепция заключается в том, что я должен установить некоторый том в текстовом поле «Перенос тома» (например, 100), а затем нажать кнопку «установить». Он автоматически устанавливает масштаб окна изображения, он работает нормально.

Теперь я хочу заполнить окно с цветами, когда я нажму кнопку «Восстановить». Процент цвета, который должен быть заполнен в окне изображения, должен быть числом в TextBox, относящимся к цвету или жидкости.

например если я установил GasPhase = 5; Углеводородная жидкость = 5; Вода = 5; Нефтяная грязь = 5; Буровой раствор на водной основе = 5; Не определено = 75.

то изображение должно заполнить 75% цветом «Не идентифицировано» и цветом GasPhase с 5% e.t.c.

У меня есть написанный код, как показано ниже.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;


  namespace test
  {
    public partial class Form1 : Form
    {
    public Form1()
    {
        InitializeComponent();
    }

    private void txtTransferVolume_TextChanged(object sender, EventArgs e)
    {

    }

    private void txtTransferSet_Click(object sender, EventArgs e)
    {
        string value = txtTransferVolume.Text;
        double midvalue = Convert.ToDouble(value);
        lblTransferBottleMax.Text = value;
        lblTransferBottleMid.Text = (midvalue/2).ToString();

    }

    private void chkTransferManual_CheckedChanged(object sender, EventArgs e)
    {


    }

    private void btnTransferBottleRegenerate_Click(object sender, EventArgs e)
    {

    }

   }
 }

Пожалуйста, помогите мне, как заполнить, как я хочу.

1
nl ja de

1 ответы

Этого можно добиться довольно легко, непосредственно используя управление файловыми камерами или создавая растровое изображение в памяти и отображаемое в кадре.

Пример:

private void DrawPercentages(int[] percentages, Color[] colorsToUse)
{
  //Create a Graphics object to draw on the picturebox
   Graphics G = pictureBox1.CreateGraphics();

  //Calculate the number of pixels per 1 percent
   float pixelsPerPercent = pictureBox1.Height/100f;

  //Keep track of the height at which to start drawing (starting from the bottom going up)
   int drawHeight = pictureBox1.Height;

  //Loop through all percentages and draw a rectangle for each
   for (int i = 0; i < percentages.Length; i++)
   {
      //Create a brush with the current color
       SolidBrush brush = new SolidBrush(colorsToUse[i]);
      //Update the height at which the next rectangle is drawn.
       drawHeight -= (int)(pixelsPerPercent * percentages[i]);
      //Draw a filled rectangle
       G.FillRectangle(brush, 0, drawHeight, pictureBox1.Width, pixelsPerPercent * percentages[i]);
    }    
}

Конечно, вы должны проверить, что оба массива имеют одинаковую длину и т. Д. Я просто хочу дать вам основную идею о том, как это сделать.

Вот понятие о том, как получить ваши данные в массивах и передать их функции. Поскольку вы используете другое текстовое поле для каждого значения, его сложно перебирать, поэтому сейчас я показываю вам, как это сделать, используя 6 значений, которые у вас есть сейчас.

private void btnTransferBottleRegenerate_Click(object sender, EventArgs e)
{
  int[] percentages = new int[6];
  percentages[0] = int.Parse(txtTransferNotIdentified.Text);
  percentages[1] = int.Parse(txtTransferWater.Text);
 //And so on for every textbox

  Color[] colors = new Color[6];
  colors[0] = Color.Red;
  colors[1] = Color.Yellow;
 //And so on for every color

 //Finally, call the method in my example above
  DrawPercentages(percentages, colors);
} 

Если ваши проценты не всегда равны 100, вы можете использовать третий параметр, который задает сумму и меняет значение 100f на это значение в методе DrawPercentages .

1
добавлено
Я просто представляю вам концепцию рисования на примере. Не стесняйтесь интерпретировать его, как вам нравится, но я не понимаю, как собирать данные и передавать их, поскольку массивы могут быть объективными. Вы можете также нарисовать каждый прямоугольник на своей собственной линии с помощью объекта Graphics, но мне всегда нравится сохранять его масштабируемым. Любые будущие добавления данных не будут проблемой для моего метода, когда для записи строки для каждого элемента в данных может потребоваться дополнительный код.
добавлено автор John Willemse, источник
См. Мой первоначальный ответ; Я отредактировал его.
добавлено автор John Willemse, источник
Да, вы правы, я тоже думаю, как собирать данные оттуда (текстовые поля и метки) и передавать их через массивы.
добавлено автор PRV, источник
Вы не знаете, как передать эти введенные значения в массив процентов.
добавлено автор PRV, источник
Большое спасибо за ваш ответ, его работа прекрасна. Но в вашем ответе требуется небольшое изменение, чтобы изменить имя массива на цвета.
добавлено автор PRV, источник
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot