{S0}
简介
我试图使一个玻璃上的文本框工作,这是失败的惨败。然后,我有这个想法,使一个很好的玻璃状文本框扭转BackColor和forecolors,但它也有一个问题。如果设置为白色或非常明亮的色彩主题,是一个非常明亮或白色的形式,那么文本将不可读。我想到的解决方案?检测玻璃颜色,并使用不同的前景色,如果他们使用一个非常明亮的配色方案。好了,很长一段时间后,我结束了这段代码,这实际上不适合我的文本框问题。原来,设置前景色什么,但白色使得它再次清晰地绘制。光明的一面?我做了一些,我发现没有其他VB.NET或C#代码样本。这篇文章将告诉你如何使用代码。您需要什么Windows Vista家庭高级版,商业,企业,或Ultimate的Visual Studio 2005/2008(2003年可能会工作)
DWM的转身,Windows如何工作的体面知识(事件驱动)消息的基本理解一台电脑:P使用代码
首先使用的代码,你需要做的的就是声明常量举行的"友好名称"的事件,以确定何时改变颜色。Private Const WM_DWMCOLORIZATIONCOLORCHANGED As Integer = 800
接下来,我们需要处理的WndProc。处理WndProc的基本手段,我们将"听"为Windows消息传递到消息流。{C}
现在,我们需要"听"的颜色变化:If msg.Msg = WM_DWMCOLORIZATIONCOLORCHANGED Then
'Color was Changed!
End If
现在,我们知道用户改变了上色的颜色,我们应该得到的颜色,并使其可用的颜色,右?Dim aarrggbb = _
My.Computer.Registry.GetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM", _
"ColorizationColor", "00000000")
Dim argb = Convert.ToInt32(CLng(aarrggbb.ToString), 10)
Dim argbcol = System.Drawing.Color.FromArgb(argb)
好了,这是一些有趣的代码,权利?基本上,它的所作所为是:获取当前的着色颜色从二进制到十进制的转换(即使它是六角)一种颜色做出来的着色颜色的十进制副本
现在,我们可以使用的颜色。在示例项目中,我使用的颜色,做到以下几点:PictureBox2.BackColor = System.Drawing.Color.FromArgb(argb)
Label1.Text = System.Drawing.Color.FromArgb(argb).ToString
Label1.ForeColor = System.Drawing.Color.FromArgb(argb)
Button1.Text = argbcol.ToString
Button1.ForeColor = argbcol
,如果你不希望向上滚动,这里是再次运行的项目:
{S2}
您可以使用自己的应用程序也argbcol,它将代表DWM的颜色。
一个额外的一块信息的WinForms为同样的原因,文本框玻璃上不工作,不处理argbcol的alpha,当超过一个以上的颜色是一次使用正确。它将使用它的颜色过来,这是尽可能清晰的玻璃设置为什么不给上形成的白色透明的表单的BackColor:
这使得这个代替。完整的代码清单:Private Const WM_DWMCOLORIZATIONCOLORCHANGED As Integer = 800
Protected Overloads Overrides Sub WndProc(ByRef msg As Message)
If msg.Msg = WM_DWMCOLORIZATIONCOLORCHANGED Then
'Color was Changed!
Dim aarrggbb = _
My.Computer.Registry.GetValue("HKEY_CURRENT_USER\" & _
"Software\Microsoft\Windows\DWM", _
"ColorizationColor", "00000000")
Dim argb = Convert.ToInt32(CLng(aarrggbb.ToString), 10)
Dim argbcol = System.Drawing.Color.FromArgb(argb)
PictureBox2.BackColor = System.Drawing.Color.FromArgb(argb)
Label1.Text = System.Drawing.Color.FromArgb(argb).ToString
Label1.ForeColor = System.Drawing.Color.FromArgb(argb)
Button1.Text = argbcol.ToString
Button1.ForeColor = argbcol
End If
MyBase.WndProc(msg)
End Sub