GETCHAR FORMAT消息从Color转换为int

时间:2012-07-26 16:41:56

标签: c# winforms

我想将object Color转换为Int,以便将他加入crTextColor成员,因此我使用方法myColor.ToArgb(),但颜色会发生变化,并显示不同的颜色。

为什么会这样?

这是代码:

      CHARFORMAT2 fmt = new CHARFORMAT2();
      fmt.cbSize = Marshal.SizeOf(fmt);
      // check if the text contains CFE_AUTOCOLOR effect
      SendMessage(new HandleRef(this, Handle), EM_GETCHARFORMAT, SCF_SELECTION, ref fmt);
      if ((fmt.dwEffects & CFE_AUTOCOLOR) == CFE_AUTOCOLOR)
      {
          fmt.dwEffects -= CFE_AUTOCOLOR;
      }
      fmt.dwMask = CFM_COLOR;
      Color c = Color.Red;
      fmt.crTextColor =  c.ToArgb();
      SendMessage(new HandleRef(this, Handle), EM_SETCHARFORMAT, SCF_SELECTION, ref fmt);

3 个答案:

答案 0 :(得分:0)

这很好用。你在做些不同的事吗?

int crTextColor;

public Form1()
{
    InitializeComponent();
    BackColor = Color.Aqua;
    crTextColor = BackColor.ToArgb();//To number
    Text = crTextColor.ToString();
}

private void button1_Click(object sender, EventArgs e)
{
    BackColor = Color.FromArgb(crTextColor);//From number
}

编辑:(看到你的编辑后)

行。所以你让我在那里,我真的不知道这些东西。但是:

如果您转到CHARFORMAT2此处http://msdn.microsoft.com/en-us/library/windows/desktop/bb787883%28v=vs.85%29.aspx的MSDN页面并在其中搜索crTextColor,您会找到(作为第五种情况)对其的解释。它说它的类型是:COLORREF。如果您点击该链接,则表示它是RGB。点击RGB链接,转到此处http://msdn.microsoft.com/en-us/library/windows/desktop/dd162937%28v=vs.85%29.aspx,其中显示:

 C++

COLORREF RGB(
  BYTE byRed,
  BYTE byGreen,
  BYTE byBlue
);

另一方面 - 如果你到这里http://msdn.microsoft.com/en-us/library/system.drawing.color.toargb.aspx,你会看到(在“备注中”)Color.ToArgbARGB

  

“由AA表示的最重要字节(MSB)是alpha   组件价值。“

所以或许这就是问题所在。但是,再一次,我真的不知道这些东西!我只是做了一些搜索。

答案 1 :(得分:0)

看看这是否适合你

int myColorVal = myColor.ToArgb();
someobject.crTextColor = Color.FromArgb( myColorVal );

答案 2 :(得分:0)

我已经使用二进制和移位运算符完成了此操作。

            Int32 key = color.R << 16 | color.G << 8 | color.B;