之前做过一个项目,在VS用C#写一个软件平台,平台中调用NI公司的绘图控件cwgraph绘图(简称graph)。由于graph里面虽然可以更改绘制的线的颜色,但是不具有实时性,只能在运行平台中之间就设置好。为了实现在C#平台中可以实时的更改graph控件里面的绘制的线的颜色,我读取了graph里面的线条的linestyle属性。这是一个uint型的数字。
我们知道VS中对COLOR的定义是采用ARGB的方式,以int型数字来表示。 Alpha 是透明度,范围: 0——255,位于int的高8位; RED 是红,范围: 0——255,位于int的8-16位; Green 是绿,范围: 0——255,位于int的16-24位; Blue 是透明度,范围: 0——255,位于int的低8位。
graph中的颜色定义则不大一样,它采用COLORREF的定义,以uint型数字表示。它的顺序是BGR,是反过来的。就是说Blue 是红,范围: 0——255,位于int的8-16位; Green 是绿,范围: 0——255,位于int的16-24位; RED 是透明度,范围: 0——255,位于int的低8位。
知道这些之后,就可以方便的实现从graph中的linestyle读出颜色,然后找出VS中对应的颜色。为了实现用户可以实时的自定义颜色,我先将graphic供用户选择的颜色都读出来了转化为VS中的颜色,记住这些颜色供用户选择。然后用户选择之后就对linestyle进行更改就好了。
下面说说我处理COLOR跟COLOREF的方法:
colorref ---->color
uint refcolor = 255 << 16 | 128 << 8 | 0; //定义一种linestyle
uint blue = refcolor >> 16 & 255;
uint green = refcolor >>8 & 255;
uint red =refcolor & 255;
int colorARGB = 255 << 24 | (int)red <<16 | (int)green << 8 | (int)blue; //Alpha这个参数是透明度,它越大颜色就越深,它只影响颜色深度,这里就选了最大
Color ARGB = Color.FromArgb(colorARGB) ; //得到结果
color---->colorref
Color ARGB ; //给定的
int colorInt = ARGB.toArgb();
int red = colorInt >> 16 & 255;
int green = colorInt >> 8 & 255;
int blue = colorInt & 255;
uint refcolor = (uint)blue << 16 | (uint)green << 8 | (uint)red;