diff --git "a/# Windows\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232-2020302111354-\344\270\245\346\261\237\346\266\233.md" "b/# Windows\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232-2020302111354-\344\270\245\346\261\237\346\266\233.md" new file mode 100644 index 0000000000000000000000000000000000000000..3ebe12f6fcc79a3e6a13d8baaac9f8254c561cbc --- /dev/null +++ "b/# Windows\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232-2020302111354-\344\270\245\346\261\237\346\266\233.md" @@ -0,0 +1,156 @@ +# Windows第七周作业-2020302111354-严江涛 + +## 熟悉MVVM的基本思想 +### 什么是MVVM +MVVM 模式,即指Model-View-ViewModel。它将View的状态和行为完全抽象化,把逻辑与界面的控制完全交给ViewModel处理。其设计思想的理念就是分而治之,把不同的业务代码放到不同的模块当中,然后通过特定的逻辑把他们组织到一块。主要由以下部分组成: +1. View:主要进行视图控件的一些初始设置,不应该有任何的数据逻辑操作。 +2. Model:定义实体类,以及获取业务数据模型,比如通过数据库或者网络来操作数据等。 +3. ViewModel:作为连接 View 与 Model 的中间桥梁,ViewModel 与 Model 直接交互,处理完业务逻辑后,通过 DataBinding 将数据变化反应到用户界面上。 + +MVVM采用双向数据绑定,view中数据变化将自动反映到viewmodel上,反之,model中数据变化也将会自动展示在页面上。把Model和View关联起来的就是ViewModel。ViewModel负责把Model的数据同步到View显示出来,还负责把View的修改同步回Model。 + +MVVM模式试图获得MVC提供的功能性开发分离的两个优点,同时利用数据绑定的优势和通过绑定数据的框架尽可能接近纯应用程序模型。它使用绑定器、视图模型和任何业务层的数据检查功能来验证传入的数据。结果是模型和框架驱动尽可能多的操作,消除或最小化直接操纵视图的应用程序逻辑(如代码隐藏)。 + +### MVVM优点 +1. 低耦合。视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。 +2. 可重用性。你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。 +3. 独立开发。开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xaml代码。 +4. 可测试。测试可以针对ViewModel来写。 + +## 熟悉WPF窗体应用程序创建流程 +1. Button:表示 Windows 按钮控件,该按钮对 Click 事件做出反应,其常用属性如下所示: + - background:元素的背景色; + - Foreground:前景色; + - Width/Height:宽度/高度; + - BorderBrush:元素边框颜色; + - BorderThickness:元素边框宽度; + - CommandParameter:获取或设置要传递给 Command 属性的参数; + - FontFamily:字体名称; FontSize:字体大小; + - FontStretch:字体在屏幕上紧缩或加宽的程度; + - FontWeight:字体粗细; + - Content:获取或设置 ContentControl 的内容; + - ContentTemplate :获取或设置用于显示 ContentControl 内容的数据模板; + +2. Label:文本标签 表示包含一段任意类型内容的控件。也可以叫标签控件。 其常用属性如下所示: + - Background:背景; + - BorderBrush:用于描述控件的边框背景的画笔 + - BorderThickness:获取或设置控件的边框宽度 + - Width/Height:宽度/高度 + - Content:获取或设置 ContentControl 的内容 + - FontFamily:获取或设置控件的字体系列 + - FontSize:获取或设置字号 + - FontStyle:获取或设置字体样式 + - FontWeight:获取或设置指定字体的粗细 + - FontStretch:获取或设置字体在屏幕上紧缩或加宽的程度 + - Name:元素标识名称 + - Opacity:透明度 + - Margin:元素的外边距 + +3. TextBox:文本输入框控件。它允许最终用户在一行、对话输入、或多行编写。其常用属性如下所示: + - Background:背景 + - BorderBrush:边框背景的颜色 + - BorderThickness:边框宽度 + - FontFamily:字体样式 + - FontSize:字体大小 + - FontStretch:字体在屏幕上紧缩或加宽的程度 + - Opacity:透明度 + - SelectedText:文本框中当前选择的内容 + - SelectionBrush:突出显示选定文本的画笔 + - LineCount:文本总行数 + - MaxLength:在文本框中手动输入的最大字符数 + - SelectionLength:文本框中当前选择的字符数 + - Name:元素标识名称 + - TextAlignment:文本框内容的水平对齐方式 + - TextWrapping:文本框中文本的换行方式 + - SelectionTextBrush:选中文本的颜色 + - Text:文本框的文本内容 + - SelectionOpacity:选择文本的透明度 + - SelectionStart:当前选择的起始位置的字符索引 + - HorizontalAlignment/VerticalAlignment:获取或设置在父元素中组合此元素时所应用的水平对齐特征/垂直对齐特征 + - HorizontalContentAlignment/VerticalContentAlignment:获取或设置控件内容的水平对齐方式/垂直对齐方式 + - HorizontalScrollBarVisibility/VerticalScrollBarVisibility:是否显示水平滚动条/垂直滚动条 + - HorizontalOffset/VerticalOffset:获取和设置水平滚动条的位置/垂直滚动条的位置 + - IsReadOnly:对用户而言是否只读 + - MaxLines/MinLines:最大可见行数/最小行数 + +4. ListBox:一个 ItemsControl,这意味着它可以包含任何类型的对象的集合。 一个 ListBox 中的多个项是可见的。其常用属性如下所示: + - FontFamily:字体系列 + - FontSize:字体大小 + - FontStretch:字体在屏幕上紧缩或加宽的程度 + - FontWeight:字体粗细 + - Background:背景 + - BorderBrush:边框颜色 + - BorderThickness:边框宽度 + - Foreground:前景色 + - Width/Height:宽度/高度 + - Name:元素标识名称 + - Margin:外边距 + - Opacity:透明度 + - Visibility:可见性 + - IsVisible:是否可见 + - HorizontalAlignment/VerticalAlignment:在父元素中组合此元素时所应用的水平对齐特征/垂直对齐特征 + - HorizontalContentAlignment/VerticalContentAlignment:控件内容的水平对齐方式/垂直对齐方式 + - Items:获取用于生成 ItemsControl 的内容的集合 + - ItemsSource:获取或设置用于生成 ItemsControl 的内容的集合 + +5. DataGrid DataGrid:表示用于在可自定义的网格中显示数据的控件。其常用属性如下所示: + - ActualHeight/ActualWidth:元素呈现的高度/宽度 + - CanSelectMultipleItems:获取或设置一个值,该值指示是否可以一次选择 MultiSelector 中的多个项 + - CanUserAddRows:获取或设置一个值,该值指示用户是否可在 DataGrid 中添加新行 + - CanUserDeleteRows:获取或设置一个值,该值指示用户是否可从 DataGrid 中删除行 + - CanUserReorderColumns:获取或设置一个值,该值指示用户能否通过用鼠标拖动列标题来更改列的显示顺序 + - CanUserResizeColumns/CanUserResizeRows:获取或设置一个值,该值指示用户是否可使用鼠标调整列宽/高度 + - CanUserSortColumns:获取或设置一个值,该值指示用户能否通过单击列标题对列进行排序 + - SelectedCells:获取当前选定单元格的列表 + - CurrentItem:获取与包含当前单元格的行绑定的数据项 + - HorizontalScrollBarVisibility/VerticalScrollBarVisibility:水平/垂直滚动条可见性 + - RowHeaderWidth:获取或设置行标题列的宽度 + - RowHeight:获取或设置所有行的建议高度 + - ColumnWidth:获取或设置 DataGrid 中列和标题的标准宽度和大小调整模式 + - CurrentCell:获取或设置具有焦点的单元格 + - CurrentColumn:获取或设置包含当前单元格的列 + - SnapsToDevicePixels:获取或设置一个值,该值确定在呈现过程中,此元素的呈现是否应使用特定于设备的像素设置 + - ItemsPanel:获取或设置模板,该模板定义对项的布局进行控制的面板 + - SelectedItems:获取在 MultiSelector 中选定的项 + - Items:获取用于生成 ItemsControl 的内容的集合 + - DisplayMemberPath:获取或设置源对象上的值的路径,以用作对象的可视表示形式 + - HeadersVisibility:获取或设置用于指定行和列标题可见性的值 + - HorizontalGridLinesBrush:获取或设置用于绘制水平网格线的画笔 + - ColumnHeaderHeight:获取或设置列标题行的高度 + - Columns:获取一个集合,该集合包含 DataGrid 中的所有列 + +6. ComboBox 表示带有下拉列表的选择控件,也叫下拉列表控件。其常用属性如下所示: + - FontFamily:字体系列 + - FontSize:字体大小 + - FontStretch:字体在屏幕上紧缩或加宽的程度 + - FontWeight:字体粗细 + - Background:背景 + - BorderBrush:边框颜色 + - BorderThickness:边框宽度 + - Width/Height:宽度/高度 + - Name:元素标识名称 + - Margin:外边距 + - Opacity:透明度 + - Visibility:可见性 + - IsVisible:是否可见 + - HorizontalAlignment/VerticalAlignment:在父元素中组合此元素时所应用的水平对齐特征/垂直对齐特征 + - HorizontalContentAlignment/VerticalContentAlignment:控件内容的水平对齐方式/垂直对齐方式 + - SelectedItems:获取当前选定的项 + - Text:获取或设置当前选定项的文本 + - SelectionBoxItem:获取在选择框中显示的项 + - SelectionBoxItemTemplate:获取选择框内容的项模板 + - IsDropDownOpen:获取或设置一个值,该值指示组合框的下拉部分当前是否打开 + - IsEditable:获取或设置一个值,该值指示启用或禁用 ComboBox 的文本框中的文本编辑 + - IsReadOnly:获取或设置启用仅限选择模式的值,在此模式中,可选择但不可编辑组合框中的内容 + +### 实验准备 +1. 安装Windows11专业版,校园网有正版下载,并打开开发者模式。 +2. 安装Word和Excel,安装2019专业版。 +3. 安装 Visual Studio 2022 Community, 并且安装 git与VS相关扩展。 +4. 申请好 gitee、github、Visual Studio 也注册账号。并且在github及gitee上各建立一个空仓库。 +5. 建立 SSH 连接及推送到远程仓库,详情见 https://github.com/principleWindows/gitMem。 + +### 选做部分 +1. 安装anaconda,安装pytorch,创建env_pytorch环境 +2. 下载gym,并激活env_pytorch环境,pip install gym出错后安装相应的缺失模块 + diff --git "a/2020302111354-\344\270\245\346\261\237\346\266\233-lab_2_7.md" "b/2020302111354-\344\270\245\346\261\237\346\266\233-lab_2_7.md" new file mode 100644 index 0000000000000000000000000000000000000000..d3add914a52843a6e255620c080858dd04bba9b4 --- /dev/null +++ "b/2020302111354-\344\270\245\346\261\237\346\266\233-lab_2_7.md" @@ -0,0 +1,61 @@ +# 注册表结构和注册表值类型 + +## 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; +} +``` diff --git "a/2020302111354-\344\270\245\346\261\237\346\266\233-lab_2_8.md" "b/2020302111354-\344\270\245\346\261\237\346\266\233-lab_2_8.md" new file mode 100644 index 0000000000000000000000000000000000000000..7a3a832317bc8f0577c64d09648c7722c5129fd9 --- /dev/null +++ "b/2020302111354-\344\270\245\346\261\237\346\266\233-lab_2_8.md" @@ -0,0 +1,114 @@ +# 枚举注册表子键 + +```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