diff --git "a/2020302111165-\346\210\264\345\255\220\346\264\213-Windows\347\273\223\350\257\276\350\256\272\346\226\207.docx" "b/2020302111165-\346\210\264\345\255\220\346\264\213-Windows\347\273\223\350\257\276\350\256\272\346\226\207.docx" new file mode 100644 index 0000000000000000000000000000000000000000..dbf4e41f1e1f82021fef7092f2242580394a9c95 Binary files /dev/null and "b/2020302111165-\346\210\264\345\255\220\346\264\213-Windows\347\273\223\350\257\276\350\256\272\346\226\207.docx" differ diff --git "a/2020302111165-\346\210\264\345\255\220\346\264\213-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232.md" "b/2020302111165-\346\210\264\345\255\220\346\264\213-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..dce788bc6bdb532c3ca740363f0ad3dc6fa71c68 --- /dev/null +++ "b/2020302111165-\346\210\264\345\255\220\346\264\213-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232.md" @@ -0,0 +1,73 @@ +MVVM是Model-View-ViewModel的简写。它本质上与我们所熟知的MVC(Model-View-Controller)没有太大差别,可以简单理解为MVC 的改进版。 + + model模型:指的是后端传过来的数据。 + + view视图:指的是所有看到的页面,可以理解为将数据以某种方式呈现给用户。 + + ViewModel:指的是视图模型,他是连接view和model的桥梁。 + + MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开。当然这些事 ViewModel 已经帮我们做了,它可以取出 Model 的数据同时帮忙处理 View 中由于需要展示内容而涉及的业务逻辑。 + + 微软的WPF带来了新的技术体验,如Silverlight、音频、视频、3D、动画……,这导致了软件UI层更加细节化、可定制化。同时,在技术层面,WPF也带来了 诸如Binding、Dependency Property、Routed Events、Command、DataTemplate、ControlTemplate等新特性。 + + MVVM(Model-View-ViewModel)框架的由来便是MVP(Model-View-Presenter)模式与WPF结合的应用方式时发展演变过来的一种新型架构框架。它立足于原有MVP框架并且把WPF的新特性糅合进去,以应对客户日益复杂的需求变化。 + + 在MVVM架构中,是不允许数据和视图直接通信的,只能通过ViewModel来通信,而ViewModel就是定义了一个Observer观察者。ViewModel是连接View和Model的中间件。 + + + +MVVM的优点 + +1. 低耦合。视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。 +2. 可重用性。你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。 +3. 独立开发。开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xaml代码。 +4. 可测试。界面素来是比较难于测试的,测试可以针对ViewModel来写。 + +MVVM的组成部分 + +模型是指代表真实状态内容的领域模型(面向对象),或指代表内容的数据访问层(以数据为中心)。 + +就像在MVC和MVP模式中一样,视图是用户在屏幕上看到的结构、布局和外观(UI)。 + +视图模型是暴露公共属性和命令的视图的抽象。MVVM没有MVC模式的控制器,也没有MVP模式的presenter,有的是一个绑定器。在视图模型中,绑定器在视图和数据绑定器之间进行通信。 + +声明性数据和命令绑定隐含在MVVM模式中。在Microsoft解决方案堆中,绑定器是一种名为XAML的标记语言。绑定器使开发人员免于被迫编写样板式逻辑来同步视图模型和视图。在微软的堆之外实现时,声明性数据绑定技术的出现是实现该模式的一个关键因素。 + +MVVM的理论基础 + + MVVM旨在利用WPF中的数据绑定函数,通过从视图层中几乎删除所有GUI代码(代码隐藏),更好地促进视图层开发与模式其余部分的分离。不需要用户体验(UX)开发人员编写GUI代码,他们可以使用框架标记语言(如XAML),并创建到应用程序开发人员编写和维护的视图模型的数据绑定。角色的分离使得交互设计师可以专注于用户体验需求,而不是对业务逻辑进行编程。这样,应用程序的层次可以在多个工作流中进行开发以提高生产力。即使一个开发人员在整个代码库上工作,视图与模型的适当分离也会更加高效,因为基于最终用户反馈,用户界面通常在开发周期中经常发生变化,而且处于开发周期后期。 MVVM模式试图获得MVC提供的功能性开发分离的两个优点,同时利用数据绑定的优势和通过绑定数据的框架尽可能接近纯应用程序模型。它使用绑定器、视图模型和任何业务层的数据检查功能来验证传入的数据。结果是模型和框架驱动尽可能多的操作,消除或最小化直接操纵视图的应用程序逻辑(如代码隐藏)。 + + MVVM模型的好处是,除了获得分离之外,还可以实现模型和视图之间的分离,MVVM模型的功效是获得了一个无需查看即可轻松更改的一致模型。实施MVVM的重要关键的要素是可测试性,可维护性和可扩展性。MVVM的对于模型和视图的隔离,大大方便了开发者对于数据状态的维护与管理。 + + + + + +熟悉窗体 + +1、 Button(按钮):表示 Windows 按钮控件,该按钮对 Click 事件做出反应。 + +属性介绍 +​ Background:元素的背景色; Foreground:前景色; Width/Height:宽度/高度;​ BorderBrush:元素边框颜色; BorderThickness:元素边框宽度;​ Command:获取或设置在按下按钮时调用的命令。​ CommandBindings:获取与此元素关联的 CommandBinding 对象的集合。 CommandBinding 为此元素启用命令处理,并声明命令、命令的事件和由此元素附加的处理程序之间的链接。​ CommandParameter:获取或设置要传递给 Command 属性的参数。​ Content:获取或设置 ContentControl 的内容。​ ContentStringFormat:获取或设置一个撰写字符串,该字符串指定如果 Content 属性显示为字符串,应如何设置该属性的格式。​ ContentTemplate :获取或设置用于显示 ContentControl 内容的数据模板。​ FontFamily:字体名称; FontSize:字体大小; FontStretch:字体在屏幕上紧缩或加宽的程度; FontWeight:字体粗细;​ ClickMode:获取或设置 Click 事件何时发生。ClikMode值有如下三种,具体解析如下:​ Release:指定当按下和释放按钮时应引发Click 事件。​ Press:指定当按下按钮时应引发Click 事件。​ Hover:指定当鼠标悬停在控件上时应引发Click 事件。 + +2、Label (文本标签) 表示包含一段任意类型内容的控件。也可以叫标签控件。 + +Background:背景; Foreground前景色(字体颜色) BorderBrush:用于描述控件的边框背景的画笔。 BorderThickness:获取或设置控件的边框宽度。 Content:获取或设置 ContentControl 的内容。 FontFamily:获取或设置控件的字体系列。 FontSize:获取或设置字号。 FontStretch:获取或设置字体在屏幕上紧缩或加宽的程度。 FontStyle:获取或设置字体样式。 FontWeight:获取或设置指定字体的粗细。 Width/Height:宽度/高度。 IsEnabled:使能是否可用。 Name:元素标识名称。 +​ Opacity:透明度。 Margin:元素的外边距。 +​ HorizontalAlignment/VerticalAlignment:获取或设置在父元素(如面板或项控件)中组合此元素时所应用的水平/垂直对齐特征。​ HorizontalContentAlignment/VerticalContentAlignment:获取或设置控件内容的水平/垂直对齐方式。 + +3、TextBox (文本输入框控件)是WPF中最基本的文字输入控件。它允许最终用户在一行、对话输入、或多行编写,就像是个文本编辑器,支持缩放和复制粘贴。 + +Background:背景; BorderBrush:边框背景的颜色; BorderThickness:边框宽度; CanRedo:是否可重做最新的撤消操作; CanUndo:是否可撤消最新的操作; CaretIndex:获取或设置插入符号的插入位置索引。 FlowDirection:获取或设置文本和其他用户界面 (UI) 元素在控制其布局的任何父元素内流动的方向。 FontFamily:字体样式; FontSize:字体大小; FontStretch:字体在屏幕上紧缩或加宽的程度。 HorizontalAlignment/VerticalAlignment:获取或设置在父元素中组合此元素时所应用的水平对齐特征/垂直对齐特征。 HorizontalContentAlignment/VerticalContentAlignment:获取或设置控件内容的水平对齐方式/垂直对齐方式。 HorizontalScrollBarVisibility/VerticalScrollBarVisibility:是否显示水平滚动条/垂直滚动条; HorizontalOffset/VerticalOffset:获取和设置水平滚动条的位置/垂直滚动条的位置; IsEnabled:使能,是否可用; IsReadOnly:对用户而言是否只读; IsUndoEnabled:是否支持撤销功能; LineCount:文本总行数; MaxLength:在文本框中手动输入的最大字符数。 MaxLines/MinLines:最大可见行数/最小行数。 Name:元素标识名称; Opacity:透明度; SelectedText:文本框中当前选择的内容。 SelectionBrush:突出显示选定文本的画笔。 SelectionLength:文本框中当前选择的字符数。 SelectionOpacity:选择文本的透明度。 SelectionStart:当前选择的起始位置的字符索引。 SelectionTextBrush:选中文本的颜色; Text:文本框的文本内容。 TextAlignment:文本框内容的水平对齐方式。 TextWrapping:文本框中文本的换行方式。 + +4、ListBox 是一个 ItemsControl,这意味着它可以包含任何类型的对象的集合 (例如字符串、图像或面板) 。一个 ListBox 中的多个项是可见的,与仅 ComboBox具有所选项可见的项不同,除非 IsDropDownOpen 属性为 true。 该 SelectionMode 属性确定一次是否可以选择多个项 ListBox 。 + +FontFamily:字体系列; FontSize:字体大小; FontStretch:字体在屏幕上紧缩或加宽的程度;FontWeight:字体粗细; Background:背景; BorderBrush:边框颜色; BorderThickness:边框宽度; Foreground:前景色; Width/Height:宽度/高度; Name:元素标识名称; IsEnabled:使能,是否可用; Margin:外边距; Opacity:透明度; Visibility:可见性; IsVisible:是否可见; FlowDirection:其子元素的流动方向; LayoutTransform:在执行布局时应该应用于此元素的图形转换方式。 RenderTransform:元素的呈现位置的转换信息; RenderTransformOrigin:由RenderTransform声明的任何可能呈现转换的中心点,相对于元素的边界。 HorizontalAlignment/VerticalAlignment:在父元素中组合此元素时所应用的水平对齐特征/垂直对齐特征。 HorizontalContentAlignment/VerticalContentAlignment:控件内容的水平对齐方式/垂直对齐方式。 Items:获取用于生成 ItemsControl 的内容的集合。 ItemsSource:获取或设置用于生成 ItemsControl 的内容的集合。 SelectedIndex:获取或设置当前选择中第一项的索引,如果选择为空,则返回负一(-1)。 SelectedItem:获取或设置当前选择中的第一项,或者,如果选择为空,则返回 null。 SelectedItems:获取当前选定的项。 SelectedValue:获取或设置通过使用 SelectedItem 而获取的 SelectedValuePath 的值。 SelectedValuePath:获取或设置用于从 SelectedValue 获取 SelectedItem 的路径。 SelectionMode:获取或设置 ListBox 的选择行为。 SnapsToDevicePixels:获取或设置一个值,该值确定在呈现过程中,此元素的呈现是否应使用特定于设备的像素设置。 + +5、DataGrid DataGrid 表示用于在可自定义的网格中显示数据的控件。 + +ActualHeight/ActualWidth:元素呈现的高度/宽度。 CanSelectMultipleItems:获取或设置一个值,该值指示是否可以一次选择 MultiSelector 中的多个项。 CanUserAddRows:获取或设置一个值,该值指示用户是否可在 DataGrid 中添加新行。 CanUserDeleteRows:获取或设置一个值,该值指示用户是否可从 DataGrid 中删除行。 CanUserReorderColumns:获取或设置一个值,该值指示用户能否通过用鼠标拖动列标题来更改列的显示顺序。 CanUserResizeColumns/CanUserResizeRows:获取或设置一个值,该值指示用户是否可使用鼠标调整列宽/高度。 CanUserSortColumns:获取或设置一个值,该值指示用户能否通过单击列标题对列进行排序。 ColumnHeaderHeight:获取或设置列标题行的高度。 Columns:获取一个集合,该集合包含 DataGrid 中的所有列。 ColumnWidth:获取或设置 DataGrid 中列和标题的标准宽度和大小调整模式。 CurrentCell:获取或设置具有焦点的单元格。CurrentColumn:获取或设置包含当前单元格的列。 CurrentItem:获取与包含当前单元格的行绑定的数据项。 DisplayMemberPath:获取或设置源对象上的值的路径,以用作对象的可视表示形式。 HeadersVisibility:获取或设置用于指定行和列标题可见性的值。 HorizontalGridLinesBrush:获取或设置用于绘制水平网格线的画笔。 HorizontalScrollBarVisibility/VerticalScrollBarVisibility:水平/垂直滚动条可见性。 RowBackground:获取或设置行背景的默认画笔。RowHeaderWidth:获取或设置行标题列的宽度。 RowHeight:获取或设置所有行的建议高度。SelectedCells:获取当前选定单元格的列表。 SelectedIndex:获取或设置当前选择中第一项的索引,如果选择为空,则返回负一(-1)。 SelectedItem:获取或设置当前选择中的第一项,或者,如果选择为空,则返回 null。 SelectedItems:获取在 MultiSelector 中选定的项。 SelectedValue:获取或设置通过使用 SelectedItem 而获取的 SelectedValuePath 的值。 SelectedValuePath:获取或设置用于从 SelectedValue 获取 SelectedItem 的路径。 SelectionMode:获取或设置一个值,该值指示如何在 DataGrid 中选择行和单元格。 SelectionUnit:获取或设置一个值,该值指示是否可以在 DataGrid 中选择行、单元格或两者。 Items:获取用于生成 ItemsControl 的内容的集合。ItemTemplate:获取或设置用来显示每个项的 DataTemplate。 ItemsPanel:获取或设置模板,该模板定义对项的布局进行控制的面板。 ItemsSource:获取或设置用于生成 ItemsControl 的内容的集合。 SnapsToDevicePixels:获取或设置一个值,该值确定在呈现过程中,此元素的呈现是否应使用特定于设备的像素设置。 + +6、 ComboBox (复选框)表示带有下拉列表的选择控件,通过单击控件上的箭头可显示或隐藏下拉列表。也叫下拉列表控件。 + +FontFamily:字体系列; FontSize:字体大小; FontStretch:字体在屏幕上紧缩或加宽的程度;FontWeight:字体粗细; Background:背景; BorderBrush:边框颜色; BorderThickness:边框宽度; Foreground:前景色; Width/Height:宽度/高度; Name:元素标识名称; IsEnabled:使能,是否可用; Margin:外边距; Opacity:透明度; Visibility:可见性; IsVisible:是否可见; FlowDirection:其子元素的流动方向; LayoutTransform:在执行布局时应该应用于此元素的图形转换方式。 RenderTransform:元素的呈现位置的转换信息; RenderTransformOrigin:由RenderTransform声明的任何可能呈现转换的中心点,相对于元素的边界。 HorizontalAlignment/VerticalAlignment:在父元素中组合此元素时所应用的水平对齐特征/垂直对齐特征。 HorizontalContentAlignment/VerticalContentAlignment:控件内容的水平对齐方式/垂直对齐方式。 Items:获取用于生成 ItemsControl 的内容的集合。ItemTemplate:获取或设置用来显示每个项的 DataTemplate。 ItemsPanel:获取或设置模板,该模板定义对项的布局进行控制的面板。 ItemsSource:获取或设置用于生成 ItemsControl 的内容的集合。 SelectedIndex:获取或设置当前选择中第一项的索引,如果选择为空,则返回负一(-1)。 SelectedItem:获取或设置当前选择中的第一项,或者,如果选择为空,则返回 null。 SelectedItems:获取当前选定的项。 Text:获取或设置当前选定项的文本。 SelectedValue:获取或设置通过使用 SelectedItem 而获取的 SelectedValuePath 的值。 SelectedValuePath:获取或设置用于从 SelectedValue 获取 SelectedItem 的路径。 SelectionBoxItem:获取在选择框中显示的项。SelectionBoxItemTemplate:获取选择框内容的项模板。 SnapsToDevicePixels:获取或设置一个值,该值确定在呈现过程中,此元素的呈现是否应使用特定于设备的像素设置。 IsDropDownOpen:获取或设置一个值,该值指示组合框的下拉部分当前是否打开。 IsEditable:获取或设置一个值,该值指示启用或禁用 ComboBox 的文本框中的文本编辑。 IsReadOnly:获取或设置启用仅限选择模式的值,在此模式中,可选择但不可编辑组合框中的内容。 \ No newline at end of file diff --git "a/2020302111165-\346\210\264\345\255\220\346\264\213-\347\254\254\345\205\253\345\221\250\344\275\234\344\270\232.md" "b/2020302111165-\346\210\264\345\255\220\346\264\213-\347\254\254\345\205\253\345\221\250\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..e4d65e3b7dd9a0bee8d93cc3d3f422536b294794 --- /dev/null +++ "b/2020302111165-\346\210\264\345\255\220\346\264\213-\347\254\254\345\205\253\345\221\250\344\275\234\344\270\232.md" @@ -0,0 +1,182 @@ +## 2_7注册表结构和注册表值类型 + +> [https://docs.microsoft.com/en-us/windows/win32/api/winreg/ns-winreg-valenta](https://gitee.com/link?target=https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fwin32%2Fapi%2Fwinreg%2Fns-winreg-valenta) +> [https://docs.microsoft.com/en-us/windows/win32/sysinfo/registry-value-types](https://gitee.com/link?target=https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fwin32%2Fsysinfo%2Fregistry-value-types) +> [https://docs.microsoft.com/en-us/windows/win32/sysinfo/registry-value-types](https://gitee.com/link?target=https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fwin32%2Fsysinfo%2Fregistry-value-types) + +### 1.注册表结构 + +```c++ +typedef struct value_entW { + LPWSTR ve_valuename; + DWORD ve_valuelen; + DWORD_PTR ve_valueptr; + DWORD ve_type; +} VALENTW, *PVALENTW; +``` + +ve_valuename +要检索的值的名称。要在调用RegQueryMultipleValues之前设置该成员 + +ve_valuelen +ve_valueptr所指向的数据大小,以字节为单位 + +ve_valueptr +指向value项数据的指针。这是一个指针,指向由RegQueryMultipleValues填充的lpValueBuf缓冲区中返回的值的数据 + +ve_type +ve_valueptr指向数据的数据类型 + +### 2.注册表值类型 + +下面的示例遍历一个REG_MULTI_SZ字符串 + +```c++ +#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; +} +``` + +## 2_8枚举注册表子键 + +> [https://docs.microsoft.com/en-us/windows/win32/sysinfo/enumerating-registry-subkeys](https://gitee.com/link?target=https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fwin32%2Fsysinfo%2Fenumerating-registry-subkeys) + +本实验示例使用RegQueryInfoKey、RegEnumKeyEx和RegEnumValue函数枚举指定键的子键。传递给每个函数的hKey参数是一个打开键的句柄。此键必须在函数调用之前打开,然后关闭。 + +```c++ +// QueryKey -枚举key及其相关值的子键。 +// 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; + + // Get the class name and the value count. + retCode = RegQueryInfoKey( + hKey, // 键柄 + achClass, // 类名缓冲区 + &cchClassName, // 类字符串的大小 + NULL, // 保留 + &cSubKeys, // 子键数 + &cbMaxSubKey, // 最长子键大小 + &cchMaxClass, // 最长的类字符串 + &cValues, // 此键值的数目 + &cchMaxValue, // 最长的值名 + &cbMaxValueData, // 最长值数据 + &cbSecurityDescriptor, // 安全描述项 + &ftLastWriteTime); // 最后写入时间 + + // Enumerate the subkeys, until RegEnumKeyEx fails. + + if (cSubKeys) + { + printf( "\nNumber of subkeys: %d\n", cSubKeys); + + for (i=0; i