返回首页


{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

回答

评论会员:PacMani 时间:2011/12/16
您好Omnicoder,
首先,失控,DWM的颜色键在注册表的帮助表示感谢。你知不知道是否有可能收到一条消息,当用户改变颜色,之前他点击"确定"
评论会员:?Omnicoder 时间:2011/12/16
唯一我能想到的是拦截任何消息的颜色变化"发送到改变颜色。

您是否尝试过氪工具包? http://www.componentfactory.com/free-windows-forms-controls.php
评论会员:TommyB8 时间:2011/12/16
?有什么办法来改变颜色
我可以改变的注册表项(工程,但需要重新启动)。此外,我试过后没有结果的消息(广播)。

我想改变它像在控制面板中,更改应用于即刻,并在最佳的情况下,而不保存它,使默认的颜色是应用后重新启动(如果我的应用程序崩溃,异常终止,...){ BR }
在此先感谢,对不起我的英语
评论会员:Omnicoder 时间:2011/12/16
我相信有一个系统的功能(SHELL32?),告诉系统更新这样的东西。至于没有"实际上是"改变它,我不相信多数民众赞成的可能,但我想你可以有一个小亚军运行的应用程序,因此,如果您的应用程序崩溃亚军可以改变颜色。我会在什么函数刷新的颜色
评论会员:贾森威达 时间:2011/12/16
你将能够获得在编译的应用程序显示在Vista的注册表呢?

{A}

评论会员:Omnicoder 时间:2011/12/16
你的意思是改变颜色?

修改:2008年12月24日(星期三),下午09:37
|贾森威达
评论会员:游客 时间:2011/12/16
没有我的意思是,如果应用程序是不是"跑"为管理员(BOOP),您将有权利访问注册表,用你的方法。{A}imgsrc=http://www.orcode.com/upimg/2011_12_16_08_23_40_2.jpg
Omnicoder
评论会员:游客 时间:2011/12/16
YEA。其实我做我的测试没有管理员运行
贾森威达
评论会员:游客 时间:2011/12/16
你可以添加一个处理的话/DWMGetColorizationColor之间的空间,你的文章熄灭在CodeProject上RSS订阅,不换行以及。{A}imgsrc=http://www.orcode.com/upimg/2011_12_16_08_23_40_2.jpg
Omnicoder
评论会员:游客 时间:2011/12/16
完成imgsrc=http://www.orcode.com/upimg/2011_12_16_08_23_40_4.gif
贾森威达
评论会员:游客 时间:2011/12/16
感谢!imgsrc=http://www.orcode.com/upimg/2011_12_16_08_23_40_4.gif的{A}imgsrc=http://www.orcode.com/upimg/2011_12_16_08_23_40_2.jpg