diff --git "a/2020302111217-\347\216\213\347\245\216-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/2020302111217-\347\216\213\347\245\216.md" "b/2020302111217-\347\216\213\347\245\216-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/2020302111217-\347\216\213\347\245\216.md" new file mode 100644 index 0000000000000000000000000000000000000000..b4ecf36a2df475141eef1679c6ac1a48e5b71b01 --- /dev/null +++ "b/2020302111217-\347\216\213\347\245\216-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/2020302111217-\347\216\213\347\245\216.md" @@ -0,0 +1,96 @@ +# 第7周pull request +## 1、MVVM基本思想 +### MVVM的基本概念 +MVVM是Model-View-ViewModel的简写: +Model:数据模型层,用来处理业务逻辑和与数据库交互; +View:视图层,DOM; +ViewModel:视图模型层,用来处理Model层和View层的交互; +在MVVM框架中,将View层的状态和行为抽象化,视图 UI 和业务逻辑分开,ViewModel层通过双向绑定,把View层和Model层联系起来。ViewModel会自动的来处理这些事情。 +### MVVM的优点 +MVVM模式和MVC模式一样,目的是分离视图(View)和模型(Model) ,所以,它的优点有以下几个: + +1、低耦合。视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。 +2、可重用性。你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。 +3、独立开发。开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xaml代码。 +4、可测试。界面素来是比较难于测试的,测试可以针对ViewModel来写。 +### MVVM的组成 +1、模型 +模型是指代表真实状态内容的领域模型(面向对象),或指代表内容的数据访问层(以数据为中心)。 +2、视图 +就像在MVC和MVP模式中一样,视图是用户在屏幕上看到的结构、布局和外观(UI)。 +3、视图模型 +视图模型是暴露公共属性和命令的视图的抽象。MVVM没有MVC模式的控制器,也没有MVP模式的presenter,有的是一个绑定器。在视图模型中,绑定器在视图和数据绑定器之间进行通信。 +4、绑定器 +声明性数据和命令绑定隐含在MVVM模式中。在Microsoft解决方案堆中,绑定器是一种名为XAML的标记语言。绑定器使开发人员免于被迫编写样板式逻辑来同步视图模型和视图。在微软的堆之外实现时,声明性数据绑定技术的出现是实现该模式的一个关键因素。 +### MVVM的理论基础 +MVVM旨在利用WPF中的数据绑定函数,通过从视图层中几乎删除所有GUI代码(代码隐藏),更好地促进视图层开发与模式其余部分的分离。不需要用户体验(UX)开发人员编写GUI代码,他们可以使用框架标记语言(如XAML),并创建到应用程序开发人员编写和维护的视图模型的数据绑定。角色的分离使得交互设计师可以专注于用户体验需求,而不是对业务逻辑进行编程。这样,应用程序的层次可以在多个工作流中进行开发以提高生产力。即使一个开发人员在整个代码库上工作,视图与模型的适当分离也会更加高效,因为基于最终用户反馈,用户界面通常在开发周期中经常发生变化,而且处于开发周期后期。 +MVVM模式试图获得MVC提供的功能性开发分离的两个优点,同时利用数据绑定的优势和通过绑定数据的框架尽可能接近纯应用程序模型。它使用绑定器、视图模型和任何业务层的数据检查功能来验证传入的数据。结果是模型和框架驱动尽可能多的操作,消除或最小化直接操纵视图的应用程序逻辑(如代码隐藏)。 +## 2、WPF窗体应用 +### (1)WPF基本概念 +WPF 的核心是一个与分辨率无关且基于矢量的呈现引擎,旨在充分利用现代图形硬件。 WPF 通过一套完善的应用程序开发功能对该核心进行了扩展,这些功能包括可扩展应用程序标记语言 (XAML)、控件、数据绑定、布局、二维和三维图形、动画、样式、模板、文档、媒体、文本和版式。 WPF 属于 .NET,因此可以生成整合 .NET API 其他元素的应用程序。 +简介: +Windows用户界面框架,统一的编程模型、语言和框架,做到了界面设计与后端开发分离。 +特点: +1.呈现效果不受分辨率的影响; +2.基于DirectX 3d技术,可以做出炫酷的界面; +3.提供UI框架,集成了矢量图形、流动文字支持、3d视觉效果和控件模型框架; +4.UI与业务逻辑彻底分离,UI-XAML描述(底层wpf引擎是把元素解释成对应的对象); +5.xp server2003 到 window7及以后的操作系统版本都可以支持; +6.基于数据驱动,数据是核心。 +### (2)WPF基本控件 +| WPF控件 | 作用 | +| :---: | :---: | +| Button | 按钮控件,可以添加文字,后台会生成点击按钮的Click事件 | +| Label | 在Label控件使用时,一般给予用户提示。Label控件的值不是text而是content | +| Textbox | TextBox是支持编辑的基本控件 | +| Listbox | ListBox是列表级控件,是项目中比较常用的,该控件通过重写控件等方式,对项目中使用了特效方面特别有帮助 | +| DataGrid | DataGrid 控件看起来很像 ListView,但它提供了许多附加功能。例如,DataGrid可以根据您提供给它的数据自动生成列。默认情况下,DataGrid也是可编辑的,允许最终用户更改基础数据源的值。 | +| ComboBox | ComboBox与ListBox基本上差别不大,比较相似 | +## 3、实验准备Lab_1 +武汉大学正版软件下载网站:[武大正版软件](http://ca.whu.edu.cn/index.html) +![武大正版软件](./武大正版软件.png) + +### 1、Windows11专业版操作系统 +在武大正版软件官网下载,并使用官方软件激活: +![Win11Pro](./Win11Pro.png) +### 2、专业版Office2021 +采用武大官方正版激活软件将Office激活。 +![OfficePro](./OfficePro.png) +### 3、Visual Studio2022和git +git下载网址:[git下载](https://git-scm.com/) +VS2022下载网址:[VS2022下载](https://visualstudio.microsoft.com/zh-hans/?rr=https://www.microsoft.com/zh-cn/) +Git: +![Git](./git.png) + + + + + + +VS2022: +![VS2022](./VS2022.png) +### 4、gitee和github + +gitee官网:[gitee](https://gitee.com/) +github官网:[github](https://github.com/) + + +**至此,我的第一次实验准备完成。** + +## 4、选做部分 +###VS的python调试环境 +![VS_py](./VS_py.png) +### 安装Anaconda +![anaconda](./anaconda.png) +### 安装pytorch +进入Python环境之后,进入PyTorch官网,选择相关参数,获取PyTorch安装指令,并在anaconda prompt 终端中执行红色框中的指令。验证一下,为true即可。 +![pytorch](./pytorch.jpg) +### 安装gym +管理员运行进入 anaconda +git clone https://github.com/openai/gym.git +进入下载好的 gym 文件夹 +激活环境 +conda activate env_pytorch +pip install gym +conda install swig +pip install gym[Box2d] diff --git "a/2020302111217-\347\216\213\347\245\216-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/OfficePro.png" "b/2020302111217-\347\216\213\347\245\216-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/OfficePro.png" new file mode 100644 index 0000000000000000000000000000000000000000..bd058a0fe8a2e535c6a504e9085de8a587908e1f Binary files /dev/null and "b/2020302111217-\347\216\213\347\245\216-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/OfficePro.png" differ diff --git "a/2020302111217-\347\216\213\347\245\216-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/VS2022.png" "b/2020302111217-\347\216\213\347\245\216-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/VS2022.png" new file mode 100644 index 0000000000000000000000000000000000000000..3522db40e846b62b23c7629ebbeabfaa95f00b59 Binary files /dev/null and "b/2020302111217-\347\216\213\347\245\216-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/VS2022.png" differ diff --git "a/2020302111217-\347\216\213\347\245\216-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/VS_py.png" "b/2020302111217-\347\216\213\347\245\216-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/VS_py.png" new file mode 100644 index 0000000000000000000000000000000000000000..b3967515a4c6953fc83b539644ddc409bfdad8ad Binary files /dev/null and "b/2020302111217-\347\216\213\347\245\216-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/VS_py.png" differ diff --git "a/2020302111217-\347\216\213\347\245\216-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/Win11Pro.png" "b/2020302111217-\347\216\213\347\245\216-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/Win11Pro.png" new file mode 100644 index 0000000000000000000000000000000000000000..884ea18ef5106acadec4479dc09c940818d6d58a Binary files /dev/null and "b/2020302111217-\347\216\213\347\245\216-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/Win11Pro.png" differ diff --git "a/2020302111217-\347\216\213\347\245\216-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/anaconda.png" "b/2020302111217-\347\216\213\347\245\216-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/anaconda.png" new file mode 100644 index 0000000000000000000000000000000000000000..73a90487ce52aa2bd8d0d57e6fae6cdd013bd3b3 Binary files /dev/null and "b/2020302111217-\347\216\213\347\245\216-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/anaconda.png" differ diff --git "a/2020302111217-\347\216\213\347\245\216-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/git.png" "b/2020302111217-\347\216\213\347\245\216-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/git.png" new file mode 100644 index 0000000000000000000000000000000000000000..5eaac2f1e7612b5b71859d1aabc98996f252bd8e Binary files /dev/null and "b/2020302111217-\347\216\213\347\245\216-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/git.png" differ diff --git "a/2020302111217-\347\216\213\347\245\216-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/pytorch.png" "b/2020302111217-\347\216\213\347\245\216-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/pytorch.png" new file mode 100644 index 0000000000000000000000000000000000000000..859658315ea8d00f145160aa31b44b9551c93342 Binary files /dev/null and "b/2020302111217-\347\216\213\347\245\216-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/pytorch.png" differ diff --git "a/2020302111217-\347\216\213\347\245\216-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\346\255\246\345\244\247\346\255\243\347\211\210\350\275\257\344\273\266.png" "b/2020302111217-\347\216\213\347\245\216-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\346\255\246\345\244\247\346\255\243\347\211\210\350\275\257\344\273\266.png" new file mode 100644 index 0000000000000000000000000000000000000000..971131c58075d6f80f45468752ebd4ee521c5188 Binary files /dev/null and "b/2020302111217-\347\216\213\347\245\216-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\346\255\246\345\244\247\346\255\243\347\211\210\350\275\257\344\273\266.png" differ diff --git "a/2020302111217-\347\216\213\347\245\216-\347\254\254\345\205\253\345\221\250\344\275\234\344\270\232/lab2_7.md" "b/2020302111217-\347\216\213\347\245\216-\347\254\254\345\205\253\345\221\250\344\275\234\344\270\232/lab2_7.md" new file mode 100644 index 0000000000000000000000000000000000000000..565fa873904921d9689871d96910fae80f09adfb --- /dev/null +++ "b/2020302111217-\347\216\213\347\245\216-\347\254\254\345\205\253\345\221\250\344\275\234\344\270\232/lab2_7.md" @@ -0,0 +1,67 @@ +# 注册表结构和注册表值类型 + + + + + +*** + +## 1 结构 + +包含关于一个注册表值的信息。列表中的RegQueryMultipleValues函数使用此结构。 + +```cpp +typedef struct value_entW { + LPWSTR ve_valuename; + DWORD ve_valuelen; + DWORD_PTR ve_valueptr; + DWORD ve_type; +} VALENTW, *PVALENTW; +``` + +**ve_valuename** +要检索的值的名称。请确保在调用RegQueryMultipleValues之前设置此成员然后再调用RegQueryMultipleValues。 + +**ve_valuelen** +ve_valueptr所指向的数据的大小,以字节为单位。 + +**ve_valueptr** +一个指向值输入数据的指针。这是一个指针,指向在lpValueBuf缓冲区中返回的值的数据的指针,由RegQueryMultipleValues填写的缓冲区中的值的指针。 + +**ve_type** +ve_valueptr所指向的数据类型。关于可能的类型列表可能的类型,请看注册表值类型。 + + +## 2 值的类型 + +下面的例子是走一个REG_MULTI_SZ字符串。 +```cpp +#include +#include +#include + +void SampleSzz(PTSTR pszz) +{ + _tprintf(_TEXT("\tBegin multi-sz string\n")); + while (*pszz) + { + _tprintf(_TEXT("\t\t%s\n"), pszz); + pszz = pszz + _tcslen(pszz) + 1; + } + _tprintf(_TEXT("\tEnd multi-sz\n")); +} + +int __cdecl main(int argc, char **argv) +{ + // Because the compiler adds a \0 at the end of quoted strings, + // there are two \0 terminators at the end. + + _tprintf(_TEXT("Conventional multi-sz string:\n")); + SampleSzz(_TEXT("String1\0String2\0String3\0LastString\0")); + + _tprintf(_TEXT("\nTest case with no strings:\n")); + SampleSzz(_TEXT("")); + + return 0; +} +``` \ No newline at end of file diff --git "a/2020302111217-\347\216\213\347\245\216-\347\254\254\345\205\253\345\221\250\344\275\234\344\270\232/lab2_8.md" "b/2020302111217-\347\216\213\347\245\216-\347\254\254\345\205\253\345\221\250\344\275\234\344\270\232/lab2_8.md" new file mode 100644 index 0000000000000000000000000000000000000000..a6de3c20240c1f065c60f122f7cf5e3f96c2ffa3 --- /dev/null +++ "b/2020302111217-\347\216\213\347\245\216-\347\254\254\345\205\253\345\221\250\344\275\234\344\270\232/lab2_8.md" @@ -0,0 +1,121 @@ +# 枚举注册表子键 + + + + +*** + +这个经验样本使用RegQueryInfoKey、RegEnumKeyEx,和RegEnumValue函数来列举指定键的子键。传递给每个函数的hKey参数是一个打开的钥匙的句柄。这个键必须在函数调用前被打开调用之前打开之后关闭。 + +```cpp +// QueryKey - 枚举键的子键及其相关值。 +// hKey - 要列举其子键和值的键。 + +#include +#include +#include + +#define MAX_KEY_LENGTH 255 +#define MAX_VALUE_NAME 16383 + +void QueryKey(HKEY hKey) +{ + TCHAR achKey[MAX_KEY_LENGTH]; // 子键名称的缓冲区 + DWORD cbName; // 名称字符串的大小 + TCHAR achClass[MAX_PATH] = TEXT(""); // 类名的缓冲区 + DWORD cchClassName = MAX_PATH; // 类字符串的大小 + DWORD cSubKeys=0; // 子密钥的数量 + DWORD cbMaxSubKey; // 最大的子键尺寸 + DWORD cchMaxClass; // 最长级别的字符串 + DWORD cValues; // 键值的数量 + DWORD cchMaxValue; // 最长的值名称 + DWORD cbMaxValueData; // 最长值数据 + DWORD cbSecurityDescriptor; // 安全描述符的大小 + FILETIME ftLastWriteTime; // 最后写入时间 + + DWORD i, retCode; + + TCHAR achValue[MAX_VALUE_NAME]; + DWORD cchValue = MAX_VALUE_NAME; + + // 获取类的名称和值的数量。 + retCode = RegQueryInfoKey( + hKey, // 钥匙柄 + achClass, // 类名的缓冲区 + &cchClassName, // 类字符串的大小 + NULL, // 保留 + &cSubKeys, // 子密钥的数量 + &cbMaxSubKey, // 最长的子键尺寸 + &cchMaxClass, // 最长级别的字符串 + &cValues, // 这个键的值的数量 + &cchMaxValue, // 最长的值名称 + &cbMaxValueData, // 最长值数据 + &cbSecurityDescriptor, //安全描述符 + &ftLastWriteTime); // 最后写作时间 + + //枚举子键,直到RegEnumKeyEx失败。 + + if (cSubKeys) + { + printf( "\nNumber of subkeys: %d\n", cSubKeys); + + for (i=0; i