在Visual Studio 中新建一个Visual C++的 Windows应用商店的Windows运行时组件项目,并将项目命名为FilePickerComponent。然后在项目的解决方案资源管理器窗口中右键点击项目图标,在弹出的菜单栏中选中"添加", 并在"添加"的子菜单栏中选择"新建项",在出现的"添加新项"窗口中选中"头文件(.h)",添加名为"FilePicker.h"的头文件。然后使用同样的方法在"添加新项"窗口中选中"C++ 文件(.cpp)",并添加名为"FilePicker.cpp"的源文件。

接下来打开FilePicker.h头文件,并添加如下的代码:

#pragma once

namespace FilePickerComponent

{

    public ref class FilePicker sealed

    {

    public:

        //构造函数

        FilePicker();

    private:

        //声明成员变量openPicker

        Windows::Storage::Pickers::FileOpenPicker^ openPicker;

    public:

        //声明属性FileContent

        property Platform::String^ FileContent;

    public:

        //读取文件

        void ReadFile();

    };

}

在上面的代码中,定义了一个FilePicker类,在这个类中使用public关键字声明一个公有的构造函数FilePicker。接着使用private关键字声明一个FileOpenPicker类型的私有成员变量openPicker,并使用public关键字声明一个String类型的公有属性FileContent。最后使用public关键字声明一个公有的ReadFile函数,用于读取文件。

定义了FilePicker类以后,接下来打开FilePicker.cpp源文件,添加如下的代码:

// FilePicker.cpp

#include "pch.h"

#include "FilePicker.h"

#include "ppltasks.h"

using namespace Windows::Foundation;

using namespace FilePickerComponent;

using namespace Platform;

using namespace Windows::Storage;

using namespace Windows::Storage::Streams;

using namespace Windows::Storage::Pickers;

using namespace Concurrency;

在上面的代码中,使用include关键字引用头文件pch.h、FilePicker.h和ppltasks.h,并使用using指令引用命名空间Windows::Foundation、FilePickerComponent、Platform、Windows::Storage、Windows::Storage::Streams、Windows::Storage::Pickers和Concurrency。

引用了上面的头文件和命名空间以后,接下来在FilePicker.cpp源文件中添加FilePicker构造函数的实现代码,此构造函数中并不实现任何的功能,具体代码如下所示:

FilePicker::FilePicker()

{

}

添加了FilePicker构造函数的实现代码以后,接下来在FilePicker.cpp源文件中添加ReadFile函数的实现代码,具体代码如下所示:

//读取文件

void FilePickerComponent::FilePicker::ReadFile()

{

    //创建文件打开选择器

    openPicker =ref new FileOpenPicker();

    //设置视图模式

    openPicker->ViewMode = PickerViewMode::List;

    //设置访问的初始位置

    openPicker->SuggestedStartLocation = PickerLocationId:: Desktop;

    //设置显示的文件类型,允许读取的文件类型

    openPicker->FileTypeFilter->Append(".txt");

    openPicker->FileTypeFilter->Append(".BAK");

    //显示文件选择器,选择文件

    create_task(openPicker->PickSingleFileAsync()).then([this](StorageFile^ file)

    {

        //读取文件内容

        return FileIO::ReadTextAsync(file,UnicodeEncoding::Utf8);

    }).then([this](task<String^> fileTask){

        //将文本内容赋值给FileContent

        FileContent = fileTask.get();

    });

}

在上面的代码中,首先创建一个FileOpenPicker类的对象openPicker,并将PickerViewMode枚举中的枚举成员List赋值给openPicker对象的ViewMode属性,设置文件打开选取器的视图模式为列表模式。接着将PickerLocationId枚举中的枚举成员Desktop赋值给openPicker对象的SuggestedStartLocation属性,设置文件打开选取器的初始位置为桌面。然后使用openPicker对象的FileTypeFilter属性得到文件打开选取器显示的文件类型集合,并调用Append函数将文件类型".txt"和".BAK"添加到这个集合中。

接下来调用openPicker对象的PickSingleFileAsync函数选取单个文件,并得到一个StorageFile类型的对象file。然后将file对象作为参数传递给FileIO类的ReadTextAsync函数,并以Utf8编码格式来读取所选择的文件,得到一个task<String^>类型的对象fileTask。最后调用fileTask对象的get函数得到文件中的内容,并赋值给FileContent属性。

Win系列:VC++编写自定义组件的更多相关文章

  1. Win10系列:VC++调用自定义组件1

    通过20.9.1小节中的代码和步骤编写了一个名为"FilePickerComponent"的WinRT组件,接下来将在上一小节所新建的项目基础上,继续介绍如何在不同的语言所编写的应 ...

  2. Win10系列:VC++调用自定义组件3

    (3)C++/CX调用WinRT组件 在解决方案资源管理器中右键点击解决方案图标,选择添加一个Visual C++的Windows应用商店的空白应用程序项目,并命名为FileCPP.接着右键点击Fil ...

  3. Win10系列:VC++调用自定义组件2

    (2)C#调用WinRT组件 在解决方案资源管理器中右键点击解决方案图标,选择添加一个Visual C#的Windows应用商店的空白应用程序项目,并命名为FileCS.接着右键点击FileCS项目的 ...

  4. 小程序 模态对话框自定义组件(modal)

    1. 概述 1.1 说明 小程序中使用wx.showModal(Object object)打开一个模态对话框,但是目前小程序所提供的modal中的内容显示比较死板,不能够完全满足工作中所遇到的功能信 ...

  5. 小程序之自定义组件 ---- 列表goodsList

    教程请查看小程序开发文档:https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/ 自定义组件:自定义组 ...

  6. flex 自定义组件的编写

    使用flex也很久了,也改过别人写的flex自定义组件,但是就是没有系统的研究下flex组件的编写步骤,和要注意的东西,在这里我参照一本书中的例子,好好的理解下,也为了巩固下自己对flex的理解! 1 ...

  7. React Native实战系列教程之自定义原生UI组件和VideoView视频播放器开发

    React Native实战系列教程之自定义原生UI组件和VideoView视频播放器开发   2016/09/23 |  React Native技术文章 |  Sky丶清|  4 条评论 |  1 ...

  8. Android自定义组件系列【7】——进阶实践(4)

    上一篇<Android自定义组件系列[6]--进阶实践(3)>中补充了关于Android中事件分发的过程知识,这一篇我们接着来分析任老师的<可下拉的PinnedHeaderExpan ...

  9. Android自定义组件系列【6】——进阶实践(3)

    上一篇<Android自定义组件系列[5]--进阶实践(2)>继续对任老师的<可下拉的PinnedHeaderExpandableListView的实现>进行了分析,这一篇计划 ...

随机推荐

  1. C++ Web 编程

    C++ Web 编程 什么是 CGI? 公共网关接口(CGI),是一套标准,定义了信息是如何在 Web 服务器和客户端脚本之间进行交换的. CGI 规范目前是由 NCSA 维护的,NCSA 定义 CG ...

  2. Java——文件及目录File操作

    API file.listFiles(); //列出目录下所有文件及子目录fileList[i].isFile() //判断是否为文件 fileList[i].isDirectory() //判断是否 ...

  3. 力扣(LeetCode)453. 最小移动次数使数组元素相等

    给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移动次数.每次移动可以使 n - 1 个元素增加 1. 示例: 输入: [1,2,3] 输出: 3 解释: 只需要3次移动(注意每次移动 ...

  4. MySQL学习(八)

    连接查询 1 集合的特点:无序性,唯一性 集合的运算:求并集,求交集,求笛卡尔积 表和集合的关系 一张表就是一个集合,每一行就是一个元素 疑问:集合不能重复,但我有可能两行数据完全一样 答:mysql ...

  5. 第 6 章 存储 - 042 - 用 volume container 共享数据

    volume container volume container 是专门为其他容器提供 volume 的容器.它提供的卷可以是 bind mount,也可以是 docker managed volu ...

  6. LeetCode--443--压缩字符串(未看)

    问题描述: 给定一组字符,使用原地算法将其压缩. 压缩后的长度必须始终小于或等于原数组长度. 数组的每个元素应该是长度为1 的字符(不是 int 整数类型). 在完成原地修改输入数组后,返回数组的新长 ...

  7. android -------- Data Binding的使用 ( 四 )ListView

    今天来说说DataBinding在列表ListView中的使用 主要分为两种,1: 基本的实体类  2:Observable 定义字段 listView布局文件 <?xml version=&q ...

  8. Elasticsearch SQL

    es sql是一个X-pack组件 ,允许对es执行类似sql的查询,可以将Elasticsearch SQL理解为一个编译器,既能理解es,又能理解sql.可以通过利用es,实施大规模实时读取和处理 ...

  9. Jamie and Tree CodeForces - 916E (换根)

    大意: n节点树, 每个点有权值, 三种操作: 1,换根. 2, lca(u,v)的子树权值全部增加x. 3, 查询子树权值和. 先不考虑换根, 考虑子树x加v的贡献 (1)对fa[x]到根的树链贡献 ...

  10. python记录_day13 内置函数

    详细链接:https://www.processon.com/mindmap/5bdbc4bee4b0878bf42089fb