原文链接:http://dev.mjxy.cn/a-Step-5-Use-the-registry-to-save-the-configuration.aspx

转载请注明: 敏捷学院-技术资源库  http://mjxy.cn  作者:邢泉

本节介绍如何使用注册表保存程序的配置信息,方便我们再次运行程序的时候加载上次的设置数据。
 
注册表读写操作
.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();
        }

问题描述

至此,我们的桌球瞄准器功能可以说已经基本完成了。你可以试着运行,体验一下自己开发的瞄准器。还存在的问题是当我们瞄准的时候,需要用瞄准线将目标球准确的一分为二才算是精确的击球线路,如下图所示:

如果稍偏一点平分目标球不准确的话,对于一些角度比较难进的球来说也不是很好瞄准。为了解决这个问题我们将在下一节介绍如何绘制一个目标球来更精确的辅助瞄准!

代码下载
taiqiu_step5.zip

参考资料
http://msdn.microsoft.com/zh-cn/library/ad51f2dx(VS.80).aspx

相关章节

步骤1:桌球瞄准器介绍与使用方法
步骤2:创建项目添加主窗体
步骤3:绘制瞄准线及母球
步骤4:透明度、颜色、线宽与母球大小
步骤5:使用注册表保存配置
步骤6:更精确瞄准目标球的绘制

步骤7:帮助与软件注册的简单方法

转载于:https://www.cnblogs.com/xingquan/archive/2011/08/18/2144869.html

QQ桌球瞄准器开发(5)使用注册表保存配置相关推荐

  1. 基于Windows8与Visual Studio2012开发内核隐藏注册表

    Windows 驱动程序的发展演变  我们在学习开发驱动程序时有必要弄清楚Windows设备驱动程序的发展演变过程(为了简便起见,以下简称驱动程序),以便明白我们将要开发什么样的驱动程序.这就象你开发 ...

  2. python测试开发django-35.xadmin注册表信息

    前言 xadmin后台如果要对表的内容增删改查,跟之前的admin.py文件里面写注册表信息一样,需在admin.py同一级目录新建一个adminx.py的文件. 然后在adminx.py文件控制页面 ...

  3. 设备管理器中的计算机注册表位置,设备管理器/隐藏设备 在注册表中的位置

    设备范例ID是设备在注册表里 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root\ 的具体位置 显示隐藏设备 一.运行 Devmgmt.msc ...

  4. 设备管理器中的计算机注册表位置,电脑如何修改设备管理器里显示的名称|通过注册表修改设备名称的方法...

    ‍ 我们可以在电脑中通过设备管理器查看配置的硬件设备,以及各自的工作状态,驱动是否正常等,而里面显示的设备名称一般是不可以修改的.因为某些原因,可能会出现设备管理器里的设备出现重名的情况,因此,我们可 ...

  5. 如何通过注册表,配置IE可信站点,兼容视图,ActiveX策略

    *     参考至:http://blog.csdn.net/hanzengyi/article/details/7409107, *     参考至:https://code.csdn.net/sn ...

  6. 由于注册表的配置信息不完整,无法启动windows的硬件设备

    今天早上用电脑的时候发现声卡一直发现不了声驱动,这个问题困扰了我好一会 ,我尝试了各种办法,以为是声卡驱动的问题,也安装了360.驱动精灵等辅助软件,都没有什么用. 打开设备管理器,里面的声音设备的图 ...

  7. winform 注册码+注册表保存

    我所使用的注册码方法只是基于本地的CPUID与硬盘的编码并进行.开发人员使用SoftReg 类根据唯一机器码生成唯一注册码,发给客户,客户注册之后就可以用,注册未成功时会在本地注册表生成一个使用次数, ...

  8. MFC SDI 中 通过注册表保存当前窗体的 显示状态位置

    在 框架类响应 WM_CLOSE消息的时候添加如下代码 HKEY  key;        //用于接收注册表项句柄  WINDOWPLACEMENT  info;  //获得窗体位置状态信息  Ge ...

  9. windows注册表项配置客户端代理服务器

    代理服务器的设置对应windows注册表的[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings] ...

  10. oracle不能写入注册表,保存注册表时提示无法创建值,写入注册表时出错怎么办?...

    如何解决保存注册表提示"无法创建值,写入注册表时出错"的问题?电脑当中的注册表编辑器有着十分重要的作用,但是最近却有用户表示遇到了编辑注册表后保存却提示"无法创建值,写入 ...

最新文章

  1. 动态数据绑定之监听对象变化
  2. 云上主机SSH秘钥对连接linux注意事项
  3. bash 判断 os 版本_鸿蒙OS手机将至,华为手机用户提问,老款机器能升级吗?
  4. RL之SARSA:利用强化学习之SARSA实现走迷宫—训练智能体走到迷宫(复杂陷阱迷宫)的宝藏位置
  5. 怎么拆计算机主机,技术编辑教您电脑机箱怎么拆
  6. LeetCode题解之Copy List with Random Pointer
  7. 初识Mysql(part6)--我需要知道的4条Mysql语句之利用通配符过滤
  8. 历久弥新 - 微软万亿市值背后的文化支撑(上)|DevOps案例研究
  9. 小组是什么意思_生猪期货什么时候上市?相关企业如何参与生猪期货
  10. android 获取对象,在Android中获取LayoutInflater对象的方法
  11. 5寸屏,智能之外也可以当数码相框
  12. python有趣的案例_Python有趣的小案例
  13. IOS调试—断点调试以及动态输出
  14. html高级编辑工具,高级编辑工具
  15. 将excel多项式拟合公式放在python里重新计算结果完全不一样||excel线性拟合出来的公式明显不对||用excel拟合出多项式后python中带入值计算完全不对
  16. layui 勾选不联动父项 树形控件,treetable-lay
  17. 服务器清理文件,裸金属服务器清理文件
  18. jude(java建模软件)_JUDE(JAVA建模软件)
  19. 【开发工具】 Office Tool Plus 居然也可以部署 Office 365 我的天 真的是太厉害了
  20. mysql数据库主机名是什么_mysql数据库主机名是什么

热门文章

  1. git merge fast-forward squash no-ff
  2. SAR、PAR和DAR
  3. NETWARE系统加入服务器,Linux操作系统下配置Netware服务器方法
  4. 刚体运动学公式_1.力的观点 ⑴.匀变速直线运动中常见的公式: 牛顿第二定律: 运动学公式:.... ⑵.圆周运动的主要公式:...
  5. SYN 包(synchronize)
  6. python计算方位角_python如何计算方位角 python计算方位角代码实例
  7. 女人,百花千红你最美
  8. ESP8266-Arduino编程实例-MPL3115A2压力传感器驱动
  9. ACM中AC、WA、PE、RE分别是什么意思
  10. 传感器极性NPN和PNP区别!!!