在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. 浅谈Java简单实现的生产者与消费者问题

    一.面对生产者和消费者的问题,首先我们得明白几点: 生产者:生产数据:消费者:消费数据.消费者在没有数据可供消费的情况下,不能消费:生产者在原数据没有被消费掉的情况下,不能生产新数据.假设,数据空间只 ...

  2. Unity---资源管理中不同资源的路径获取方式

    1.首先需要先了解两个知识点: Unity内置的文件路径获取方式.windows的Directory.GetFiles文件获取方式:   1>Unity内置的文件路径获取方式,一下是官方解释:h ...

  3. R语言函数总结(转)

    R语言特征 对大小写敏感 通常,数字,字母,. 和 _都是允许的(在一些国家还包括重音字母).不过,一个命名必须以 . 或者字母开头,并且如果以 . 开头,第二个字符不允许是数字. 基本命令要么是表达 ...

  4. Ubuntu 16.04 构建 Headless VNC 服务器

    终于放弃 Vino 了, 稳定性太低了. 而且,拔了显示器之后,总出现分辨率不对的问题. 于是,构建了一个 xfce4 + tightvnc 的 解决方案. 1) 把Vino相关的自启动都关了. (v ...

  5. HTML第八章总结

    Expanding your vocabulary 总述 在上一章节介绍了 CSS 的基础之后,这一章节更加具体地展开关于 CSS 的各种 rules 能够达成的效果.比如 字体:font-famil ...

  6. java ----> 类转换异常

    com.rr.domain.Department_$$_javassist_5 cannot be cast to javassist.util.proxy.Proxy 两个原因: 1.懒加载 在we ...

  7. String的intern()方法和java关键字、保留字

    String s1 = new StringBuilder("hel").append("lo").toString(); //hello System.out ...

  8. 使用validateXxx()方法进行输入校验 --Struts2框架

    1.本例是在使用validate()方法进行输入校验 --Struts2框架的基础上接着做的,上一篇使用validate()方法进行输入校验时会对当前Action中的所有方法有效,由于Struts2框 ...

  9. MyEclipse下自定义(支持html5的)JSP模板--JSP

    需求:由于某些Mclipse版本发行的比较早,所以在有些版本(比如Mclipse2014,至于其他版本博主不知能不能创建html5格式的JSP页面)里创建JSP页面时html部分不是html5格式的. ...

  10. 2018JavaScript状态调查:5个重要的思考( import takeaways) (摘译)

    英文原文  (内有视频). 以下是翻译和摘录. 最近JS状态调查结构出来了,如果你关心网页开发,你会关心这些结果. 本文探索5个takeaways并总结这些结论. 1. JavaScript Had ...