开发QQ桌球瞄准器(5):使用注册表保存配置
本节介绍如何使用注册表保存程序的配置信息,方便我们再次运行程序的时候加载上次的设置数据。
注册表读写操作
.NET提供了Microsoft.Win32.Registry对注册表进行了封装。
要获取 RegistryKey 的实例,请使用 Registry 类的静态成员之一。
注册表充当计算机上操作系统和应用程序的中央信息储存库。注册表根据存储在其中的元素的逻辑顺序,以分层形式组织(有关该层次结构中的基级项,请参见 Registry)。在注册表中存储信息时,请根据存储的信息类型选择适当的位置。一定要避免损坏由其他应用程序创建的信息,原因是这样会导致那些应用程序出现意外的行为,并且还会对您自己的应用程序带来不利影响。
注册表项是注册表中的基本组织单位,好比是 Windows 资源管理器中的文件夹。每个具体的注册表项都可以有子项,就像文件夹下可以有子文件夹一样。只要用户具有相应的权限,且注册表项不是基项或基项的下一级项,就可以删除该注册表项。每个注册表项也可带有与其相关联的多个值(一个值就好比是一个文件),它们用于存储信息,例如,有关计算机上安装的应用程序的信息。每个值存储特定的信息,可按需要对其进行检索或更新。例如,可以为您的公司创建一个 RegistryKey(在项 HKEY_LOCAL_MACHINE\Software 下),然后为您的公司创建的每个应用程序创建一个子项。每个子项保存特定于该应用程序的信息,如颜色设置、屏幕位置和大小或者可识别的文件扩展名。
下面的代码示例演示如何在 HKEY_CURRENT_USER 下创建一个子项,处理相应的内容,然后删除该子项。
using System;
using System.Security.Permissions;
using Microsoft.Win32;
[assembly: RegistryPermissionAttribute(SecurityAction.RequestMinimum,
ViewAndModify = "HKEY_CURRENT_USER")]
class RegKey
{
static void Main()
{
// Create a subkey named Test9999 under HKEY_CURRENT_USER.
RegistryKey test9999 =
Registry.CurrentUser.CreateSubKey("Test9999");
// Create two subkeys under HKEY_CURRENT_USER\Test9999. The
// keys are disposed when execution exits the using statement.
using(RegistryKey
testName = test9999.CreateSubKey("TestName"),
testSettings = test9999.CreateSubKey("TestSettings"))
{
// Create data for the TestSettings subkey.
testSettings.SetValue("Language", "French");
testSettings.SetValue("Level", "Intermediate");
testSettings.SetValue("ID", 123);
}
// Print the information from the Test9999 subkey.
Console.WriteLine("There are {0} subkeys under {1}.",
test9999.SubKeyCount.ToString(), test9999.Name);
foreach(string subKeyName in test9999.GetSubKeyNames())
{
using(RegistryKey
tempKey = test9999.OpenSubKey(subKeyName))
{
Console.WriteLine("\nThere are {0} values for {1}.",
tempKey.ValueCount.ToString(), tempKey.Name);
foreach(string valueName in tempKey.GetValueNames())
{
Console.WriteLine("{0,-8}: {1}", valueName,
tempKey.GetValue(valueName).ToString());
}
}
}
using(RegistryKey
testSettings = test9999.OpenSubKey("TestSettings", true))
{
// Delete the ID value.
testSettings.DeleteValue("id");
// Verify the deletion.
Console.WriteLine((string)testSettings.GetValue(
"id", "ID not found."));
}
// Delete or close the new subkey.
Console.Write("\nDelete newly created registry key? (Y/N) ");
if(Char.ToUpper(Convert.ToChar(Console.Read())) == 'Y')
{
Registry.CurrentUser.DeleteSubKeyTree("Test9999");
Console.WriteLine("\nRegistry key {0} deleted.",
test9999.Name);
}
else
{
Console.WriteLine("\nRegistry key {0} closed.",
test9999.ToString());
test9999.Close();
}
}
}
保存数据到注册表
1.新建类ConfigInfo类及方法来写入和读取注册表的操作。代码如下:
public class ConfigInfo
{
public const string subkey = "tq";
Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(subkey);
//写入透明度
public void WriteOpacity(int value)
{
if (key != null)
key.SetValue("opacity", value);
}
//获取透明度
public int GetOpacity()
{
if (key != null)
return (int)key.GetValue("opacity", 80);
return 80;
}
//写入线宽
public void WriteLineWidth(int value)
{
if (key != null)
key.SetValue("linewidth", value);
}
//获取线宽
public int GetLineWidth()
{
if (key != null)
return (int)key.GetValue("linewidth", 5);
return 5;
}
//写入球体大小
public void WriteBallSize(int value)
{
if (key != null)
key.SetValue("ballsize", value);
}
//获取球体大小
public int GetBallSize()
{
if (key != null)
return (int)key.GetValue("ballsize", 30);
return 30;
}
~ConfigInfo()
{
Close();
}
public void Close()
{
if (key != null)
key.Close();
}
}
2.为Form类添加如下方法用于加载和写入注册表信息。
//从注册表加载配置
private void LoadConfigInfo()
{
ConfigInfo info = new ConfigInfo();
frmOpacityTrackBar.Value = info.GetOpacity();
penWeigthTrackBar.Value = info.GetLineWidth();
ballSizeTrackBar.Value = info.GetBallSize();
}
//写配置到注册表
private void WriteConfigInfo()
{
ConfigInfo info = new ConfigInfo();
info.WriteOpacity(frmOpacityTrackBar.Value);
info.WriteLineWidth(penWeigthTrackBar.Value);
info.WriteBallSize(ballSizeTrackBar.Value);
}
3.为Form添加Load事件
在Load事件里调用LoadConfigInfo方法加载注册表中保存的数据。
private void Form1_Load(object sender, EventArgs e)
{
LoadConfigInfo();
this.Opacity = frmOpacityTrackBar.Value;
penWidth = penWeigthTrackBar.Value / 10;
radius = radius_base + ballSizeTrackBar.Value / 10;
}
4.为Form添加FormClosing事件
在FormClosing事件里调用WriteConfigInfo方法写入数据到注册表中。
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
WriteConfigInfo();
}
问题描述
至此,我们的桌球瞄准器功能可以说已经基本完成了。你可以试着运行,体验一下自己开发的瞄准器。还存在的问题是当我们瞄准的时候,需要用瞄准线将目标球准确的一分为二才算是精确的击球线路,如下图所示:
如果稍偏一点平分目标球不准确的话,对于一些角度比较难进的球来说也不是很好瞄准。为了解决这个问题我们将在下一节介绍如何绘制一个目标球来更精确的辅助瞄准!
代码下载
http://dev.mjxy.cn/uploadfiles/files/taiqiu_step5.zip
参考资料
http://msdn.microsoft.com/zh-cn/library/ad51f2dx(VS.80).aspx
转载请注明: 敏捷学院-技术资源库 http://mjxy.cn 作者:邢泉
开发QQ桌球瞄准器(5):使用注册表保存配置相关推荐
- windows内核开发学习笔记四十四:注册表存储结构-储巢
上一篇文章学习了注册表的逻辑结构,接下来我这篇文章来学习注册表的存储结构.注册表实际存储是由一组储巢构成,每个储巢包含了一个由键和值构成的层次结构.下面表是windows的各个储巢的注册表路径和文件路 ...
- Win10找不到系统应用“照片查看器”时添加注册表即可解决?!
新建一个TXT文本文档,把以下代码复制粘贴到其中: Windows Registry Editor Version 5.00 ; Change Extension's File Type [HKEY_ ...
- 如何通过注册表,配置IE可信站点,兼容视图,ActiveX策略
* 参考至:http://blog.csdn.net/hanzengyi/article/details/7409107, * 参考至:https://code.csdn.net/sn ...
- 由于注册表的配置信息不完整,无法启动windows的硬件设备
今天早上用电脑的时候发现声卡一直发现不了声驱动,这个问题困扰了我好一会 ,我尝试了各种办法,以为是声卡驱动的问题,也安装了360.驱动精灵等辅助软件,都没有什么用. 打开设备管理器,里面的声音设备的图 ...
- winform 注册码+注册表保存
我所使用的注册码方法只是基于本地的CPUID与硬盘的编码并进行.开发人员使用SoftReg 类根据唯一机器码生成唯一注册码,发给客户,客户注册之后就可以用,注册未成功时会在本地注册表生成一个使用次数, ...
- MFC SDI 中 通过注册表保存当前窗体的 显示状态位置
在 框架类响应 WM_CLOSE消息的时候添加如下代码 HKEY key; //用于接收注册表项句柄 WINDOWPLACEMENT info; //获得窗体位置状态信息 Ge ...
- windows注册表项配置客户端代理服务器
代理服务器的设置对应windows注册表的[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings] ...
- oracle不能写入注册表,保存注册表时提示无法创建值,写入注册表时出错怎么办?...
如何解决保存注册表提示"无法创建值,写入注册表时出错"的问题?电脑当中的注册表编辑器有着十分重要的作用,但是最近却有用户表示遇到了编辑注册表后保存却提示"无法创建值,写入 ...
- 用注册表保存数据——DOS应用简介
简介 注册表最开始是出现在Windows 3.x,是用来为OLE保存数据的.那时Windows和其应用程序的设置值大多都保存在各不相同的.INI文件中.例如我们最为熟悉的System.ini和Win. ...
- tt桌球瞄准器手机版_新年换台新手机!各价位段哪些机型值得入手?
新机=新机遇.新机会,2021年请对我好一点,不如就从换个手机开始? 我们为大家吐血盘点了截止发稿各价位段上最推荐入手的机型,颗粒度500元一档,不止考虑性价比,还会参考真实用户体验.这一年群机荟萃. ...
最新文章
- ECSHOP 数据库结构说明
- 面试不怂之redis与缓存大全
- 数据仓库系列1-高质量数据建模
- java炒黄金_炒黄金追单的一些问题分析
- redis取值偶尔取不到_redis 入门
- apache 网站转nginx_堡塔网站加速宝塔面板网站加速安装设置使用教程
- 《Python自动化》学习笔记:百度云智能进行文字识别(代码干货)
- 配置终端服务和远程桌面服务器身份验证和加密级别
- maya中英转换插件1.2 及教程
- java中display中的属性_全面解析display属性
- app 评论功能实现
- html画流程图插件,基于SVG的流程图插件Flowchart.js
- 焦虑症应该怎么办?这六个缓解方法建议试试
- Bridging signals(最长上升子序列)
- java 阶乘后几位,java阶乘计算获得结果末尾0的个数代码实现
- 运放放大倍数计算公式_运算放大器基础1——用作比较器
- 基于python编写的RAT(Remote Administration Tool)——Stitch
- 在虚拟机上搭建云平台环境(5)yum配置
- Recent Learning Plan(近期计算机摸鱼计划)
- 软考证书=获得职称?软考证书还能这样用