欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

.Net开发WinCE应用程序杂碎(转)

程序员文章站 2022-06-02 11:14:09
...
VS.NET做CE程序需要注意的问题:

1、Form的显示问题。由于在CE上运行的是简化版的.NET Framework,上面不仅少了很多的东西,而且因为被过度简化而出现了一些Winform上没有的问题,这些问题当中最容易困惑刚接触CF的人的就是多个Form如何正常显示和隐藏。
   在Winform下面,Form1.Show()就能够将Form1显示出来,但是在CF下面就不一样了。在CF下面,这段代码会让你的程序“消失掉”:
   // this = Form1
   Form2 f2 = new Form2();
   this.Hide();
   f2.Show();
如此简单的代码,你也许会认为应该是显示出一个f2,而事实上却是出现了系统桌面或者另外一个不相关的程序界面。仔细研究了一下,发现只要你的程序转到后台之后,你就不可能通过代码将你的程序中任意一个窗口显示出来(API除外),因为这个Show在CF当中的MSIL仅仅改变了某一个窗口的“可视状态”而没有重新设置程序焦点的步骤。而上面这个代码片断首先将自己隐藏了,这个时候你的程序中所有的界面都已经被隐藏了,因此焦点自然不在这个程序上了,后面的f2.Show又没有夺回焦点,因此还是没有被显示出来。
   那么怎么半呢?通过API?那是可以的,不过这样的话就比较麻烦了:除了需要写出API的声明,还要在每次调用Show的时候额外调用这个API。实际上那个API存不存在我没有研究过,也许是向窗口发送一个什么消息吧。事实上要解决这个问题并不难,关键就是要避免焦点的丢失,想上面的那个代码就应该改成这样:
   // this = Form1
   Form2 f2 = new Form2();
   f2.Show();
   this.Hide();
需要注意的是,这个问题对于ShowDialog的窗口也同样存在,比如:
   // this = Form1
   Form2 f2 = new Form2();
   f2.ShowDialog();
   this.Show();

   // this = Form2,f1 = Form1
   private void Form2_Load(...)
   {
      f1.Hide();
   }
因为只有当Dialog被隐藏了之后才会执行ShowDialog下面的一句话,因此实际上的顺序就和
   f2.Hide();
   this.Show();
一样了。处理的办法只能够是在f2隐藏之前先把原来的窗口显示出来,比如:
   // this = Form1
   Form2 f2 = new Form2();
   f2.ShowDialog();

   // this = Form2, f1 = Form1
   private void Form2_Load(...)
   {
      f1.Hide();
   }
   private void Form2_Closing(...)
   {
      f1.Show();
   }
   private void ButtonOK_Click(...)
   {
      f1.Show();
      this.ShowDialog = DialogResult.OK;
      this.Hide();
   }
2、Form的外观问题:
   Form的外观控制是另外一个非常困惑初次接触者的问题。这里的外观控制指的是如何控制只显示一个小窗口、如何全屏、如何点击右上角就立即关闭而不是隐藏等等。

   小窗口  这里指的是如同Winform那样,只占据屏幕一部分而不是全部的那种显示模式。方法是将FormBorderStyle调整为None,这意味着没有标题栏,也就是不能够移动。如果你希望有标题栏,能够移动,看来只能够你自己去实现了。
   全屏    这里指的是连标题栏都不想要了,实现的方法是:
           1.关掉SIP
           2.将Form的Menu设为null
           3.将Form的WindowState设为Maximize.
           注意,这个必须在这个Form已经显示出来之后再设才能够有效。
   点击右上角就立即关闭而不是隐藏
           这个比较简单,只要将MinimizeBox设为False就可以了。

3. SIP的问题
   Sip就是输入板,比如什么拼音啦、全屏手写什么的。这个东西非常讨厌,整个开发当中都会不断的出现和她有关的问题。总结了一下,主要需要注意以下几个方面:
   1、Sip似乎是全局的,Form1代码里面将Sip.Enabled = false,然后Form2代码里面将Sip.Enabled = true,这个时候显示的是Form1,你不要以为那个Sip就没有显示出来,实际上是显示出来的。于是很多时候会出现这样的问题:你显示着的窗口关闭了SIP,但是某些用户操作触动了这个窗口的代码,而这个代码又触动了另外一个隐藏着的窗口的代码,而这个代码却将Sip打开了。于是你在调试的时候就会非常的郁闷:我的代码明明没有打开SIP,为是么会突然就自动打开了呢?调是的时候很容易就忽略了那些“无关的”代码,与是很难调试出来。
   2、Sip和MainMenu是关联的。如果一个Form没有设置Menu属性为一个有效值,那么一旦调用sip.Enabled = true就会抛出一个异常。一个比较容易因为没有注意到而出现的情况是,如果你想要将窗口全屏,那么就必须要将Menu去掉,如果这时候sip.Enabled = true……
   3、Sip不会自动判断搜属的Form是否已经被抛弃了(Disposed)。同时由于Form在Close之后不是马上,甚至根本就不会调用Dispose(),于是Sip在Form事实上已经Disposed的情况下并没有被Dispose,甚至关联在这个Sip上面的事件也不会被解除。下面是一个出错的例子:

   // this = Form1
   Form2 f2 = new Form2();
   f2.Close();
   sip.Enabled = true;
   sip.Enabled = false;

   // this = Form2
   ... void InitializeComponents()
   {
   ...
       sip.EnabledChanged += new System.EventHandler(sip_EnabledChanged);
   ...
   }
   ... void sip_EnabledChanged(...)
   {
       this.Visible = true;  // 在这里抛出异常,因为实际上f2已经被关闭了。
   }  

现在来回答一下各人的问题:

Q:在PDA上,开发些什么软件呢?
A:目前看来可能是一些行业软件以及手机上的应用,可能后者受到的关注程度较多。例如无线传输啦,GSM、GPRS、CDMA + GPS + GIS之类的,看到国外的还有一些其他服务性的东西,诸如天气预报、酒店车票价格查询等等。我个人有部分观点和 bisslot(米杜)  的一样,就是Web方式。不过从现在看来,PDA上面看For PC的东西比较慢,如果要做也必须连Web部分都要专门给For PPC做。

Q:模拟器在哪啊? 我挺感兴趣的 但是不知道从哪里下手阿
A:模拟器Vs.NET 2003自带。你新建一个SmartDevice的Solution就可以做啦,进去之后你会看到一个类似“PocketPC 模拟器”这样的选项(下拉框),里面可以选的还有PocketPC设备等。不过这个自带的是一个PPC 2002的模拟器,PPC2003(包括SmartPhone)的模拟器附加包可以在微软网站找到。不过就算你不装都可以开发PPC2003的软件,因为.NET CF 开发出来的本身就是平台无关的——包括CPU平台以及WinCE的版本。写出来的程序只要在装有.NET CF的机子上就能够运行,直接Copy上去就可以了,不一定非要安装程序的。目前支持.NET CF的包括PPC2000/PPC2002/PPC2003/WinCE.NET 4.0/4.1/4.2等,不过只有PPC2003/WinCE 4.2是自带.NET CF,其他的都要安装。从这个方面看来,用VS.NET开发比用eVC做开发,可移植性要强一些,不需要为不同的CPU编译不同的版本。
    至于说从何下手嘛,现在上面随便写点什么再说,练练嘛!

Q:用VS.NET做开发很爽,比如开发起来速度比较快,比如能实现一些很有趣的编程方式,比如能够做到每台机子的程序都不能够装到别的机子上用,即使你知道了这是怎么做出来的恐怕也无能为力。  什么意思?同一类型的机器上不能通用? 看了一些类似你写的东西,偶想做WINCE下的开发了  偶也用VS.NET的
A:不是啊,我的意思是可以这么做,不是必须这么做,而且这么做需要一定的技巧的,系统本身并没有这样的功能。实际上如果你不特地去做些什么,不仅仅统一类型的机子上通用,而且不同CPU,不同版本的WinCE系统,只要安装了(或者自带了).NET CF,就可以运行,直接Copy就可以了!是不是非常方便啊?
   不过问题也就来了,随便Copy都能够用,那么不就和PC机上的一样了?那不很容易盗版吗?我想告诉大家的就是这个:在PPC上用VS.NET开发完全有可能防止盗版,可以做到这台机子上的软件只有这台机子上能够用,甚至说这台机子的安装软件装出来的东西也只有这台机子能用。不过怎么做嘛,偶不敢说,保密问题……

Q:.NET程序在CE运行速度怎么样?
A:速度确实不能够和eVC的比,而且大小似乎也会大一点。不过如果你打算用.NET CF做的话,一定要注意优化,有没有优化真的差很远!(感觉有点像回到了DOS时代,那时候可是以速度为第一考虑要素啊!)怎么优化日后有机会我会讲的。

Q:能不能介绍一下在公司里用VS.NET 2003 + WIN CE.NET开发PDA的薪水情况
A:如果你是老板,你觉得应该给多少呢?呵呵!现在俺的薪水就要看着款产品是否畅销了……目前来说似乎比较顺利,不过钱还没有到手呢……



在PC上运行很好,但是down到Win CE目标机后运行时立即自动退出,是何原因?
我的Win CE image文件中已经包含了Compact framework

在win ce上运行.net cf程序,需要先在PDA上安装.net cf
vs.net在发布程序到PDA时会先判断 PDA上有无安装.net cf,没有的话 会先安装
你也可以自己先安装了,这样调试的时候会快一些

ce 下没有win32 类,所以不能所有win32 的功能,包括API,所以handle 所没必要了,因为它不需要也不能进行句柄操作

怎样将文件复制到Wince .NET 模拟器上
我按照msdn例子“ms-help://MS.MSDNQTR.2003FEB.2052/dv_evtuv/html/ettskCopyingFilesToTargetDevice.htm”试了,但是在第二步没有发现“网络共享”的图标,无法进行下去

首先你的机器可以使用iis,
照MSDN上添加虚拟的网卡,把原来的物理网卡禁用,虚拟网卡的ip设为192.168.0.1
iis的Ip也是192.168.0.1
共享一个文件夹(如test),在iis中设为可以浏览的。
现在在浏览器中键入http://192.168.0.1/test
如果可以看到test文件夹下的文件就可以了
在wince.net或pocket pc中把网卡的ip设为同一网段的如192.168.0.2
现在在wince的浏览器中键入
http://192.168.0.1/test
看是不是可以看到test文件夹下 的内容?