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

原文链接: 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1617865.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

QQ桌球瞄准器开发(2)创建项目添加主窗体

转载请注明: 敏捷学院-技术资源库 http://mjxy.cn 作者:邢泉 原文链接:http://dev.mjxy.cn/a-Step-2-Create-the-main-form-to-add-items.aspx 我使用的是VS2010 .NET Framework 4,实际.NET 2.0以上都可以完成这个程序。 创建项目 在“…

打架斗殴行为识别算法

打架斗殴行为识别算法通过yolov7网络模型深度学习算法,打架斗殴行为识别算法对提取到的信息进行分析和比对,判断是否存在打架斗殴行为。打架斗殴行为识别算法一旦打架斗殴行为识别算法识别到打架斗殴行为,系统会立即生成预警信息,…

java基于SSM框架的洗车店预约系统的设计与实现

基于SSM框架的洗车店预约系统的设计与实现 #### 开发工具(eclipse/idea): eclipse4.5/4.8或者idea2018,jdk1.8 * * * 洗车店预约系统设计了注册会员和管理人员两个功能模块,其功能如下: 1、注册、登陆 该系统根据操作权限的不同分为管理员和…

基于Java实现的汽车租赁管理系统、SSM/SpringBoot两个版本都有+mysql汽车出租系统实现

基于Java实现的汽车租赁管理系统、SSM/SpringBoot两个版本都有mysql汽车出租系统实现 感兴趣的朋友可以家 3060912346 主要技术 SpringBoot\SSM(两个版本都有) HTML、jQuery、HTML、CSS、JS Mysql bootstrap 开发工具和环境 Eclipse\idea(都…

基于SSM的车辆维修管理系统

其他项目,点击作者主页 目录 1 系统简介 2 系统相关技术 2.1面向对象 2.2 SSM框架 2.3 Tomcat服务器 2.4 MySQL数据库 2.5 Navicat工具 3 需求分析 3.1可行性分析 3.1.1技术可行性 3.1.2经济可行性 3.1.3操作可行性 3.2 需求分析 4 系统设计 4.1 …

车辆管理系统(asp.net+SqlServer)

摘 要 2 Abstract 3 第1章 绪 论 6 1.1研究意义 6 1.2研究背景 6 1.3国内外研究现状 7 1.4本课题研究的主要内容 7 第2章 关键技术分析及其在课题中的应用 8 2.2 Sql server 8 2.4 PowerDesigner Trial 10 第3章 系统实施 12 3.1系统功能简介 12 3.2车辆信息管理流程 14 3.2.1车…

基于SSH开发小型洗车门店客户管理系统

基于S2SH开发小型洗车门店客户管理系统论文文件资料(大作业/毕业设计) 开发环境: Windows操作系统 开发工具:MyEclipse(Eclipse)JdkTomcatMYSQL数据库运行效果图: 基于S2SH开发小型洗车门店客户管理系统论文文件资料(大…

基于Python的车辆管理系统

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等):mysql 功能模块(请用文字描述,至少200字):系统实现功能包括: 管理员:运营信息的管理、车辆维修信息的管理、事故信息的管理、司机信息…

车到家洗车管理系统[JavaWeb]SSH+MySQL+Jsp

GitHub地址:https://github.com/yzk2356911358/CarmessageSystem 数据库:https://download.csdn.net/download/yzk2356911358/10793734

【C++11新特性】可变参数模板

文章目录 1. 认识可变参数模板2. 可变参数模板的定义方式3. 参数包的展开方式3.1 递归展开参数包3.2 逗号表达式展开参数包 1. 认识可变参数模板 可变参数模板是C11新增的最强大的特性之一,它对参数高度泛化,能够让我们创建可以接收可变参数的函数模板和…

QEMU 仿真RISC-V freeRTOS 程序

1. 安裝RISC-V 仿真環境 --QEMU 安裝包下載地址: https://www.qemu.org/ 安裝命令及安裝成功效果如下所示, target-list 設定爲riscv32-softmmu, $ cat ~/project/qemu-8.0.4/install.sh sudo apt-get install libglib2.0-dev sudo apt-get install libpixman-1-dev ./co…

给微软.Net runtime运行时提交的几个Issues

前言 因为目前从事的CLRJIT,所以会遇到一些非常底层的问题,比如涉及到微软的公共运行时和即时编译器或者AOT编译器的编译异常等情况,这里分享下自己提的几个Issues。原文:微软.Net runtime运行时提交的几个Issues Issues 一.issues one 第一个System.Numerics.Vecto…

报错处理:Docker容器无法启动

具体报错: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"program\": executable file not found in $PATH": unknown. 报错环境: 该报错出现在使用…

Orange Pi 3B 开发板 开箱评测 和 系统安装教程

香橙派 Orange Pi 3B(RK3566)开发板 开箱测评 和 系统烧录教程 简介 香橙派 Orange Pi 3B 是一款树莓派大小的单板计算机,但接口更加齐全,包括一个全尺寸 HDMI 接口和一个 M.2 存储插槽,售价199起。 Orange Pi 3B 采…

leetcode438. 找到字符串中所有字母异位词(java)

滑动窗口 找到字符串中所有字母异位词滑动窗口数组优化 上期经典 找到字符串中所有字母异位词 难度 - 中等 Leetcode 438 - 找到字符串中所有字母异位词 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出…

软考:中级软件设计师:大数据

软考:中级软件设计师:大数据 提示:系列被面试官问的问题,我自己当时不会,所以下来自己复盘一下,认真学习和总结,以应对未来更多的可能性 关于互联网大厂的笔试面试,都是需要细心准备的 &#x…

网络经济与企业管理【五】之市场营销管理

感谢内容提供者:金牛区吴迪软件开发工作室 上一篇:网络经济与企业管理【四】之企业组织管理 文章目录 第五章:市场营销管理一、市场营销概述二、市场营销过程1.市场营销的过程2.目标营销经历的三个阶段3.选择目标市场的三种战略4.市场营销组…

【市场营销学三】企业战略与营销管理

【市场营销学三】企业战略与营销管理 一、企业战略与规划1.1、企业战略特征1.2、企业战略层次结构1.3、企业战略规划过程 二、总体战略2.1、认识和界定企业使命2.2、区分战略业务单位2.3、明确投资组合2.4、选择业务成长战略 三、经营战略3.1、分析竞争环境3.2、选择竞争战略 四…

【市场营销学二】市场营销管理哲学及其贯彻

【市场营销学二】市场营销管理哲学及其贯彻 一、市场营销哲管理哲学及其演进1.1、 什么是市场营销管理1.2、什么是市场营销管理哲学1.3、以企业为中心的观念1.4、以消费者为中心的观念1.5、以利益相关者和社会整体利益为中心的观念 二、以全方位营销促进顾客满意及客户忠诚2.1、…

Docker容器:docker consul的注册与发现及consul-template

Docker容器:docker consul的注册与发现及consul-template守护进程 一.docker consul的注册与发现介绍 1.什么是服务注册与发现 (1)服务注册与发现是微服务架构中不可或缺的重要组件。 (2)为解决服务都是单节点的&a…