2014-05-10 116 views
1

让我先解释一下我正在尝试做什么。 我想创建一个颜色选择器控件,如右侧的其中一个:http://demos.telerik.com/silverlight/Themesgenerator/ 但是我想自己创建一个用于学习的控件。在点上获取画布颜色

目前我已经在xaml中做了某种布局,并且我使用了带有LinearGradientBrush背景的Canvas。现在,我试图决定哪个颜色是在特定点上时卡住了。有没有什么好的方法来找到这个?..我想点击我的画布并获得该特定点的ARGB。任何帮助,将不胜感激。

回答

2

我找到了解决方案!这里如果有人需要它!

[DllImport("gdi32")] 
private static extern int GetPixel(int hdc, int nXPos, int nYPos); 

[DllImport("user32")] 
private static extern int GetWindowDC(int hwnd); 

[DllImport("user32")] 
private static extern int ReleaseDC(int hWnd, int hDC); 

private static SolidColorBrush GetPixelColor(Point point) 
{ 
    int lDC = GetWindowDC(0); 
    int intColor = GetPixel(lDC, (int)point.X, (int)point.Y); 

    // Release the DC after getting the Color. 
    ReleaseDC(0, lDC); 

    byte a = (byte)((intColor >> 0x18) & 0xffL); 
    byte b = (byte)((intColor >> 0x10) & 0xffL); 
    byte g = (byte)((intColor >> 8) & 0xffL); 
    byte r = (byte)(intColor & 0xffL); 
    Color color = Color.FromRgb(r, g, b); 
    return new SolidColorBrush(color); 
} 

而且我把这种方法是这样的:

SolidColorBrush solidcolor = GetPixelColor(RightColorPanel.PointToScreen(point)); 

Color color = Color.FromArgb(solidcolor.Color.A, 
          solidcolor.Color.R, 
          solidcolor.Color.G, 
          solidcolor.Color.B); 

LinearGradientBrush brush = new LinearGradientBrush(); 
brush.StartPoint = new Point(0, 0); 
brush.EndPoint = new Point(1, 0); 
brush.GradientStops.Add(new GradientStop(Colors.White, 0.0)); 
brush.GradientStops.Add(new GradientStop(color, 1)); 

MainColorPanel.Background = brush; 

point是我RightColorPanel,我让我的颜色在具体点! 这个作品真的很棒!