Metro C++ 初体验 第一周

原创 2012年03月23日 16:37:01

闲话少说,第一周几个问题:

1 Metro下创建无焦点空间:

设置属性 IsHitTestVisible=false;

2 Metro C++加载DLL

微软专门为Metro C++ 开放了一个新API : LoadPackageLiberary();

之前必须将要dll文件添加到工程中(这个不用多说废话了吧,右键点项目名——添加现有项),右键点dll文件——属性,内容选择 是

然后按照原来Win32方法LoadPackageLiberary,GetProcessAddress即可

3 Metro读写文件

Metro不是在随便位置都可以读写文件的,只开放了相应的读写位置。我只介绍在文档库读写文件的方法。

最重要的是必须在package manifest中事先声明。每个项目管理器中都有一个manifest文件,双击打开,点击功能按钮,在功能列表中列出了你的程序需要提供的功能,也隐含着你需要被提供访问权限的位置,勾选你需要的权限很重要,否则在访问你不具备权限的位置时将引发异常。如果是想要在文档库中进行文件操作,还要事先声明添加一个文件关联的声明,在该声明中添加你需要访问的文件类型

顺便多说一句,如果你申请了过多你不需要的权限,估计将来程序上传到App Store可能会出问题。

4 Metro只允许在主线程做UI操作

当多线程编程时,不要在自己创建的线程中进行Ui操作,那样将毫无用处。所以,要想办法通知主线程去做这件事。这里特别值得注意的是ThreadPoolTimer这个定时器的机制与Win32不同,它应该是采用的中断机制,因此在中断处理程序中也不能操作UI。

5 使用CoreDispatcher进行线程间通信

紧接上一条,如果想在线程间通信,直接使用事件可能会出问题,因为你无法保证该事件处理函数是在主线程还是子线程中执行。因此习惯了Windows Message机制的朋友,可以告诉你们一个非常振奋人心的消息:使用CoreDispatcher可以达到类似的效果,具体的方法还需要你们自己去学习,我简单说一句,你首先获得当前线程的CoreDispatcher:

m_CoreDispatcher=Windows::UI::Core::CoreWindow::GetForCurrentThread()->Dispatcher,然后使用CoreDispatcher的Invoke或者InvokeAsyn方法向当前线程发送事件,保证该事件一定是主线程处理。

具体方法,还是去学MSDN吧,我只提供一个思路。

6 同步和异步调用:

凡是名字中带有Asyn字样的方法都是可以进行异步操作方法,在C++中使用这种方法需要Concurrency空间中的task类。task类是一个模板类,提供两个重要的方法异步的then()和同步的get()。将异步方法的返回值强制转换为一个以该返回值类型为模板的task类实例,然后调用then或者get方法,才会真正执行该方法。具体的使用方法见MSDN。

这里值得一提的是:

1 then比较可靠,但是注意如果使用lamda表达式作为参数传递给then必须注意,如果要传递一个临时变量进入lamda表达式内部,必须小心它很可能在lamda表达式还未执行完成时已经失效(因为是异步执行,该临时变量作用域属于表达式外部)。

2get非常不靠谱:

我至今不知道为什么在执行get时经常会无故抛出异常,主要是std::exception异常,不过好在该异常不属于不可恢复异常,通常你可以在catch中对你的程序进行补救。因为get是连续执行一系列操作,可能前面几个操作执行成功而最后得到返回值时失败,这时你可以尝试自己执行得到返回值的操作。我有一个小窍门对待get抛出的异常,但是不值得推广,因为至今我并办法证实这种方法是否会造成恶劣影响。

我会使用while不断执行get操作,并且捕获std::exception异常和Platform::Exception^异常,直到成功为止(当然必须是针对get抛出的莫名奇妙的异常,如果时由于你代码导致的异常,必须处理),至今为止我还未发生死循环的情况,不过请慎重对待。

7 Lamda表达式

这个东西在C++中比C#中复杂的多,它的一般形式是  [](Param0 param0,Param1 param1,...){}用它来取代一个事件处理函数

delegate void MyEventHandler(Param0 param0,Param1 param1);

void Func(Param0 param0,Param1 param1,...);

ref new MyEventHandler(nullptr,Func);

 

这其中还有许多变化,由于lamda表达式是非托管的,要想使用托管类实例的成员,就要在[]中将该实例的指针传入。同时还可以在[]中传入外部变量,效果等同于在函数内部使用全局变量。

 

这一周收获非常多,先说这么多吧,脑子有点乱,想起来下次再谈。

 

相关文章推荐

C++程序设计-第七周上机实践项目

回到课程主页,链接:C++程序设计课程主页-2012级  本周教学内容:第1章   C++的初步知识。通过两个典型的程序(求大值和输出星号图),获得分支和循环结构程序设计的直接体验,使学生能够通过模仿...

Metro C++ 初体验 第二周

闲话少说,书归正传: 1 Metro C++程序的入口点:     C++开发的Metro程序有两种架构:Windows RT和Direct程序,这两种程序可以完美的进行交互,用一个不恰当的例子形...

[转]Windows 8 Metro app开发初体验

http://www.devdiv.com/_%E8%BD%AC_Windows_8_Metro_app%E5%BC%80%E5%8F%91%E5%88%9D%E4%BD%93%E9%AA%8C-th...
  • li_hai
  • li_hai
  • 2012年08月15日 20:54
  • 1438

C++访问sqlite3的初体验

Sqlite确实是一个比较好的本地数据库,从接触它的时候就喜欢上了它,它可以在很多情况下简化应用。不过以前都是在Java里面使用,或者Linux C下使用的,现在有个项目(C++)可能我会用到sqli...

boost c++ library on linux 初体验

最近开始学习boost c++ library,并且打算用业余的时间长期坚持下去。再一个就是通过学习boost库练习在linux下面进行c++编程。今天记录一下boost的入门吧。 首先,入门最好的...
  • Garfier
  • Garfier
  • 2012年07月22日 22:42
  • 4741

C++ Profiler工具之初体验

原文: http://www.cnblogs.com/lenolix/archive/2010/12/13/1904868.html概要:本文同期调研了google profile工具以及其他常用pr...

C++11多线程初体验

在C++11标准之前,使用C++编写多线程程序要么需要第三方的API如pthread,要么需要依赖运行平台提供的API,使用起来很不方便。而C++11提供了平台无关的语言级别的支持,这极大得方便了我们...

C++文件操作初体验----将数据写入/输出到文件中

/* *程序的版权和版本声明部分: *Copyright(c)2013,烟台大学计算机学院学生 *All rights reserved. *文件名称: *作者:zhaojiaxiang *完成日期:...

学习C++模板,初体验

最近,看了很多码神级人物的代码,发现其代码很炫酷,尤其对模板的使用,作为小码农,感觉已经落伍了,所以应该发奋图强,好好学习和掌握模板这个东西。...

Windows8开发指南(16)开发基于Windows8的第一个metro界面C++程序

微软公布了Windows8开发人员预览版,http://msdn.microsoft.com/en-us/windows/home?ocid=ban-f-cn-dca-Sep-Win8Build  大...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Metro C++ 初体验 第一周
举报原因:
原因补充:

(最多只允许输入30个字)