diff --git "a/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232.md" "b/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..3f30734525077a61ed4fa77b906c66a0d3ffbd89 --- /dev/null +++ "b/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232.md" @@ -0,0 +1,55 @@ +# MVVM的基本思想 +## MVVM的概念 +MVVM模式全称是模型-视图-视图模型(Mod el-View-ViewModel),MVVM是为绑定而设计的一种模式。在MVVM中,有Model,View,和ViewModel三个组成部分:View就是用户看到的界面;Model是我们的数据,而ViewModel就负责将Model中的数据展示在页面上,同时将View上的改变同步回Model中,ViewModel是MVVM的核心,它通过DataBinding实现View与Model之间的双向绑定,其内容包括数据状态处理、数据绑定及数据转换。例如,View中某处的状态和Model中某部分数据绑定在一起,这部分数据一旦变更将会反映到View层。而这个机制通过ViewModel来实现。ViewModel,即视图模型,是一个专门用于数据转换的控制器,它可以把对象信息转换为视图信息,将命令从视图携带到对象。它通过View发布对象的公共数据,同时向视图提供数据和方法。View和ViewModel之间使用DataBinding及其事件进行通信。View的用户接口事件仍然由View自身处理,并把相关事件映射到ViewModel,以实现View中的对象与视图模型内容的同步,且可通过双向数据绑定进行更新。因此,程序员只需编写包含声明绑定的视图模板,以及ViewModel中的数据变更逻辑,就能使View获得响应式的更新。 + +## MVVM的流程 +在 MVVM 流程(如图 3 所示)中,View 仍然代表前端的界面,Model 仍然代表后端传递的数据,而 ViewModel 作为核心有着两个传递方向: +1. 将 Model 转换成 View,即将后端传递的数据转换成用户界面,实现方式为数据绑定; +2. 将 View 转换成 Model,即将用户界面转换成后端数据,实现方式为 DOM 事件监听。 + +## MVVM的应用场景 +在 MVVM 模式下 View 和 Model 不能直接通信,两者的通信只能通过 ViewModel 来实现。ViewModel 通常要实现一个观察者,当数据发生变化,ViewModel 能够监听到数据的变化,然后通知对应的视图做自动更新;而当用户操作视图,ViewModel 也能监听到视图的变化,再通知数据做改动,从而形成数据的双向绑定。这使得 MVVM 更适用于数据驱动的场景,尤其是数据操作特别频繁的场景。但也正是由于数据和视图的双向绑定,导致出现问题时不太好定位来源,有可能由数据问题导致、也有可能由业务逻辑中对视图属性的修改导致。 + +## MVVM的优点 +1. 低耦合。视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。 +2. 可重用性。你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。 +3. 独立开发。开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xaml代码。 +4. 可测试。界面素来是比较难于测试的,测试可以针对ViewModel来写。 + +## MVVM的缺点 +1. 代码量增加:与MVC等相比,由于MVVM要实现一系列的数据绑定,所以代码量会增加不少。 +2. 内存占用量大:一个大的Model里面也一定会存储着比较多的数据,所以会使用更多的内存。 + +# 熟悉WPF窗体应用程序创建流程 +## WPF基本概念 +WPF的核心是一个与分辨率无关且基于矢量的呈现引擎,旨在充分利用现代图形硬件。WPF通过一套完善的应用程序开发功能对该核心进行了扩展,这些功能包括可扩展应用程序标记语言 (XAML)、控件、数据绑定、布局、二维和三维图形、动画、样式、模板、文档、媒体、文本和版式。 WPF 属于 .NET,因此可以生成整合 .NET API 其他元素的应用程序。 + +## WPF程序创建流程 +选择所需要的WPF程序,就可以创建一个WPF窗体程序,在工具箱中选择我们需要的控件。可以直接从工具箱选择需要的控件,拖到MainWindow中使用。 +![选择WPF](WPF%E7%A8%8B%E5%BA%8F%E5%88%9B%E5%BB%BA%E6%B5%81%E7%A8%8B%E5%9B%BE/%E5%88%9B%E5%BB%BAWPF%E7%AA%97%E4%BD%93%E7%A8%8B%E5%BA%8F.png) +1. Button:按钮控件,可以添加文字,后台会生成点击按钮的Click事件。 +2. Label:在Label控件使用时,一般给予用户提示。Label控件的值不是text而是content。 +3. Textbox:TextBox是支持编辑的基本控件。 +4. Listbox:ListBox是列表级控件,是项目中比较常用的,该控件通过重写控件等方式,对项目中使用了特效方面特别有帮助。 +5. DataGrid:DataGrid 控件看起来很像 ListView,但它提供了许多附加功能。例如,DataGrid可以根据您提供给它的数据自动生成列。默认情况下,DataGrid也是可编辑的,允许最终用户更改基础数据源的值。 +6. ComboBox:ComboBox与ListBox基本上差别不大,比较相似。
+效果图如下 +![效果图](WPF%E7%A8%8B%E5%BA%8F%E5%88%9B%E5%BB%BA%E6%B5%81%E7%A8%8B%E5%9B%BE/%E6%95%88%E6%9E%9C%E5%9B%BE.png) +![效果图1](WPF%E7%A8%8B%E5%BA%8F%E5%88%9B%E5%BB%BA%E6%B5%81%E7%A8%8B%E5%9B%BE/%E6%95%88%E6%9E%9C%E5%9B%BE1.png) +# lab1实验准备 +安装VS2022专业版,Windows11专业版,Office专业版以及git等等软件,提前创建好gitee仓库。预计好完成实验的时间,并在实验完成后及时撰写实验报告。 +# 选做 +## 安装Anaconda +![anaconda](%E9%80%89%E5%81%9A/anaconda.jpg) +安装完anaconda之后,进行pytorch的安装 +## 安装pytorch +进入Python环境之后,进入PyTorch官网,选择相关参数,获取PyTorch安装指令。 +## 安装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] \ No newline at end of file diff --git "a/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232/WPF\347\250\213\345\272\217\345\210\233\345\273\272\346\265\201\347\250\213\345\233\276/\345\210\233\345\273\272WPF\347\252\227\344\275\223\347\250\213\345\272\217.png" "b/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232/WPF\347\250\213\345\272\217\345\210\233\345\273\272\346\265\201\347\250\213\345\233\276/\345\210\233\345\273\272WPF\347\252\227\344\275\223\347\250\213\345\272\217.png" new file mode 100644 index 0000000000000000000000000000000000000000..93cf732bd0b0a2bd1bc680cfe3215327d7722f42 Binary files /dev/null and "b/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232/WPF\347\250\213\345\272\217\345\210\233\345\273\272\346\265\201\347\250\213\345\233\276/\345\210\233\345\273\272WPF\347\252\227\344\275\223\347\250\213\345\272\217.png" differ diff --git "a/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232/WPF\347\250\213\345\272\217\345\210\233\345\273\272\346\265\201\347\250\213\345\233\276/\346\225\210\346\236\234\345\233\276.png" "b/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232/WPF\347\250\213\345\272\217\345\210\233\345\273\272\346\265\201\347\250\213\345\233\276/\346\225\210\346\236\234\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..e4d2187b5232a5893b25102ca3c0e1e04e84dc2d Binary files /dev/null and "b/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232/WPF\347\250\213\345\272\217\345\210\233\345\273\272\346\265\201\347\250\213\345\233\276/\346\225\210\346\236\234\345\233\276.png" differ diff --git "a/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232/WPF\347\250\213\345\272\217\345\210\233\345\273\272\346\265\201\347\250\213\345\233\276/\346\225\210\346\236\234\345\233\2761.png" "b/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232/WPF\347\250\213\345\272\217\345\210\233\345\273\272\346\265\201\347\250\213\345\233\276/\346\225\210\346\236\234\345\233\2761.png" new file mode 100644 index 0000000000000000000000000000000000000000..a7b074d770c4b2ad234f3ba83e4ec46fc0792670 Binary files /dev/null and "b/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232/WPF\347\250\213\345\272\217\345\210\233\345\273\272\346\265\201\347\250\213\345\233\276/\346\225\210\346\236\234\345\233\2761.png" differ diff --git "a/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232/\351\200\211\345\201\232/anaconda.jpg" "b/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232/\351\200\211\345\201\232/anaconda.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..b9c81dc3cb51ff0ad99e8185dcc890dd8fe1a4d8 Binary files /dev/null and "b/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232/\351\200\211\345\201\232/anaconda.jpg" differ diff --git "a/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\345\205\253\345\221\250\344\275\234\344\270\232&\350\257\276\345\240\202\344\272\222\345\212\250\357\274\210\347\277\273\350\257\221\357\274\211/lab_2_7.md" "b/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\345\205\253\345\221\250\344\275\234\344\270\232&\350\257\276\345\240\202\344\272\222\345\212\250\357\274\210\347\277\273\350\257\221\357\274\211/lab_2_7.md" new file mode 100644 index 0000000000000000000000000000000000000000..b36b8dc9d4b4b062e533d021bdc90af3bf76b2b4 --- /dev/null +++ "b/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\345\205\253\345\221\250\344\275\234\344\270\232&\350\257\276\345\240\202\344\272\222\345\212\250\357\274\210\347\277\273\350\257\221\357\274\211/lab_2_7.md" @@ -0,0 +1,63 @@ +# 2-7翻译 +## 注册表结构和注册表值类型 +* https://docs.microsoft.com/en-us/windows/win32/api/winreg/ns-winreg-valenta +* https://docs.microsoft.com/en-us/windows/win32/sysinfo/registry-value-types +* https://docs.microsoft.com/en-us/windows/win32/sysinfo/registry-value-types +### 一、注册表结构 +包含关于一个注册表值的信息。列表中的 RegQueryMultipleValues 函数使用此结构。 +``` +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指向的数据的大小),以字节为单位 + +**ve_valueptr** + +一个指向值输入数据的指针。这是一个指针,指向 在lpValueBuf缓冲区中返回的值的数据的指针,由 RegQueryMultipleValues填写的缓冲区中的值的指针。 + +**ve_type** + +ve_valueptr所指向的数据类型。关于可能的类型列表 可能的类型,请看注册表值类型。 + +### 二、注册表值的类型 +下面的例子是遍历一个REG_MULTI_SZ字符串。 +``` +#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/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\345\205\253\345\221\250\344\275\234\344\270\232&\350\257\276\345\240\202\344\272\222\345\212\250\357\274\210\347\277\273\350\257\221\357\274\211/lab_2_8.md" "b/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\345\205\253\345\221\250\344\275\234\344\270\232&\350\257\276\345\240\202\344\272\222\345\212\250\357\274\210\347\277\273\350\257\221\357\274\211/lab_2_8.md" new file mode 100644 index 0000000000000000000000000000000000000000..b4145823a24ae4b56cf78b3d71d831cad919498a --- /dev/null +++ "b/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\345\205\253\345\221\250\344\275\234\344\270\232&\350\257\276\345\240\202\344\272\222\345\212\250\357\274\210\347\277\273\350\257\221\357\274\211/lab_2_8.md" @@ -0,0 +1,117 @@ +# 2-8翻译 +## 枚举注册表子键 +* https://docs.microsoft.com/en-us/windows/win32/sysinfo/enumerating-registry-subkeys + +此实验示例使用RegQueryInfoKey、RegEnumKeyEx和RegEnumValue函数枚举指定键的子键。传递给每个函数的hKey参数是打开键的句柄。此键必须在函数调用之前打开,然后关闭。 +``` +// 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