100165777.htm

来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 646 行 · 第 1/4 页

HTM
646
字号
<p class=MsoNormal><span lang=EN-US>SaveSettings()</span><span
style='font-family:宋体'>和</span><span lang=EN-US>ReadSettings()</span><span
style='font-family:宋体'>方法包含了我们感兴趣的注册表代码,但在介绍这些代码前,要先说明如何处理用户单击按钮的事件。该事件需要显示颜色对话框,把背景色设置为用户选择的颜色:</span></p>

<p class=2 style='margin-top:8.15pt;margin-right:0cm;FTEL:0cm;
margin-left:21.45pt;FTEL:.0001pt;FTEL:18.45pt'><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void OnClickChooseColor(object
Sender, EventArgs e)</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
{</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if(chooseColorDialog.ShowDialog() == DialogResult.OK)</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
BackColor = chooseColorDialog.Color;</span></p>

<p class=2 style='margin-top:0cm;margin-right:0cm;FTEL:8.15pt;
margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</span></p>

<p class=MsoNormal><span style='font-family:宋体'>下面看看如何保存这些设置:</span></p>

<p class=2 style='margin-top:8.15pt;margin-right:0cm;FTEL:0cm;
margin-left:21.45pt;FTEL:.0001pt;FTEL:18.45pt'><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void SaveSettings()</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
{</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
RegistryKey softwareKey = </span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Registry.LocalMachine.OpenSubKey(&quot;Software&quot;, true);</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
RegistryKey wroxKey = softwareKey.CreateSubKey(&quot;WroxPress&quot;);</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
RegistryKey selfPlacingWindowKey = </span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
wroxKey.CreateSubKey(&quot;SelfPlacingWindow&quot;);</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
selfPlacingWindowKey.SetValue(&quot;BackColor&quot;, </span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(object)BackColor.ToKnownColor());</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
selfPlacingWindowKey.SetValue(&quot;Red&quot;, (object)(int)BackColor.R);</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
selfPlacingWindowKey.SetValue(&quot;Green&quot;, (object)(int)BackColor.G);</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
selfPlacingWindowKey.SetValue(&quot;Blue&quot;, (object)(int)BackColor.B);</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
selfPlacingWindowKey.SetValue(&quot;Width&quot;, (object)Width);</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
selfPlacingWindowKey.SetValue(&quot;Height&quot;, (object)Height);</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
selfPlacingWindowKey.SetValue(&quot;X&quot;, (object)DesktopLocation.X);</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
selfPlacingWindowKey.SetValue(&quot;Y&quot;, (object)DesktopLocation.Y);</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
selfPlacingWindowKey.SetValue(&quot;WindowState&quot;, </span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(object)WindowState.ToString());</span></p>

<p class=2 style='margin-top:0cm;margin-right:0cm;FTEL:8.15pt;
margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</span></p>

<p class=MsoNormal><span style='font-family:宋体'>其中完成了许多任务。首先浏览注册表,使用前面介绍的技巧,从表示</span><span
lang=EN-US>HKLM</span><span style='font-family:宋体'>巢的静态属性</span><span
lang=EN-US>Registry.LocalMachine</span><span style='font-family:宋体'>开始,找到</span><span
lang=EN-US>HKLM\Software\ WroxPress\SelfPlacingWindow</span><span
style='font-family:宋体'>键。</span></p>

<p class=MsoNormal><span style='font-family:宋体'>接着使用</span><span lang=EN-US>RegistryKey.OpenSubKey()</span><span
style='font-family:宋体'>方法,而不是</span><span lang=EN-US>RegistryKey.CreateSubKey()</span><span
style='font-family:宋体'>来获取</span><span lang=EN-US>HKLM/Software</span><span
style='font-family:宋体'>键,这是因为这个键已经存在,如果它不存在,计算机就会出现严重错误,这个键包含了许多系统软件的设置。还需要对这个键进行写入访问,这是因为,如果</span><span
lang=EN-US>WroxPress</span><span style='font-family:宋体'>键不存在,就需要创建它<span
style='letter-spacing:-1.0pt'>——</span></span><span style='letter-spacing:-1.0pt'>
</span><span style='font-family:宋体'>这涉及到写入父键。</span></p>

<p class=MsoNormal style='line-height:15.6pt'><span style='font-family:宋体'>下一个要浏览的键是</span><span
lang=EN-US>HKLM\Software\WroxPress</span><span style='font-family:宋体'>,我们不能肯定这个键是否存在,如果它不存在,使用</span><span
lang=EN-US>CreateSubKey()</span><span style='font-family:宋体'>方法自动创建它。注意</span><span
lang=EN-US>CreateSubKey()</span><span style='font-family:宋体'>自动提供对键的写入访问。得到了</span><span
lang=EN-US>HKLM\Software\WroxPress\SelfPlacingWindow</span><span
style='font-family:宋体'>键后,就应多次调用</span><span lang=EN-US>RegistryKey. SetValue()</span><span
style='font-family:宋体'>方法,创建或设置合适的值。注意还有两个比较复杂的问题。</span></p>

<p class=MsoNormal style='line-height:15.6pt'><span style='font-family:宋体'>首先,应注意这里使用了以前未见过的两个类。</span><span
lang=EN-US>Form</span><span style='font-family:宋体'>类的</span><span lang=EN-US>DeskTopPosition</span><span
style='font-family:宋体'>属性表示屏幕左上角的位置,其类型是</span><span lang=EN-US>Point</span><span
style='font-family:宋体'>。第</span><span lang=EN-US>20</span><span
style='font-family:宋体'>章介绍了</span><span lang=EN-US>Point</span><span
style='font-family:宋体'>结构。</span><span lang=EN-US>Point</span><span
style='font-family:宋体'>包含两个</span><span lang=EN-US>int</span><span
style='font-family:宋体'>值,</span><span lang=EN-US>X</span><span
style='font-family:宋体'>和</span><span lang=EN-US>Y</span><span style='font-family:
宋体'>表示在屏幕上的水平和垂直位置。我们还使用了</span><span lang=EN-US>Form.BackColor</span><span
style='font-family:宋体'>属性的</span><span lang=EN-US>3</span><span
style='font-family:宋体'>种成员属性,它们是</span><span lang=EN-US>Color</span><span
style='font-family:宋体'>类的</span><span lang=EN-US>3</span><span
style='font-family:宋体'>个实例:</span><span lang=EN-US>R</span><span
style='font-family:宋体'>、</span><span lang=EN-US>G</span><span style='font-family:
宋体'>和</span><span lang=EN-US>B</span><span style='font-family:宋体'>:</span><span
lang=EN-US>Color</span><span style='font-family:宋体'>表示颜色,</span><span
lang=EN-US>3</span><span style='font-family:宋体'>种属性给出了组成该颜色的红、绿、蓝</span><span
lang=EN-US>3</span><span style='font-family:宋体'>种颜色成分,它们的类型都是</span><span
lang=EN-US>byte</span><span style='font-family:宋体'>。我们还使用了</span><span
lang=EN-US>Form.WindowState</span><span style='font-family:宋体'>属性,它包含一个枚举,该枚举给出了窗口的当前状态——</span><span
lang=EN-US>minimized</span><span style='font-family:宋体'>、</span><span
lang=EN-US>maximized</span><span style='font-family:宋体'>和</span><span
lang=EN-US> restored</span><span style='font-family:宋体'>。</span></p>

<p class=MsoNormal style='line-height:15.6pt'><span style='font-family:宋体'>另一个比较复杂的问题是需要仔细考虑数据的转换:</span><span
lang=EN-US>SetValue()</span><span style='font-family:宋体'>带两个参数:一个给出键名的字符串和一个包含键值的</span><span
lang=EN-US>System.Object</span><span style='font-family:宋体'>实例。</span><span
lang=EN-US>SetValue</span><span style='font-family:宋体'>对存储的值可以选择格式<span
style='letter-spacing:-1.0pt'>——</span></span><span style='letter-spacing:-1.0pt'>
</span><span style='font-family:宋体'>键值可以存储为</span><span lang=EN-US>REG</span><span
lang=EN-US style='font-family:"Baskerville BE Regular"'>_</span><span
lang=EN-US>SZ</span><span style='font-family:宋体'>、</span><span lang=EN-US>REG</span><span
lang=EN-US style='font-family:"Baskerville BE Regular"'>_</span><span
lang=EN-US>BINARY</span><span style='font-family:宋体'>或</span><span lang=EN-US>
REG</span><span lang=EN-US style='font-family:"Baskerville BE Regular"'>_</span><span
lang=EN-US>DWORD</span><span style='font-family:宋体'>。选择什么格式存储,主要取决于所给的数据类型。因此对于</span><span
lang=EN-US>WindowState</span><span style='font-family:宋体'>,给它传送一个字符串,</span><span
lang=EN-US>SetValue()</span><span style='font-family:宋体'>就会认为这个值应转换为</span><span
lang=EN-US>REG</span><span lang=EN-US style='font-family:"Baskerville BE Regular"'>_</span><span
lang=EN-US>SZ</span><span style='font-family:宋体'>。同样,对于所提供的各种位置和大小,应把</span><span
lang=EN-US>int</span><span style='font-family:宋体'>转换为</span><span lang=EN-US>REG</span><span
lang=EN-US style='font-family:"Baskerville BE Regular"'>_</span><span
lang=EN-US>DWORD</span><span style='font-family:宋体'>。但是,颜色成分要比把它们存储为</span><span
lang=EN-US>REG</span><span lang=EN-US style='font-family:"Baskerville BE Regular"'>_</span><span
lang=EN-US>DWORD</span><span style='font-family:宋体'>复杂得多,因为它们是数字类型。如果</span><span
lang=EN-US>SetValue()</span><span style='font-family:宋体'>认为这个数据的类型是</span><span
lang=EN-US>byte</span><span style='font-family:宋体'>,就会把它存储为字符串,即注册表中的</span><span
lang=EN-US>REG</span><span lang=EN-US style='font-family:"Baskerville BE Regular"'>_</span><span
lang=EN-US>SZ</span><span style='font-family:宋体'>。为了避免这个问题,应把颜色成分转换为</span><span
lang=EN-US>int</span><span style='font-family:宋体'>型。</span></p>

<p class=MsoNormal style='line-height:15.6pt'><span style='font-family:宋体'>我们还把所有的值的数据类型都显式转换为</span><span
lang=EN-US>Object</span><span style='font-family:宋体'>类型,实际上并不需要这么做,把任何数据类型转换为</span><span
lang=EN-US>Object</span><span style='font-family:宋体'>都可以隐式进行,但为了使过程更清晰,理解</span><span
lang=EN-US>SetValue</span><span style='font-family:宋体'>的第二个参数是一个对象引用,我们进行了显式的转换。</span></p>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?