拾色器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了拾色器相关的知识,希望对你有一定的参考价值。

本来想用线程实现的,最终选用了定时器解决

 

 public partial class ColorForm : Form
    {
        private int _redValue = 255;
        private int _greenValue = 255;
        private int _blueValue = 255;

        public ColorForm()
        {
            InitializeComponent();
            InitPanelColor();
            panelColor.MouseDown += panelCololr_MouseDown;
            panelColor.MouseUp += panelColor_MouseUp;
        }

        //   private bool flag = false;

        public struct Pointapi
        {
            public uint X;
            public uint Y;
        }

        public class WinInfo
        {
            /// <summary>
            /// 返回包含了指定点的窗口的句柄
            /// </summary>
            /// <param name="x_point"></param>
            /// <param name="y_point"></param>
            /// <returns></returns>
            [DllImport("user32.dll")]
            public static extern uint WindowFromPoint(uint x_point, uint y_point);

            /// <summary>
            /// 获取鼠标指针当前位置
            /// </summary>
            /// <param name="p"></param>
            /// <returns></returns>
            [DllImport("user32.dll")]
            public static extern bool GetCursorPos(ref Pointapi p);

            /// <summary>
            /// 判断屏幕上一个指定点的客户区坐标
            /// </summary>
            /// <param name="hwnd">一个窗口的句柄,该窗口定义了要使用的客户区坐标系统</param>
            /// <param name="p"></param>
            /// <returns></returns>
            [DllImport("user32.dll")]
            public static extern uint ScreenToClient(uint hwnd, ref Pointapi p);


            /// <summary>
            /// 获取指定窗口的设备场景
            /// </summary>
            /// <param name="hwnd">将获取其设备场景的窗口的句柄。若为0,则要获取整个屏幕的DC</param>
            /// <returns></returns>
            [DllImport("user32.dll")]
            public static extern uint GetDC(uint hwnd);

            /// <summary>
            /// 在指定的设备场景中取得一个像素的RGB值
            /// </summary>
            /// <param name="hDC">一个设备场景的句柄</param>
            /// <param name="x"></param>
            /// <param name="y"></param>
            /// <returns></returns>
            [DllImport("gdi32.dll")]
            public static extern uint GetPixel(uint hDC, uint x, uint y);

            /// <summary>
            /// 释放由调用GetDC或GetWindowDC函数获取的指定设备场景。它对类或私有设备场景无效(但这样的调用不会造成损害)
            /// </summary>
            /// <param name="hwnd">要释放的设备场景相关的窗口句柄</param>
            /// <param name="hdc">要释放的设备场景句柄</param>
            /// <returns></returns>
            [DllImport("user32.dll")]
            public static extern uint ReleaseDC(uint hwnd, uint hdc);

            /// <summary>
            /// 获取整个窗口(包括边框、滚动条、标题栏、菜单等)的设备场景
            /// </summary>
            /// <param name="hwnd">将获取其设备场景的窗口</param>
            /// <returns></returns>
            [DllImport("user32.dll")]
            public static extern uint GetWindowDC(uint hwnd);

            /// <summary>
            /// 模拟一次鼠标事件
            /// </summary>
            /// <param name="dwFlags"></param>
            /// <param name="dx"></param>
            /// <param name="dy"></param>
            [DllImport("user32.dll")]
            public static extern void mouse_event(uint dwFlags, uint dx, uint dy);

            [DllImport("user32.dll")]
            public static extern void keybd_event(byte bVk, byte bScan, long dwFlags, long dwExtraInfo);

            /// <summary>
            /// 判断指定键盘状态
            /// </summary>
            /// <param name="nVirtKey"></param>
            /// <returns></returns>
            [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
            public static extern short GetKeyState(long nVirtKey);
        }

        /// <summary>
        /// 初始化色板颜色-白色
        /// </summary>
        private void InitPanelColor()
        {
            panelColor.BackColor = Color.FromArgb(Convert.ToInt32(txtRedValue.Text), Convert.ToInt32(txtGreenValue.Text),
                Convert.ToInt32(txtBlueValue.Text));
        }

        private void txtRedValue_TextChanged(object sender, EventArgs e)
        {
            _redValue = Convert.ToInt32(txtRedValue.Text == "" ? "0" : txtRedValue.Text);
            SetPanelColor();
        }

        private void txtGreenValue_TextChanged(object sender, EventArgs e)
        {
            _greenValue = Convert.ToInt32(txtGreenValue.Text == "" ? "0" : txtGreenValue.Text);
            SetPanelColor();
        }

        private void txtBlueValue_TextChanged(object sender, EventArgs e)
        {
            _blueValue = Convert.ToInt32(txtBlueValue.Text == "" ? "0" : txtBlueValue.Text);
            SetPanelColor();
        }

        /// <summary>
        /// 设置面板颜色
        /// </summary>
        private void SetPanelColor()
        {
            panelColor.BackColor = Color.FromArgb(LimitNum(_redValue), LimitNum(_greenValue), LimitNum(_blueValue));
        }

        private int LimitNum(int num)
        {
            if (num > 255)
            {
                return 255;
            }
            else if (num < 0)
            {
                return 0;
            }
            else
            {
                return num;
            }
        }


        /// <summary>
        /// 按ESC开始停止取色
        /// </summary>
        private void GetColor()
        {
            this.Cursor = Cursors.Cross;
            uint vDc = WinInfo.GetDC(0); //取到设备场景(0就是全屏的设备场景)  
            Pointapi papi = new Pointapi();
            WinInfo.GetCursorPos(ref papi);
            uint vColor = WinInfo.GetPixel(vDc, papi.X, papi.Y);
            uint vRed = vColor & 0xff;
            uint vGreen = (vColor & 0xff00)/256;
            uint vBlue = (vColor & 0xff0000)/65536;
            panelColor.BackColor = Color.FromArgb((int) vRed, (int) vGreen, (int) vBlue);
        }

        private void txtRedValue_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar != 8 && !char.IsDigit(e.KeyChar))
            {
                e.Handled = true;
            }
        }

        private void txtGreenValue_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar != 8 && !char.IsDigit(e.KeyChar))
            {
                e.Handled = true;
            }
        }

        private void txtBlueValue_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar != 8 && !char.IsDigit(e.KeyChar))
            {
                e.Handled = true;
            }
        }

        private void 关于ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("winform版取色器\r\r版本1.0.0\r\r作者 Kevin", "关于", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
        }

        private void 介绍ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("在颜色表里面按ESC开取色,要结束再按一次ESC\r\r交流QQ334081981", "介绍", MessageBoxButtons.OK,
                MessageBoxIcon.Asterisk);
        }

        private Timer timer = new Timer();

        private void panelCololr_MouseDown(object sender, EventArgs e)
        {
            this.Cursor = Cursors.Hand;
            timer.Interval = 1;
            timer.Tick += delegate { GetColor(); };
            timer.Start();
        }

        private void panelColor_MouseUp(object sender, MouseEventArgs e)
        {
            timer.Stop();
            this.Cursor = Cursors.Default;
        }
    }

  

以上是关于拾色器的主要内容,如果未能解决你的问题,请参考以下文章

php 拾色器代码-Astra

php 拾色器代码-GeneratePress

拾色器

Shader+UGUI仿制Unity拾色器

Android Studio中如何设置颜色拾色器工具

优动漫PAINT基础系列之拾色器教学