隨着Windows Mobile的没落,WINCE市场也很快萎缩,使得我这样的老牌WINCE程序员也日暮西山,几近无处解决一日三餐。好在天无绝人之路,终于有机会做Win8 Metro界面的开发。现将开过过程中遇到的问题、体会心得一并记录,以便日后查询及供初学者参照。
Metro的一些基本概念在这就不再赘述,作为一名工程师我喜欢直接开始写代码而不是来一大堆无关的理论。MSDN中有这方面的入门帖,可以先他细读一下,并将其中的例子抄写并调试,以加强印象。例子可以参见如下网页及其相关的网页:
http://msdn.microsoft.com/en-us/library/windows/apps/hh465045.aspx
Metro的开发过程与WIN32的界面开发过程有许多相同之处。归根结蒂它也没有摆脱WIN32中窗口的概念,我觉得可以理解为Metro中的XAML相当于WIN32中的资源文件,只是这种资源文件比RC文件功能更为强大。微软本身也对Metro程序做了很多限制,所以使用Metro开发界面很快,做出来的效果也很好,但同时做某些事情时也很费劲(例如直接操作某个驱动),而某些事情可能压根就做不了。
以下就列举一些有别于WIN32之处:
1, 绘图
相信用过WIN32界面开发的人都对Line,LineTo等函数不会陌生,但在Metro中,这些函数无法使用,我们需要将要绘图的窗口设置成Canvas,再不断的生成Line对象,将其Append到要绘制的窗口中。代码如下:
XAML:
<Border BorderBrush="Black" BorderThickness="1" Height="200" Width="400" >
<Canvas x:Name="CPUInfo"/>
</Border>
C++:
其中CPUInfo即要绘图的Canvas类型的窗口:
//Line must be created evey times, otherwise, the olde line will disappear.
line = ref new Windows::UI::Xaml::Shapes::Line( );
line->Stroke = m_pLineBrush;
line->StrokeThickness = 1;
line->X1=lastPoint.X;
line->Y1=lastPoint.Y;
line->X2=lastPoint.X+1;
line->Y2=y;
CPUInfo->Children->Append( line );
以下记录一些常用控件的用法:
1)ToggleButton:
给ToggleButton中的IsChecked元素赋值(true,false)就可以改变其Checked状态,但读值要使用IsCheck中的Value元素,因IsCheck也是一个Class.
2)当大于一个Button的Click事件共用一个函数时的处理方法:
以ToggleButton为例,将sender转化成ToggleButton类型,然后就可以和XAML文件中声名的各个Button直接比较,以确定是哪个Button引发的事件。
从而避免写了N多消息处理函数的现象,可以使代码整洁一些。
void MainPage::OnButtoClicked(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
ToggleButton ^ pSender = ( ToggleButton ^)sender;
if( PowerButton== pSender )
{
}else
{
}
}