.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文件夹下 的内容?
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文件夹下 的内容?
上一篇: 悲观锁与乐观锁
下一篇: MySQL数据库的视图
推荐阅读
-
ASP.NET Core Web 应用程序开发期间部署到IIS自定义主机域名并附加到进程调试
-
使用ASP.NET Web API和Web API Client Gen使Angular 2应用程序的开发更加高效
-
【详细】【转】CentOS 7部署ASP.NET Core应用程序
-
.NET使用.NET Core CLI开发应用程序
-
IIS安装和ASP.NET Web应用程序开发期间部署到IIS自定义主机域名并附加进程调试
-
Oracle 9i & 10g编程艺术-深入数据库体系结构——第一章 开发成功的Oracle应用程序(转)
-
Oracle 9i & 10g编程艺术-深入数据库体系结构——第一章 开发成功的Oracle应用程序(转)
-
.NET(WinCE、WM)转Android开发——Xamarin和Smobiler对比
-
ASP.NET Core 中文文档 第二章 指南(8) 使用 dotnet watch 开发 ASP.NET Core 应用程序
-
16.ASP.NET Core应用程序中的开发者异常页面中间件