2015-03-30 3 views
0

У меня есть контроль трекбара, который регулирует яркость цвета фона формы. В конце концов, я изменю его, чтобы настроить яркость изображения. Если вы посмотрите, как ползунок яркости работает в Microsoft colorDialog Control, при перемещении вверх и вниз значение изменяется от белого до черного, а в середине оттенок исходного цвета никогда не теряется. Первоначально я терял оттенок и просто делал корректировку оттенков серого, но я, наконец, нашел для этого работу.trackBar Brightness Control не прокручивает весь диапазон цветов от черного до белого

Моя текущая проблема заключается в том, что я не могу настроить весь диапазон цветов. Например, при выборе цвета R 192, G 128, B 255, я могу прокрутить весь путь до черного и полностью вернуться к исходному цвету, но я не могу прокручивать до белого. Я работаю над этим кодом несколько часов в день в течение 10 дней и получаю от черного до белого и теряю оттенок (который разрешен) или выдает текущую проблему: я могу прокручивать от lavendar до черного до lavendar , но не может прокручиваться до белого. Я глубоко признателен за помощь. Спасибо.

public partial class Form1 : Form 
{ 

    double xRed, xGreen, xBlue, xColor; 
    bool count = true; 

    private void Form1_BackColorChanged(object sender, EventArgs e) 
    { 
     //Do this once, when user sets a new BG color 
     if (count == true) 
     {      
      //Get a % of the color value instead of the absolute value, when using absolute value, if it goes down near 0, or up near 255, hue is lost. 
      xRed = (double) this.BackColor.R/255; 
      xGreen = (double) this.BackColor.G/255; 
      xBlue = (double) this.BackColor.B/255; 

      xColor = (((xRed + xGreen + xBlue) * 255)/3); 
      xColor = Math.Round(xColor, 0); 

      //Label is just so I can see RGB and trackBar values 
      lblBGColor.Enabled = true; 
      trackBar1.Enabled = true; 
      trackBar1.Value = (int)xColor; 
      label1.Text = Convert.ToString(trackBar1.Value); 
      count = false; 
     }  
    } 

    private void trackBar1_Scroll(object sender, EventArgs e) 
    { 
     double bgRed = 0, bgGreen = 0, bgBlue = 0; 
     //Once it goes down to black or up to white, restore the hue value as a percent. Percent of R (value/255), Percent of G (value/255), Percent of B (value/255). SO if red is 196 and 196 is 80% of 255, red is 80% of trackbar value, if green is 128 and 128 is 50% of 255, green is 50% of trackbar value, etc... 

     //I suspect the problem is here, with trackBar1.Value. I also tried adding the trackBar1.Value change since last scroll, but that didn't help. Also tried setting trackBar1.Value to 128, but no help. 
     bgRed = xRed * trackBar1.Value; 
     bgGreen = xGreen * trackBar1.Value; 
     bgBlue = xBlue * trackBar1.Value; 

     bgRed = Math.Round(bgRed, 0); 
     bgGreen = Math.Round(bgGreen, 0); 
     bgBlue = Math.Round(bgBlue, 0); 

     if (bgRed > 255) 
      bgRed = 255; 
     if (bgGreen > 255) 
      bgGreen = 255; 
     if (bgBlue > 255) 
      bgBlue = 255; 

     //Avoid unneeded looping through BackColorChanged event 
     count = false; 
     //Set form and label values 
     this.BackColor = Color.FromArgb(255, (int)bgRed, (int)bgGreen, (int)bgBlue); 
     label1.Text = Convert.ToString((int)bgRed + " " + (int)bgGreen + " " + (int)bgBlue + " trackBar: " + trackBar1.Value); 
} 

Это мой первый пост, я прочитал новое заявление о регистрации, не задавая повторяющихся вопросов. Я исследовал это и не видел этого вопроса, заданного здесь. Спасибо.

+0

сделать что: (двойной) (this.BackColor.R/256f); – TaW

+0

Это изменение не повлияло на мой код. Что у тебя было на уме? Спасибо – MaoTseTongue

+0

Вам нужно избегать ловушек целочисленного деления! (Вы включили f (float)? (Там могут быть другие места, чтобы следить за этим.) Любое значение байта <255 div на 255 равно 0, и сброс этого 0 в double слишком поздно! – TaW

ответ

0

В вашем коде переменным xRed, xGreen and xBlue присваивается значение, зависящее от значения rgb цвета фона формы. Например, если цвет фона формы имеет значение RGB (150, 170 и 180), тогда xRed будет равен 0,588, G будет 0,677, а B будет 0,705

Когда вы перемещаете свою дорожку до максимума (скажем, 255) то цвет фона вашей формы будет bgRed = xRed * trackBar1.value (150), bgGreen будет 170, а bgBlue будет 180, который является исходным цветом фона формы.

На мой взгляд, отображение исходного цвета при 100% яркости является правильным поведением. Если вы хотите, чтобы отобразить белый, как цвет фона на 100%, вы должны изменить свой код, чтобы что-то вроде ниже

private void trackBar1_Scroll(object sender, EventArgs e) 
    { 
     double bgRed = 0, bgGreen = 0, bgBlue = 0; 
     if(this.trackBar1.value==this.trackBar1.Maximum) 
     { 
      bgRed=255; 
      bgGreen=255; 
      bgBlue=255; 
     } 

     else{ 
      //Once it goes down to black or up to white, restore the hue value as a percent. Percent of R (value/255), Percent of G (value/255), Percent of B (value/255). SO if red is 196 and 196 is 80% of 255, red is 80% of trackbar value, if green is 128 and 128 is 50% of 255, green is 50% of trackbar value, etc... 
     //I suspect the problem is here, with trackBar1.Value. I also tried adding the trackBar1.Value change since last scroll, but that didn't help. Also tried setting trackBar1.Value to 128, but no help. 
     bgRed = xRed * trackBar1.Value; 
     bgGreen = xGreen * trackBar1.Value; 
     bgBlue = xBlue * trackBar1.Value; 

     bgRed = Math.Round(bgRed, 0); 
     bgGreen = Math.Round(bgGreen, 0); 
     bgBlue = Math.Round(bgBlue, 0); 

     if (bgRed > 255) 
      bgRed = 255; 
     if (bgGreen > 255) 
      bgGreen = 255; 
     if (bgBlue > 255) 
      bgBlue = 255; 
    } 
    //Avoid unneeded looping through BackColorChanged event 
    count = false; 
    //Set form and label values 
    this.BackColor = Color.FromArgb(255, (int)bgRed, (int)bgGreen, (int)bgBlue); 
    label1.Text = Convert.ToString((int)bgRed + " " + (int)bgGreen + " " + (int)bgBlue + " trackBar: " + trackBar1.Value); 
} 
+0

Я ценю ваши мысли, но это не совсем полное решение. Цвет прокручивается постепенно от lavendar до черного и постепенно возвращается к lavendar, а затем, когда он перемещается из trackBar1.Value 254 в trackBar1.Value 255, он внезапно и, безусловно, не постепенный или тонкий, переход на белый. Он постепенно переходит в черный, я хочу, чтобы он также постепенно переходил на белый. Спасибо – MaoTseTongue

+0

My s uggestion изменит ваш подход. Ваша текущая реализация делает исходный цвет фона текущим цветом фона формы, когда максимальное значение достигнуто в панели дорожек. Я скоро изменю свой код. – Kira

+0

Хорошо, спасибо. – MaoTseTongue