隨着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
{
}
}