diff --git "a/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/.keep" "b/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/.keep" new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git "a/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2764.1.1.png" "b/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2764.1.1.png" new file mode 100644 index 0000000000000000000000000000000000000000..97826c8a355a8f19cfac35b4fd91293888b1c1c3 Binary files /dev/null and "b/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2764.1.1.png" differ diff --git "a/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2764.1.2.png" "b/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2764.1.2.png" new file mode 100644 index 0000000000000000000000000000000000000000..baa2367a53326488884ef20114691d0c2f9081e6 Binary files /dev/null and "b/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2764.1.2.png" differ diff --git "a/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2764.1.3.png" "b/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2764.1.3.png" new file mode 100644 index 0000000000000000000000000000000000000000..eb80642d9cb1acd424d47d90c66ac3b843cbb6e9 Binary files /dev/null and "b/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2764.1.3.png" differ diff --git "a/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2764.1.4.png" "b/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2764.1.4.png" new file mode 100644 index 0000000000000000000000000000000000000000..cbb0be53d9f884ba6ec8492592377d7ba4d2d464 Binary files /dev/null and "b/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2764.1.4.png" differ diff --git "a/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2764.1.5.png" "b/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2764.1.5.png" new file mode 100644 index 0000000000000000000000000000000000000000..bec04283fcfe26020f33f462b127cdafe74509e0 Binary files /dev/null and "b/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2764.1.5.png" differ diff --git "a/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2764.1.6.png" "b/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2764.1.6.png" new file mode 100644 index 0000000000000000000000000000000000000000..d5f6efba768c4322fba2abe78d95423cf1d75711 Binary files /dev/null and "b/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2764.1.6.png" differ diff --git "a/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2765.1.1.png" "b/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2765.1.1.png" new file mode 100644 index 0000000000000000000000000000000000000000..e4b0dea90241d3ff37713e6dc96e70b7035e698a Binary files /dev/null and "b/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2765.1.1.png" differ diff --git "a/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2765.2.1.png" "b/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2765.2.1.png" new file mode 100644 index 0000000000000000000000000000000000000000..2146365e4a137d76523720e77ff12d62928271a4 Binary files /dev/null and "b/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2765.2.1.png" differ diff --git "a/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2765.2.2.png" "b/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2765.2.2.png" new file mode 100644 index 0000000000000000000000000000000000000000..b723bbd870fbae8e40b392623d0dfc6ae8e651cf Binary files /dev/null and "b/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2765.2.2.png" differ diff --git "a/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2765.3.1.png" "b/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2765.3.1.png" new file mode 100644 index 0000000000000000000000000000000000000000..96f1b851712fe8177fe30cd8615ebda97ab969e2 Binary files /dev/null and "b/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2765.3.1.png" differ diff --git "a/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2765.3.2.png" "b/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2765.3.2.png" new file mode 100644 index 0000000000000000000000000000000000000000..9ba640e2024fae84a303beb030cfa09ce11fa4a8 Binary files /dev/null and "b/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2765.3.2.png" differ diff --git "a/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2765.3.3.png" "b/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2765.3.3.png" new file mode 100644 index 0000000000000000000000000000000000000000..5ce0207a53f4fc79dfbbe29608677c137671cb44 Binary files /dev/null and "b/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\345\233\276\347\211\207/\345\233\2765.3.3.png" differ diff --git "a/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232.md" "b/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..d8bd78cfa40cc7e878579227d5a115468f89046d --- /dev/null +++ "b/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232/\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232.md" @@ -0,0 +1,213 @@ +## 一、熟悉 MVVM 的基本思想 + +### 1、MVVM概念 + + mvvm是一种设计思想。Model代表数据模型,可以在model中定义数据修改和操作的业务逻辑;view表示ui组件,负责将数据模型转换为ui展现出来,它做的是数据绑定的声明、 指令的声明、 事件绑定的声明。而viewModel是一个同步view和model的对象。在mvvm框架中,view和model之间没有直接的关系,它们是通过viewModel来进行交互的。mvvm不需要手动操作dom,只需要关注业务逻辑就可以了。 + +mvvm和mvc的区别在于:mvvm是数据驱动的,而MVC是dom驱动的。mvvm的优点在于不用操作大量的dom,不需要关注model和view之间的关系,而MVC需要在model发生改变时,需要手动的去更新view。大量操作dom使页面渲染性能降低,使加载速度变慢,影响用户体验。 + +### 2、MVVM的组成部分 + +**(1)模型:**模型是指代表真实状态内容的领域模型(面向对象),或指代表内容的数据访问层(以数据为中心)。 +**(2)视图:**就像在MVC和MVP模式中一样,视图是用户在屏幕上看到的结构、布局和外观(UI)。 +**(3)视图模型:**视图模型是暴露公共属性和命令的视图的抽象。MVVM没有MVC模式的控制器,也没有MVP模式的presenter,有的是一个绑定器。在视图模型中,绑定器在视图和数据绑定器之间进行通信。 +**(4)绑定器:**声明性数据和命令绑定隐含在MVVM模式中。在Microsoft解决方案堆中,绑定器是一种名为XAML的标记语言。绑定器使开发人员免于被迫编写样板式逻辑来同步视图模型和视图。在微软的堆之外实现时,声明性数据绑定技术的出现是实现该模式的一个关键因素。 + +### 3、MVVM的优点 + +- **低耦合性** view 和 model 之间没有直接的关系,通过 viewModel 来完成数据双向绑定。 +- **可复用性** 组件是可以复用的。可以把一些数据逻辑放到一个 viewModel 中,让很多 view 来重用。 +- **独立开发** 开发人员专注于 viewModel ,设计人员专注于view。 +- **可测试性** ViewModel 的存在可以帮助开发者更好地编写测试代码。 + +### 4、mvvm的缺点 + +- bug很难被调试,因为数据双向绑定,所以问题可能在 view 中,也可能在 model 中,要定位原始bug的位置比较难,同时view里面的代码没法调试,也添加了bug定位的难度。 +- 一个大的模块中的 model 可能会很大,长期保存在内存中会影响性能。 +- 对于大型的图形应用程序,视图状态越多, viewModel 的构建和维护的成本都会比较高。 + +### 5、MVVM的理论基础 + + MVVM旨在利用WPF中的数据绑定函数,通过从视图层中几乎删除所有GUI代码(代码隐藏),更好地促进视图层开发与模式其余部分的分离。不需要用户体验(UX)开发人员编写GUI代码,他们可以使用框架标记语言(如XAML),并创建到应用程序开发人员编写和维护的视图模型的数据绑定。角色的分离使得交互设计师可以专注于用户体验需求,而不是对业务逻辑进行编程。这样,应用程序的层次可以在多个工作流中进行开发以提高生产力。即使一个开发人员在整个代码库上工作,视图与模型的适当分离也会更加高效,因为基于最终用户反馈,用户界面通常在开发周期中经常发生变化,而且处于开发周期后期。 + + + +## 二、熟悉 WPF 窗体应用程序创建流程 + +### 1、WPF特点 + +**(1)广泛整合**: 在WPF出现之前,Windows开发人员若需要在普通的2D图形和控件之外再使用3D、视频、语音、富文档视图技术,就不得不学习一些独立技术,这些技术之间通常存在许多不一致,而且是在没有多少内建支持的情况下组合运用它们。而WPF通过统一的编程模型和紧密整合涵盖了所有这些部分,在紧密整合下,各种媒体类型都能组合起来并一起呈现。你可以在不同媒体类型上应用一致的效果,你所学的某个领域中的许多技术可以应用在任何其他领域。 + +**(2)与分辨率无关**: 基于矢量的图形界面,分辨率越高,图形显示越清晰,而不会像普通的图形那样产生锯齿状。 + +**(3)硬件加速**: 虽然WPF是项新技术,但是它是基于Direct3D创建的。特别要注意的是,在WPF应用程序中无论是2D还是3D的图形或者文字内容都会被转换为3D三角形、材质和其他Direct3D对象,并由硬件负责渲染。这意味着WPF应用程序与基于GDI的系统不同,它们可以从硬件加速中获得好处,从而获得更平滑的图像和更好的性能。WPF并不必需高端图形硬件,它也有自己的软件渲染管道。因此它不但可以使用硬件尚不支持的特性,可以高保真地打印屏幕上的任何内容,而且当遇到硬件资源不足(例如只有一块较老的图形卡,甚至是有一块高端图形卡但却没有足够的GPU资源,如缺少显存)时还可以作为备用。 + +**(4)声明式编程**: WPF通过引入XAML(可扩展应用程序标记语言,Extensible ApplicationMarkup Language,读音为Zammel)将声明式编程带入下一个层次。WPF和XAML的组合十分类似于使用HTML定义一个用户界面,但却具有令人吃惊的表示能力。这种表示能力甚至超越了用户界面的范畴,WPF可以将XAML作为一种文档格式、一种3D模型表示,等等。 + +**(5)富创作和定制**(Rich composition and customization): WPF控件具有你从没见过的创作能力。你可以将一些动画按钮放入一个ComboBox控件中,或者将一些视频剪辑放入一个菜单中!虽然这些特别的定制可能听起来十分恐怖,但是你不需要写多少代码(甚至不要任何代码),就能以用控件开发者们从来没有想到过的方式自定义控件(并不像以前控件技术中的自绘(owner-draw))。用同样的方法,WPF使创建完全不同外观的“皮肤”应用程序变得十分简单。 + +**(6)易于部署**: WPF为(使用Windows Installer或ClickOnce)部署传统Windows应用程序或在Web浏览器中宿主应用程序提供了选择。WPF的一个新且有趣的方面是它构建在ClickOnce之上,为与Web浏览器及其导航系统的直接整合提供了支持。WPF虽然有上述那么多闪光点,但是性能问题以及特性集不完整,也是其比较重要的不足,虽然随着技术的发展,特性集一直在完善,但是性能问题却是一个不可忽略的问题,但是由于现阶段硬件技术的飞速发展,相信不久的将来,这个也不再是问题。 + +WPF是跟随.NET FrameWork一起与用户见面的,是在原来的框架基础上面,新增加的组件,同时增加的组件还有WCF,WF和WCS。它主要有两个主题:针对托管代码重新设计以及强调过程式代码和声明式描述相结合。虽然WPF是针对托管代码而言的,但是,WPF确实有一些核心东西是由非托管代码实现的,甚至还提供了一些低层的非托管API来帮助你写自己的图形CODEC(编码解码器)或者位图特效。在.NET Framework的所有新增组件中,常用XAML和XML以透明的和声明式方式向外公开特性。在WPF中,XAML一般是用来表示用户界面的。在Windows Workflow Foundation(WF)中,程序也可以使用XAML来表示与工作流相关的活动。在Windows Communication Foundation(WCF)中,程序会使用XML配置文件把架构协议与应用程序协议分离开来,还可以使用XML消息和协定[简单对象访问协议(SimpleObject Access Protocol,SOAP)和Web服务描述语言(WebServices Description Language,WSDL)]与其他程序进行通信。这一切都是为了让程序员与其他领域的专家一起工作起来更方便。XAML和XML将成为所有各方使用的通用语言(很有可能通过开发工具和特定领域的设计工具)。对于WPF,“领域专家”是图形设计师,他们能够使用设计工具来创建灵活的用户界面,而程序员则可以独立地编写代码。但是程序员/设计师之所以能使用WPF进行合作,不仅仅是因为有通用的XAML语言,还因为人们已努力使WPF API所提供的功能可以通过声明方式进行访问。这给予设计工具巨大的表现力,而不用费心生成过程式代码了。 + +另外需要注意的是,WPF仅在Windows Vista及其以后的版本中,3D 对象有抗锯齿特性;仅在Windows Vista及其以后的版本中,非矩形或者透明窗口才支持硬件加速。当然,WPF控件有不同的默认主题来匹配它们的宿主操作系统。在Windows XP系统中,运行多个WPF或DirectX应用程序可能会让系统出现停顿,这是由于驱动的问题,在Windows Vista及其以后的版本中,有一个新的驱动模型来解决资源争夺的问题。它会对GPU资源进行虚拟化和安排,当多个使用GPU的应用程序同时运行时,它可以让你的系统运行得更顺畅。 + +### 2、几种基本WPF窗体控件 + +- **Button:**按钮控件,可绑定Click事件并进行响应。 +- **Label:**标签控件,可以包含并显示一段任意类型的内容,用以提示。 +- **TextBox:**文本输入框控件,允许用户进行文字输入。 +- **ListBox:**列表控件,提供了一个项目列表(一组数据),可向其中添加或删除数据item。 +- **DataGrid:**用于在可自定义的网格表中显示数据的控件,可定义列属性并绑定实例对象,从而向其添加或删除item。 +- **ComboBox:**下拉列表控件,可以通过单击空间上的箭头显示或隐藏下拉列表,并可绑定选择事件。 + + + +## 三、实验准备 + +1. 安装Windows11 Professional Edition,校园网有正版下载。 +2. 安装Office 中的 Word 和 Excel,安装专业增强版2021 +3. 另必须安装 Visual Studio 2022 Community, 并且安装 git,根据PPT内容安装VS相关扩展。 +4. 申请好 gitee 和github 账号,同时Visual Studio 也注册账号。在github及gitee上各建立一个空仓库。 +5. 学会建立 SSH 连接及推送到远程仓库的方法。 + + + +## 四、实验一步骤 + +### 1、创建WPF窗体应用 + +##### (1)在Visual Studio中创建一个WPF项目 + +(对应图片文件夹中的图4.1.1) + +![image-20221019143615383](.\图片\图4.1.1.png) + +##### (2)编写xaml文件 + +(对应图片文件夹中的图4.1.2) + +![image-20221019143738419](.\图片\图4.1.2.png) + +可以从Toolbox中拖出控件放置MainWindow中,也可以直接在.xaml文件中添加,右键单击控件选择属性,可以更改控件的属性。此处,我们拖出分区、列表框、标签、按钮等基本控件进行实验,如下图。 + +(对应图片文件夹中的图4.1.3) + +![image-20221019144905465](.\图片\图4.1.3.png) + +**(3)编写cs逻辑代码** + +如果要添加逻辑操作,就需在.cs文件中添加逻辑代码,双击MainWindow中的控件便可为该控件绑定点击事件,也可手动操作。 + +(对应图片文件夹中的图4.1.4) + +![image-20221019145312529](.\图片\图4.1.4.png) + +##### (4)运行WPF窗体应用 + +根据步骤(3)中的逻辑代码,可以得出若txtBox中的内容为空,点击button会弹出“我被点击了的消息框”;否则消息框中显示txtBox中的内容。 + +(对应图片文件夹中的图4.1.5) + +![image-20221019145401078](.\图片\图4.1.5.png) + +(对应图片文件夹中的图4.1.6) + +![image-20221019145436142](.\图片\图4.1.6.png) + + + +## 五、选做 + +### 1.Anaconda安装 + +由于在之前的项目中已安装过anaconda,所以这里检测anaconda是否安装成功,并展示相应的版本号。 + +点击“开始” —— “Anaconda3(64-bit)” —— “右键点击Anaconda Prompt” —— 点击“以管理员身份运行”,在Anaconda Prompt中输入conda list,可以查看已经安装的包名和版本号。如果结果可以正常显示,则说明安装成功。 + +(对应图片文件夹中的图5.1.1) + +![image-20221019150314360](.\图片\图5.1.1.png) + +### 2.创建Pytorch环境 + +同的项目需要不同的虚拟环境,可以处理不同版本的项目之间不兼容问题。 + +**(1)进入 `Anaconda prompt` 命令窗口,输入以下内容:** + +```python +conda create -n PyTorch python=3.8 +``` + +**PyTorch**是虚拟环境名字(可以随意设置),**3.8** 是python版本,都可以按自己需求改,一定要指定具体 **python** 版本。 + +(对应图片文件夹中的图5.2.1) + +![image-20221019160434328](.\图片\图5.2.1.png)**创建成功后,输入以下命令:** + +```python +conda info --envs +``` + +**可以看见自己的所有环境** + +(对应图片文件夹中的图5.2.2) + +![image-20221019161027228](.\图片\图5.2.2.png) + +### 3.安装PyTorch + +**进入pytorch官网:**https://pytorch.org/ + +**网页下拉,即可看到下图,官网会自动根据你的电脑,显示的即是你可安装的CUDA版本,并给出安装命令。** + +(对应图片文件夹中的图5.3.1) + +![image-20221019190421663](.\图片\图5.3.1.png) + +**复制官网提供的命令** + +``` +conda install pytorch torchvision torchaudio cudatoolkit=11.6 -c pytorch -c conda-forge +``` + +**打开 Anaconda prompt 命令窗口,进入刚刚所创建的环境(命名是PyTorch)** + +``` +conda activate PyTorch +``` + +**最后输入官网提供的命令,即可下载** + +```python +conda install pytorch torchvision torchaudio cudatoolkit=11.6 -c pytorch -c conda-forge +``` + +(对应图片文件夹中的图5.3.2) + +![image-20221019190402374](.\图片\图5.3.2.png)**测试** + +``` +import torch +import torch vision + +print(torch.__version__) # pytorch版本 +print(torch.version.cuda) # cuda版本 +print(torch.cuda.is_available()) # 查看cuda是否可用 +``` + +打开 Anaconda prompt 命令窗口,激活环境,输入python,进入python开发环境中 + +``` +import torch +torch.cuda.is_available() + +True +``` + +这个地方我试了很多遍,输出的结果都为false,最终找到原因:因为我的电脑没有NVIDIA显卡驱动,所以无法使用GPU环境,只能在CPU的环境下进行实验,训练速度就会较慢,输出为False。 + +(对应图片文件夹中的图5.3.3) + +![image-20221019203410263](.\图片\图5.3.3.png) + diff --git "a/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\345\205\253\345\221\250\344\272\222\345\212\250\347\277\273\350\257\221/\346\235\216\345\255\220\347\220\2332020302111429\347\254\254\345\205\253\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232 -.md" "b/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\345\205\253\345\221\250\344\272\222\345\212\250\347\277\273\350\257\221/\346\235\216\345\255\220\347\220\2332020302111429\347\254\254\345\205\253\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232 -.md" new file mode 100644 index 0000000000000000000000000000000000000000..db3bb5a5c54a4092b9ca5f3f2224a3641f19430e --- /dev/null +++ "b/2020302111429-\346\235\216\345\255\220\347\220\233-\344\275\234\344\270\232+\344\272\222\345\212\250/\344\275\234\344\270\232+\344\272\222\345\212\250/\347\254\254\345\205\253\345\221\250\344\272\222\345\212\250\347\277\273\350\257\221/\346\235\216\345\255\220\347\220\2332020302111429\347\254\254\345\205\253\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232 -.md" @@ -0,0 +1,186 @@ +# **Lab 2-7** 注册表结构和注册表值类型 + + + + +*** + +### 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; +} +``` +# **Lab 2-8** 枚举注册表子键 + + +*** + +这个实验示例使用RegQueryInfoKey、RegEnumKeyEx和RegEnumValue函数枚举指定键的子键。 +传递给每个函数的hKey参数是一个打开键的句柄。此键必须在函数调用之前打开,然后关闭。 + +```cpp +// QueryKey - Enumerates the subkeys of key and its associated values. +// hKey - Key whose subkeys and values are to be enumerated. + +#include +#include +#include + +#define MAX_KEY_LENGTH 255 +#define MAX_VALUE_NAME 16383 + +void QueryKey(HKEY hKey) +{ + TCHAR achKey[MAX_KEY_LENGTH]; // buffer for subkey name + DWORD cbName; // size of name string + TCHAR achClass[MAX_PATH] = TEXT(""); // buffer for class name + DWORD cchClassName = MAX_PATH; // size of class string + DWORD cSubKeys=0; // number of subkeys + DWORD cbMaxSubKey; // longest subkey size + DWORD cchMaxClass; // longest class string + DWORD cValues; // number of values for key + DWORD cchMaxValue; // longest value name + DWORD cbMaxValueData; // longest value data + DWORD cbSecurityDescriptor; // size of security descriptor + FILETIME ftLastWriteTime; // last write time + + DWORD i, retCode; + + TCHAR achValue[MAX_VALUE_NAME]; + DWORD cchValue = MAX_VALUE_NAME; + + // Get the class name and the value count. + retCode = RegQueryInfoKey( + hKey, // key handle + achClass, // buffer for class name + &cchClassName, // size of class string + NULL, // reserved + &cSubKeys, // number of subkeys + &cbMaxSubKey, // longest subkey size + &cchMaxClass, // longest class string + &cValues, // number of values for this key + &cchMaxValue, // longest value name + &cbMaxValueData, // longest value data + &cbSecurityDescriptor, // security descriptor + &ftLastWriteTime); // last write time + + // Enumerate the subkeys, until RegEnumKeyEx fails. + + if (cSubKeys) + { + printf( "\nNumber of subkeys: %d\n", cSubKeys); + + for (i=0; i