Windows 8 的metro风格应用程序的开发编程和Windows phone 7是非常类似的,不过Windows 8对开发语言的支持是比Windows Phone 7强大很多,支持C++,C#和JavaScript,而Windows Phone 7只是支持C#,当然Windows Phone 8出来之后就会支持C#和C++的开发了。下面是Windows 8的编程体系图。
其实Windows 8就是在Windows 7的基础上加上了metro的程序框架,通常所说的Windows 8的开发技术就是指Windows 8的metro程序开发。
1、Windows 8 整个系统分成了Metro style和Desktop两个体系,而WinRT则是全新的Metro应用程序架构的基础所在;
2、WinRT具备了多语言的支持能力,支持C++,C#,VB,JavaScript;
3、WinRT和Win32、.NET是相互独立的API体系;
4、WinRT是专门为触屏体验的全新的API。
下面来看一下一个C++的Windows 8的hello world程序
// // App.xaml.h // App 类的声明。 // #pragma once #include "App.g.h" namespace HelloWorld_C__ { /// <summary> /// 提供特定于应用程序的行为,以补充默认的应用程序类。 /// </summary> ref class App sealed { public: App(); virtual void OnLaunched(Windows::ApplicationModel::Activation::LaunchActivatedEventArgs^ pArgs) override; private: void OnSuspending(Platform::Object^ sender, Windows::ApplicationModel::SuspendingEventArgs^ e); }; }
// // App.xaml.cpp // App 类的实现。 // #include "pch.h" #include "MainPage.xaml.h" using namespace HelloWorld_C__; using namespace Platform; using namespace Windows::ApplicationModel; using namespace Windows::ApplicationModel::Activation; using namespace Windows::Foundation; using namespace Windows::Foundation::Collections; using namespace Windows::UI::Xaml; using namespace Windows::UI::Xaml::Controls; using namespace Windows::UI::Xaml::Controls::Primitives; using namespace Windows::UI::Xaml::Data; using namespace Windows::UI::Xaml::Input; using namespace Windows::UI::Xaml::Interop; using namespace Windows::UI::Xaml::Media; using namespace Windows::UI::Xaml::Navigation; // “空白应用程序”模板在 http://go.microsoft.com/fwlink/?LinkId=234227 上提供 /// <summary> /// 初始化单一实例应用程序对象。这是执行的创作代码的第一行, /// 逻辑上等同于 main() 或 WinMain()。 /// </summary> App::App() { InitializeComponent(); Suspending += ref new SuspendingEventHandler(this, &App::OnSuspending); } /// <summary> /// 在应用程序由最终用户正常启动时进行调用。 /// 当启动应用程序以执行打开特定的文件或显示搜索结果等操作时 /// 将使用其他入口点。 /// </summary> /// <param name="pArgs">Details about the launch request and process.</param> void App::OnLaunched(Windows::ApplicationModel::Activation::LaunchActivatedEventArgs^ pArgs) { // Do not repeat app initialization when already running, just ensure that // the window is active if (pArgs->PreviousExecutionState == ApplicationExecutionState::Running) { Window::Current->Activate(); return; } if (pArgs->PreviousExecutionState == ApplicationExecutionState::Terminated) { //TODO: 从之前挂起的应用程序加载状态 } // 创建一个 Frame 以用作导航上下文并导航至第一页 auto rootFrame = ref new Frame(); if (!rootFrame->Navigate(TypeName(MainPage::typeid))) { throw ref new FailureException("Failed to create initial page"); } // 将 Frame 放置在当前窗口中并确保其处于活动状态 Window::Current->Content = rootFrame; Window::Current->Activate(); } /// <summary> /// 在将要挂起应用程序执行时调用。在不知道应用程序 /// 将被终止还是恢复的情况下保存应用程序状态, /// 并让内存内容保持不变。 /// </summary> /// <param name="sender">挂起的请求的源。</param> /// <param name="e">有关挂起的请求的详细信息。</param> void App::OnSuspending(Object^ sender, SuspendingEventArgs^ e) { (void) sender; // Unused parameter (void) e; // Unused parameter //TODO: 保存应用程序状态并停止任何后台活动 }
App.xaml文件
<Application x:Class="HelloWorld_C__.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:HelloWorld_C__"> <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <!-- Styles that define common aspects of the platform look and feel Required by Visual Studio project and item templates --> <ResourceDictionary Source="Common/StandardStyles.xaml"/> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources> </Application>
MainPage.xaml
<Page x:Class="HelloWorld_C__.MainPage" IsTabStop="false" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:HelloWorld_C__" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}"> <TextBlock x:Name="myTextBlock" TextAlignment="Center" FontSize="60" /> </Grid> </Page>
//MainPage.xaml.h #pragma once #include "MainPage.g.h" namespace HelloWorld_C__ { public ref class MainPage sealed { public: MainPage(); protected: virtual void OnNavigatedTo(Windows::UI::Xaml::Navigation::NavigationEventArgs^ e) override; }; }
//MainPage.xaml.cpp #include "pch.h" #include "MainPage.xaml.h" using namespace HelloWorld_C__; using namespace Platform; using namespace Windows::Foundation; using namespace Windows::Foundation::Collections; using namespace Windows::UI::Xaml; using namespace Windows::UI::Xaml::Controls; using namespace Windows::UI::Xaml::Controls::Primitives; using namespace Windows::UI::Xaml::Data; using namespace Windows::UI::Xaml::Input; using namespace Windows::UI::Xaml::Media; using namespace Windows::UI::Xaml::Navigation; MainPage::MainPage() { InitializeComponent(); this->myTextBlock->Text="Hello World"; } void MainPage::OnNavigatedTo(NavigationEventArgs^ e) { (void) e; // Unused parameter }
再来看看项目的结构
App.xaml:应用程序对象和Wp7里面的一样,App.xaml.h, App.xaml.cpp:Application相关事件和处理。
MainPage.xaml.h, MainPage.xaml.cpp:包含默认页面UI的event和基本逻辑,但不包含MainPage.xaml里UI生成的代码。
Package.appxmanifest:定义App相关的基本信息。包括App名字,描述,logo等。
pch.h, pch.cpp: 预编译文件。
Assets文件里面存放程序的logo等相关的图片,以前Wp7是直接放到外面的根目录下的。
运行的效果