zoukankan      html  css  js  c++  java
  • WinCE7.0 下 Silverlight(XAML) 类型的应用启动逻辑

    WinCE7.0 下 Silverlight(XAML) 类型的应用启动顺序,如下堆栈所示:

    SWEClock.exe!MainPage::OnLoaded(IXRDependencyObject* pRoot = 0x00047840) 行: 37, 字节偏移量: 0x24 C++  
    SWEClock.exe!XRCustomUserControlImpl<MainPage,IXRCustomUserControl>::Create(IXRDependencyObject* pExistingDependencyObject = 0x0004782c, IXRDependencyObject** ppNewDp = 0x0003fbf4) 行: 568, 字节偏移量: 0x188 C++  
     0x40158c30   
     0x40158e98   
     0x4015c850   
    >SWEClock.exe!IXRApplication::CreateObject<IXRCustomUserControl>(_GUID& riid = {...}, IXRCustomUserControl** ppObject = 0x0003fcb0) 行: 3112, 字节偏移量: 0x3c   C++  
    SWEClock.exe!App::CreateHost(XRWindowCreateParams* pCreateParams = 0x0003fd00) 行: 112, 字节偏移量: 0x54  C++  
    SWEClock.exe!App::Initialize(HINSTANCE__* hInstance = 0x064c005e) 行: 146, 字节偏移量: 0x148  C++  
    SWEClock.exe!WinMain(HINSTANCE__* hInstance = 0x064c005e, HINSTANCE__* __formal = 0x00000000, wchar_t* __formal = 0x0003fe88, int __formal = 0x00000005) 行: 32, 字节偏移量: 0x6c C++  
    SWEClock.exe!WinMainCRTStartupHelpANCE__* hInstaner(HINSTce = 0x00000054, HINSTANCE__* hInstancePrev = 0x00000000, unsigned short* lpszCmdLine = 0x00000000, int nCmdShow = 0x00070005) 行: 71, 字节偏移量: 0x40  C  

    调用 XAML 解析库后,再通过 OnLoaded() 函数返回应用代码。这样的话,OnLoaded() 函数名是指定的,不能修改。
    IXRApplication::CreateObject 定义在 x:Program FilesWindows CE ToolsSDKsHSW_T9_SDKIncludeArmv4ixamlruntime.h 中
    XRCustomUserControlImpl<MainPage,IXRCustomUserControl>::Create 定义在 x:Program FilesWindows CE ToolsSDKsHSW_T9_SDKIncludeArmv4ixrcustomcontrol.h 中

    在 MainPage::OnLoaded() 中开始正式解析 XAML 文件,按 XAML 文件的内容,定义相应的元素变量。XAML 解析库具体支持哪些元素,可以查看头文件:x:Program FilesWindows CE ToolsSDKsHSW_T9_SDKIncludeArmv4ixrptr.h 的最后,类似于如下的定义:

     1 #define XR_SMARTPTR(x) typedef XRPtr< x > x##Ptr  
     2   
     3 XR_SMARTPTR(IXRArcSegment);  
     4 XR_SMARTPTR(IXRBeginStoryboard);  
     5 XR_SMARTPTR(IXRBezierSegment);  
     6 XR_SMARTPTR(IXRBitmapCache);  
     7 XR_SMARTPTR(IXRBitmapImage);  
     8 XR_SMARTPTR(IXRBorder);  
     9 XR_SMARTPTR(IXRBrush);  
    10 XR_SMARTPTR(IXRCanvas);  

    还可以为元素定义事件,如:加载、点击等,一般窗体在加载时需要特殊处理的,会定义加载事件,以事件处理函数中完成必要的准备工作。
    (1) Layout 加载
    例如: Canvas 的 Root Element,则定义如下: IXRCanvasPtr m_pLayoutRoot;

     1 FindName(L"LayoutRoot", &m_pLayoutRoot);  
     2 if (m_pLayoutRoot)  
     3 {  
     4     m_pLayoutRoot->AddLoadedEventHandler(CreateDelegate(this, &MainPage::Canvas_Loaded));  
     5 }  
     6   
     7 // ============================================================================  
     8 //  Canvas_Loaded  
     9 //   
    10 //  Description: Event handler implementation  
    11 //  Leo 与 Canvas 的 Loaded="Canvas_Loaded" 没有必然的联系,因为修改为 Loaded="Canvas_Loaded_2" 程序还可正常运行  
    12 //  Parameters:  pSender - The dependency object that raised the click event.  
    13 //               pArgs - Event specific arguments.  
    14 // ============================================================================  
    15 HRESULT MainPage::Canvas_Loaded (IXRDependencyObject* pSender, XRRoutedEventArgs* pArgs)  
    16 {  
    17     ......  
    18 }  

    (2) 新增加按键处理的方法:
    我们可以通过在 Expression Blend(XAML) 中或直接编辑 XAML 时指定的 Name 来访问我们的按钮。使用定义在 x:Program FilesWindows CE ToolsSDKsHSW_T9_SDKIncludeArmv4ixrptr.h 文件中的 XAML 元素类型,具体如下:

    1 IXRButtonBasePtr MyBtn;  
    2 if (FAILED(retCode=root->FindName(TEXT("MyButton"), &MyBtn)))  
    3     return -1;  

    为了能够收到用户点击按钮时的通知,我们需要提供一个委托(delegate)。使用C#开发的朋友对委托的概念应该比较清楚,在这里一个委托即是一个指向具有指定原型(prototype)的C++实例的成员的指针。 
    我们可以在我们的cpp文件中声明一个简单的C++类,并在其中实现按钮点击事件的委托:

    1 class BtnEventHandler  
    2 {  
    3 public:  
    4     HRESULT OnClick(IXRDependencyObject* source,XRMouseButtonEventArgs* args)  
    5     {  
    6         MessageBox(NULL,TEXT("Click!"),TEXT("Silverlight for Windows Embedded test"),MB_OK);  
    7         return S_OK;  
    8     }  
    9 };  

    当按钮被点击时我们的事件处理器(event handler)仅仅是简单的显示一个消息框。
    正如你看到的事件处理器(event handler)有2个参数:一个指向产生事件(我们的按钮)的对象的指针和一个包含事件参数的结构体的指针。 
    为了连接事件处理器(event handler)和按钮,我们需要创建一个委托对象:

    1 BtnEventHandler handler;  
    2 IXRDelegate<XRMouseButtonEventArgs>* clickDelegate;  
    3 if (FAILED(retCode=CreateDelegate(&handler,&BtnEventHandler::OnClick,&clickDelegate)))  
    4     return -1;  
    5 if (FAILED(retCode=MyBtn->AddClickEventHandler(clickDelegate)))  
    6     return -1;  

    事件处理器已经连上我们的按钮了,现在只需要等待用户去点击我们漂亮的按钮并显示我们的UI。
    指向委托对象的指针并不是一个智能指针(smart pointer),我们需要显式释放它:

    1 clickDelegate->Release();  
  • 相关阅读:
    1006 Sign In and Sign Out
    1005 Spell It Right
    1004 Counting Leaves
    1003 Emergency
    PAT甲级练习题1001、1002
    翻转字符串.
    JavaScript实现弹幕效果
    SSI技术
    c#事务处理(sqlTransaction)
    Fiddler查看接口响应时间
  • 原文地址:https://www.cnblogs.com/91program/p/5201438.html
Copyright © 2011-2022 走看看