zoukankan      html  css  js  c++  java
  • windows mobile窗口之间传递数据的方法

    在windows mobile上设计UI的时候,经常会碰到多个窗口的情况。有时候,我们需要将一个窗口中的用户输入信息反应到另一个窗口中去,这就涉及到窗口之间的数据传递问题。下面就分native和managed这两种方式来讲讲这个窗口之间数据传递的方法。

      1. Native

     这个方法是当时我在看MFC时学到的,当时应用的场景是这样的。我建立了一个基于对话框的应用程序(Dialog-based),一些参数设置需要另外一个对话框来呈现给用户,在用户输入完之后,就需要将数据传递给主对话框。当时我是这么实现的:

      a) 在 stdafx.h头文件中,加入用户定义消息和传递的数据结构,如:

    #define WM_LOCALADDR_SET   WM_USER+21 //本地STC地址设置消息定义

    typedef struct tagADDRESS {

      int nAddr0;

         int nAddr1;

         int nAddr2;

         int nAddr3;

    } ADDRESS;

      b) 在地址设置对话框的实现文件中,加入“OK”按钮的消息处理函数:

    void CLocalAddrSet::OnButtonApply()

    {

             // TODO: Add your control notification handler code here

             UpdateData (TRUE);

             ADDRESS rp;

             rp.nAddr0 = m_intLocalAddr0;

             rp.nAddr1 = m_intLocalAddr1;

             rp.nAddr2 = m_intLocalAddr2;

            rp.nAddr3 = m_intLocalAddr3;

             //发送消息

             AfxGetMainWnd ()->SendMessage (WM_LOCALADDR_SET, 0, (LPARAM) &rp);

           }

    c) 在主对话框的头文件中,加入消息映射函数声明:

    afx_msg LRESULT LocalAddrSetPrco(WPARAM wParam, LPARAM lParam); //本地设备地址设置消息映射函数声明

      d) 在主对话框文件(.cpp)中,加入消息映射和对应的实现函数:

    ON_MESSAGE(WM_LOCALADDR_SET,LocalAddrSetPrco)    //本地设备地址设置处理映射

    //本地地址设置

    LRESULT CSlaverDectorDlg::LocalAddrSetPrco(WPARAM wParam, LPARAM lParam)

    {

        ADDRESS* prp = (ADDRESS*) lParam;

             int i;

             int HEC=0;//头校验

         ……….

    }

      2. Managed

     Managed方式中,有三种方法,分别是:使用构造器传递数据、通过属性传递和通过事件(参数)传递。具体可以参考《windows mobile 平台应用与开发》7.2节。

     a) 使用构造器传递数据

       使用构造器可以向一个新窗体传递初始值,如在主窗体Form1的基础上创建Form2,我们就可以在Form2的构造函数中,接收一个初始的值,并显示在对应的label中,代码如下:

             public Form2(string defaultUser)

             {

                  InitializeComponent();

     

                  m_txtUserName.Text = defaultUser;

             }

       在Form1中,我们可以使用如下的方法来创建Form2:

                  Form2 f = new Form2("guest");

                  DialogResult r = f.ShowDialog();

       这样就把guest信息传递到了Form2中。

      b) 通过属性传递

     向Form2添加属性,通过为属性赋值和读取属性值来进行数据传递。首先为Form2添加公共属性,代码如下:

           #region 使用属性

             public string UserName

             {

                  get

                  {

                       return m_txtUserName.Text;

                  }

                  set

                  {

                       if(value == null)

                           m_txtUserName.Text = String.Empty;

                       else

                           m_txtUserName.Text = value;

                  }

             }

             #endregion

       然后在Form1中,显示Form2之前,为其属性赋值,并且在对话框关闭之后,读取该属性的值,从而完成数据的传递。代码如下:

                 Form2 f = new Form2("guest");

     

                  f.UserName = m_userName;

     

                  DialogResult r = f.ShowDialog();

                  if(r == DialogResult.OK)

                  {

                       m_userName = f.UserName;

                       m_lblMessage.Text = String.Format("Hello, {0}!", f.UserName);

                  }

                  else

                       m_lblMessage.Text = "Please Login";

     c) 通过事件(参数)传递

       首先,给Form2添加事件参数类型和事件处理委托的定义,代码如下:

             #region 使用事件

             public event LoginEventHandler Login;

     

             public class LoginEventArgs : EventArgs

             {

                  string m_userName;

     

                  public string UserName

                  {

                       get

                       {

                           return m_userName;

                       }

                       set

                       {

                           if(value != null)

                                m_userName = value;

                           else

                                m_userName = String.Empty;

                       }

                  }

     

                  public LoginEventArgs(string userName)

                  {

                       this.UserName = userName;

                  }

             }

     

             public delegate void LoginEventHandler(object sender, LoginEventArgs e);

             #endregion

     然后,在Form2中合适的地方,即用户希望触发数据传递时,触发这个事件,代码如下:

                  if(this.Login != null)

                       this.Login(this, new LoginEventArgs(m_txtUserName.Text));

     

                  this.DialogResult = DialogResult.OK;

       同样,在Form1中,除了需要创建并显示Form2之外,还要为Form2的对象添加一个事件处理方法,代码如下:

                  Form2 f = new Form2("guest");

     

                  f.Login += new Form2.LoginEventHandler(f_Login);

                  f.ShowDialog();

     上面讲述的三种方法,效果都是一样的,如下图所示:

    windows mobile窗口之间传递数据的方法

  • 相关阅读:
    cmd命令之set详解
    微信公众号之推送消息
    总结js(1)
    本地文件夹变远程仓库并且提交Github
    npm之使用淘宝源
    页面倒计时返回
    在线sass编译器
    js条件语句之职责链数组
    【轉】靜
    css 實現微信聊天類似的氣泡
  • 原文地址:https://www.cnblogs.com/xyzlmn/p/3168362.html
Copyright © 2011-2022 走看看