示例#1
0
    private void CalcCoordsAndUpdate(ColorHandler.HSV HSV)
    {
        // Convert color to real-world coordinates and then calculate
        // the various points. HSV.Hue represents the degrees (0 to 360),
        // HSV.Saturation represents the radius.
        // This procedure doesn't draw anything--it simply
        // updates class-level variables. The UpdateDisplay
        // procedure uses these values to update the screen.

        // Given the angle (HSV.Hue), and distance from
        // the center (HSV.Saturation), and the center,
        // calculate the point corresponding to
        // the selected color, on the color wheel.
        colorPoint = GetPoint((double)HSV.Hue / 255 * 360,
                              (double)HSV.Saturation / 255 * radius,
                              centerPoint);

        // Given the brightness (HSV.value), calculate the
        // point corresponding to the brightness indicator.
        brightnessPoint = CalcBrightnessPoint(HSV.value);

        // Store information about the selected color.
        brightness    = HSV.value;
        selectedColor = ColorHandler.HSVtoColor(HSV);
        RGB           = ColorHandler.HSVtoRGB(HSV);

        // The full color is the same as HSV, except that the
        // brightness is set to full (255). This is the top-most
        // color in the brightness gradient.
        fullColor = ColorHandler.HSVtoColor(HSV.Hue, HSV.Saturation, 255);
    }
示例#2
0
 private void HandleHSVScroll(object sender, EventArgs e)
 // If the H, S, or V values change, use this
 // code to update the RGB values and invalidate
 // the color wheel (so it updates the pointers).
 // Check the isInUpdate flag to avoid recursive events
 // when you update the NumericUpdownControls.
 {
     changeType = ChangeStyle.HSV;
     hsv        = new ColorHandler.HSV(tbAlpha.Value, tbHue.Value, tbSaturation.Value, tbValue.Value);
     SetRGB(ColorHandler.HSVtoRGB(hsv));
     SetHSVLabels(hsv);
     Invalidate();
 }
示例#3
0
 private void HandleHSVChange(object sender, EventArgs e)
 {
     // If the H, S, or V values change, use this
     // code to update the RGB values and invalidate
     // the color wheel (so it updates the pointers).
     // Check the isInUpdate flag to avoid recursive events
     // when you update the NumericUpdownControls.
     if (!isInUpdate)
     {
         changeType = ChangeStyle.HSV;
         HSV        = new ColorHandler.HSV((int)(nudHue.Value), (int)(nudSaturation.Value), (int)(nudBrightness.Value));
         SetRGB(ColorHandler.HSVtoRGB(HSV));
         this.Invalidate();
     }
 }
示例#4
0
        /// <summary>
        /// The update box.
        /// </summary>
        public void updateBox()
        {
            colorBox.BackColor = ColorHandler.HSVtoColor(hsvColor);
            ColorHandler.RGB tempRGB = ColorHandler.HSVtoRGB(hsvColor);
            updatingColors = true;
            if (alphaText != null)
            {
                alphaText.Text = (this.color.Alpha / 255f).ToString();
            }

            redText.Text   = (this.color.Red / 255f).ToString();
            greenText.Text = (this.color.Green / 255f).ToString();
            blueText.Text  = (this.color.Blue / 255f).ToString();
            updatingColors = false;
        }
示例#5
0
        private void GrabColor(object sender, Point mouseXY)
        {
            int cntlNum = this.Controls.IndexOf((Control)sender);
            int cx      = mouseXY.X;
            int cy      = mouseXY.Y;

            switch (cntlNum)
            {
            case 0:
                // center our coordinate system so the middle is (0,0), and positive Y is facing up
                cx -= (this.Controls[cntlNum].Width / 2);
                cy -= (this.Controls[cntlNum].Height / 2);
                if (cx < this.Controls[cntlNum].Width / 2)
                {
                    double theta = Math.Atan2(cy, cx);

                    if (theta < 0)
                    {
                        theta += 2 * Math.PI;
                    }

                    double alpha = Math.Sqrt((cx * cx) + (cy * cy));

                    int h = (int)((theta / (Math.PI * 2)) * 360.0);
                    int s = (int)Math.Min(100.0, (alpha / (double)(this.Controls[0].Width / 2)) * 100);
                    int v = hsvColor.value;

                    hsvColor = new ColorHandler.HSV(h, s, v);

                    OnColorChanged();
                    updateBar();
                }
                break;

            case 1:
                if (cx < this.Controls[cntlNum].Width)
                {
                    hsvColor.value = Math.Max(0, Math.Min(100, 100 - (cy * 100 / this.Controls[cntlNum].Height)));
                    updateBox();
                }
                break;
            }
            this.color = ColorHandler.HSVtoRGB(hsvColor);
            Invalidate(true);
        }
示例#6
0
    public void Draw(Graphics g, Point mousePoint)
    {
        // You've moved the mouse.
        // Now update the screen to match.

        double distance;
        int    degrees;
        Point  delta;
        Point  newColorPoint;
        Point  newBrightnessPoint;
        Point  newPoint;

        // Keep track of the previous color pointer point,
        // so you can put the mouse there in case the
        // user has clicked outside the circle.
        newColorPoint      = colorPoint;
        newBrightnessPoint = brightnessPoint;

        // Store this away for later use.
        this.g = g;

        if (currentState == MouseState.MouseUp)
        {
            if (!mousePoint.IsEmpty)
            {
                if (colorRegion.IsVisible(mousePoint))
                {
                    // Is the mouse point within the color circle?
                    // If so, you just clicked on the color wheel.
                    currentState = MouseState.ClickOnColor;
                }
                else if (brightnessRegion.IsVisible(mousePoint))
                {
                    // Is the mouse point within the brightness area?
                    // You clicked on the brightness area.
                    currentState = MouseState.ClickOnBrightness;
                }
                else
                {
                    // Clicked outside the color and the brightness
                    // regions. In that case, just put the
                    // pointers back where they were.
                    currentState = MouseState.ClickOutsideRegion;
                }
            }
        }

        switch (currentState)
        {
        case MouseState.ClickOnBrightness:
        case MouseState.DragInBrightness:
            // Calculate new color information
            // based on the brightness, which may have changed.
            newPoint = mousePoint;
            if (newPoint.Y < brightnessMin)
            {
                newPoint.Y = brightnessMin;
            }
            else if (newPoint.Y > brightnessMax)
            {
                newPoint.Y = brightnessMax;
            }
            newBrightnessPoint = new Point(brightnessX, newPoint.Y);
            brightness         = (int)((brightnessMax - newPoint.Y) * brightnessScaling);
            HSV.value          = brightness;
            RGB = ColorHandler.HSVtoRGB(HSV);
            break;

        case MouseState.ClickOnColor:
        case MouseState.DragInColor:
            // Calculate new color information
            // based on selected color, which may have changed.
            newColorPoint = mousePoint;

            // Calculate x and y distance from the center,
            // and then calculate the angle corresponding to the
            // new location.
            delta = new Point(
                mousePoint.X - centerPoint.X, mousePoint.Y - centerPoint.Y);
            degrees = CalcDegrees(delta);

            // Calculate distance from the center to the new point
            // as a fraction of the radius. Use your old friend,
            // the Pythagorean theorem, to calculate this value.
            distance = Math.Sqrt(delta.X * delta.X + delta.Y * delta.Y) / radius;

            if (currentState == MouseState.DragInColor)
            {
                if (distance > 1)
                {
                    // Mouse is down, and outside the circle, but you
                    // were previously dragging in the color circle.
                    // What to do?
                    // In that case, move the point to the edge of the
                    // circle at the correct angle.
                    distance      = 1;
                    newColorPoint = GetPoint(degrees, radius, centerPoint);
                }
            }
            if (distance > 1)
            {
                distance = 1;
            }
            // Calculate the new HSV and RGB values.
            HSV.Hue        = (int)(degrees * 255 / 360);
            HSV.Saturation = (int)(distance * 255);
            HSV.value      = brightness;
            RGB            = ColorHandler.HSVtoRGB(HSV);
            fullColor      = ColorHandler.HSVtoColor(HSV.Hue, HSV.Saturation, 255);
            break;
        }
        selectedColor = ColorHandler.HSVtoColor(HSV);

        // Raise an event back to the parent form,
        // so the form can update any UI it's using
        // to display selected color values.
        OnColorChanged(RGB, HSV);

        // On the way out, set the new state.
        switch (currentState)
        {
        case MouseState.ClickOnBrightness:
            currentState = MouseState.DragInBrightness;
            break;

        case MouseState.ClickOnColor:
            currentState = MouseState.DragInColor;
            break;

        case MouseState.ClickOutsideRegion:
            currentState = MouseState.DragOutsideRegion;
            break;
        }

        // Store away the current points for next time.
        colorPoint      = newColorPoint;
        brightnessPoint = newBrightnessPoint;

        // Draw the gradients and points.
        UpdateDisplay();
    }