注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Hao的博客

I'm on my way……

 
 
 

日志

 
 
 
 

C# ColorRecognition小工具实现【上】  

2010-12-27 17:29:55|  分类: 小试牛刀 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

      我一直认为自己缺乏美术细胞(早知道小学的时候好好学美术了C ColorRecognition小工具实现【上】 - chhaj5236 - Hao的博客),在做网页或是应用程序时,经常为如何配色而绞尽脑汁。这时候我通常会参考别人的配色方案,但是有些时候参考对象所用的颜色真的很难找到,通常只能从颜色板中找到大致一样的颜色。这个过程通常很痛苦,也很浪费时间。而ColorRecognition小工具的实现就是为了能够识别显示器上某一点的颜色值,方便我们快速地选用准确的颜色。

      在C#中好像没有一个方法实现了获取显示器上某点坐标的颜色值。但是在gdi32.dll中有一个函数GetPixel,该函数用于获取指定设备和坐标下像素的RGB颜色值。函数原型如下:
      COLORREF GetPixel(HDC hdc, int nXPos, int nYPos);

      显然还要使用GetDC获取设备环境句柄,使用ReleaseDC释放设备环境句柄,这两个函数在user32.dll中,原型如下:
      HDC GetDC(HWND hWnd);
      int ReleaseDC(HWND hWnd, HDC hdc);

      现在思路就清晰了,首先通过GetDC获取整个屏幕的设备环境句柄,然后将鼠标所在位置的坐标传递给GetPixel函数,获得对应位置的颜色值。实现代码如下:

      public class Screen
      {
          [DllImport("user32.dll")]
          private static extern IntPtr GetDC(IntPtr hWnd);
          [DllImport("user32.dll")]
          private static extern int ReleaseDC(IntPtr hWnd, IntPtr hdc);
          //Return 0x00bbggrr
          [DllImport("gdi32.dll")]
          private static extern uint GetPixel(IntPtr hdc, int nXPos, int nYPos); 


          // 获取屏幕上(x,y)坐标的颜色

          public static Color GetColor(int x, int y){
              IntPtr hdc = GetDC(IntPtr.Zero);     //获得整个屏幕的DC
              uint pixel = GetPixel(hdc, x, y);
              ReleaseDC(IntPtr.Zero, hdc);
              Color color = Color.FromArgb((int)(pixel & 0xff), (int)((pixel & 0xff00) >> 8),
                  (int)((pixel & 0xff0000) >> 16));
              return color;
          }
      }

      下图为一个测试用的窗口,上面是PictureBox,下面是两个TextBox。两个TextBox分别用于显示鼠标所在屏幕位置的颜色值和颜色。

C ColorRecognition小工具实现【上】 - chhaj5236 - Hao的博客
 
        Form1的MouseMove事件实现代码如下:
        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            Point pt = Control.MousePosition;    //得到鼠标的坐标
            Color color = /*CustomDLL.System.*/Screen.GetColor(pt.X, pt.Y);  
            colorTextBox.Text = color.ToArgb().ToString("X");   //以16进制输出
            sampleTextBox.BackColor = color;
        }
        然而鼠标在PictureBox上划过时,并没有获取到颜色值。因为鼠标移动的消息首先会被Form1上的控件所捕获并处理,解决方法就是在PictureBox的MouseMove事件的实现代码中将鼠标移动消息交由Form1来处理:
        private void pictureBox_MouseMove(object sender, MouseEventArgs e)
        {
            Form1_MouseMove(sender, e);
        }
        
        但是当鼠标移到其他控件上或是移动到窗口外面时,又无法获得相应的颜色值了,这和最终设计目标还有些差距。为了捕获到鼠标在屏幕上的移动,就应捕获并处理系统的WM_MOUSEMOVE消息,而不是单纯地处理窗体或是控件上的鼠标移动消息。下一篇文章将解决这个问题。
 

  评论这张
 
阅读(555)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017