.Net Micro Framework研究—Windows桌面

  1. 云栖社区>
  2. 博客>
  3. 正文

.Net Micro Framework研究—Windows桌面

技术小美 2017-11-06 17:27:00 浏览484
展开阅读全文

今天是2007年最后一天,还有几个小时就迎来充满期待的2008年了。元旦放假至今不到48个小时的时间里,我至少有30多个小时坐在电脑前研究MF相关技术,在缺少必要的硬件的情况下,利用现有的资料,扩充了现有的模拟器功能。也希望像我这样的穷人们,借助模拟器,能体验一下以前只有拥有硬件才能调试的功能。

以前为了介绍MF图形方面的功能,我做了一个“北京2008奥运场馆查询”程序,现在看来那个程序,已经不足以展示MF整体功能的强大。既然Windows 2000 /XP/vista,Windows CE(Windows Mobile)程序都有Windows桌面和开始菜单,那么我们的.Net Micro Framework也应该有一个。岂能光说不练,下面就是我们MF Windows的桌面和开始菜单。

 

看了这个截图,也许有的网友会认为,这有什么难,这不是从windows mobile系统上做了一个截图嘛。实话实说,这样认为还真是想简单了,除了windows图标和小喇叭外,其它部分全部用代码实现,光字体就用了两种不同大小的字库,此外时钟也不仅仅做个样子,也是能正常刷新显示的。开始菜单我们也有,不仅能选择,还能执行对应的功能,不要急,下面我们一一说起。
 


在上几篇blog上我说了,我做的模拟器又扩展了两个键(菜单键和返回键),别说,这个程序在微软的模拟器上运行起来还真有问题,因为它不支持菜单键,无法弹出菜单来。
菜单上项目也不仅仅是摆设,和模拟器新增的功能结合在一起,做了一个功能测试大荟萃。让我们先看看GPIO测试的功能在“windows桌面”是怎样的?

 

菜单上选中“GPIO测试”项,按一下键盘上的回车或者单击模拟器上的“OK”键,就进入上图界面。单击模拟右下角的“>>>”项,展开模拟器上的GPIO测试面板。
单击模拟上的I输入开关,桌面上显示的输入信息也同步发生了变化,Q输出是有用户程序控制的,灯会一一亮起或关灭,桌面上的显示也和模拟器像对应(插一句,千万不要以为上面模拟器和模拟LCD中的程序为同一个,两者彼此独立,用户程序通过正常的指令和模拟器交互(当然同样的代码对实际硬件也一样))。
下面我们再看看“AD测试”功能。

 

通过开始菜单,我们进入“AD测试”模块,相应的,我们单击“<<<”旁边的“GPIO”字符,弹出选择菜单,我们单击“AD”,模拟器呈现AD模拟数据操作面板。
移动滑块,我们发现桌面中的数据同步发生了改变,不好意思,模拟出部分被弹出菜单给挡住了,我们再来一张截图。

 

QW0是由用户程序控制的,看的出来,模拟器忠实的获取了该数据并显示了出来。说到这里我还得多说几句,其实模拟器的部分程序更像运行在实际硬件系统中的IO驱动程序,spi读写指令操作的是字节数组,所以上传的数据是否浮点型、是否整形等等,全都需要约定,这也决定了不同的厂家对同样的物理信号进行采集,传到MF系统中的数据有可能不同,不过通过特定的换算,最终的结果一定是差不多的。
下面说一下I2C总线,I2C我的理解和串口通信、CAN口通信差不多,都是两个相对独立的设备进行数据交互,I2C和CAN通信一样,需要设置设备地址,此外还需设置一下时钟主频。下图是测试程序界面。

 

前三个数据是用户程序进行修改的,由于有时间差,二者数据刷新时刻不同,所以不一致,后五个数据是模拟输入的,可以看出桌面上的显示已经可以同步更新了。用这种方式模拟I2C,我也觉得有些不妥,以后有更好的方案我再修改。
细心的用户一定会发现MF“Windows 桌面”右上角的时间在不断的变化,第一幅图是2007年12月31日21:39:23,最后一幅图的时间是22:27:33,也就是说,写这篇文章大概花了我50分钟,这是我在word写这篇文章的用时,接着再花一些时间写到我blog上,我想所有的一切完毕后,我想大概就可以聆听2008年的第一声钟声了。
祝大家新年快乐!!!

 


 
附:部分核心代码
 


  1. public override void OnRender(DrawingContext dc)  
  2. {  
  3.     //绘制背景                 
  4.     dc.DrawRectangle(new SolidColorBrush(ColorUtility.ColorFromRGB(41,113,189)),null , 0, 0, Width, Height);  
  5.       
  6.     //菜单条  
  7.     LinearGradientBrush lgb = new LinearGradientBrush(ColorUtility.ColorFromRGB(51,160,241), ColorUtility.ColorFromRGB(16,75,161), 0, 0, Width, 0);  
  8.     dc.DrawRectangle(lgb, null, 0, 0, Width, 26);  
  9.    
  10.     //开始菜单  
  11.     dc.DrawImage(Resources.GetBitmap(Resources.BitmapResources.Win), 0, 0);   
  12.    
  13.     //分割线  
  14.     dc.DrawLine(new Pen(Color.White), 26, 0, 26, 25);   
  15.    
  16.     //显示“开始”  
  17.     dc.DrawText("开始", YFFont, Color.White, 29, 7);  
  18.    
  19.     //显示小喇叭  
  20.     dc.DrawImage(Resources.GetBitmap(Resources.BitmapResources.Sound), 320 - 75, 6);   
  21.    
  22.     //状态区  
  23.     dc.DrawRectangle(new SolidColorBrush(ColorUtility.ColorFromRGB(189, 235, 255)), new Pen(Color.Black), 0, Height-26, Width, 26);  
  24.    
  25.     //标识  
  26.     dc.DrawText("叶帆工作室荣誉出品", YFFont, Colors.Gray, 200, 220);  
  27.    
  28.     switch (txtState.TextContent)  
  29.     {  
  30.         case "GPIO测试":  
  31.             string strPace = "   ";  
  32.             dc.DrawText("输入: I0 I1 I2 I3 I4 I5 I6 I7", YFFont, Colors.Black , 40, 50);  
  33.             dc.DrawText((input[0].Read() ? "1" : "0") + strPace + (input[1].Read() ? "1" : "0") + strPace + (input[2].Read() ? "1" : "0") + strPace + (input[3].Read() ? "1" : "0") + strPace + (input[4].Read() ? "1" : "0") + strPace + (input[5].Read() ? "1" : "0") + strPace + (input[6].Read() ? "1" : "0") + strPace + (input[7].Read() ? "1" : "0"), YFFont, ColorUtility.ColorFromRGB(255, 255, 0), 78, 75);  
  34.    
  35.             dc.DrawText("输出: Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7", YFFont, Colors.Black, 40, 100);  
  36.             dc.DrawText((output[0].Read() ? "1" : "0") + strPace + (output[1].Read() ? "1" : "0") + strPace + (output[2].Read() ? "1" : "0") + strPace + (output[3].Read() ? "1" : "0") + strPace + (output[4].Read() ? "1" : "0") + strPace + (output[5].Read() ? "1" : "0") + strPace + (output[6].Read() ? "1" : "0") + strPace + (output[7].Read() ? "1" : "0"), YFFont, ColorUtility.ColorFromRGB(255, 255, 0), 78, 125);  
  37.             break;  
  38.         case "AD测试":  
  39.             dc.DrawText("AD: AW0=" + ReadWriteAD((Int16)QAW).ToString() + "   QW0=" + QAW.ToString(), YFFont, Colors.White, 60, 100);  
  40.             break;  
  41.         case "I2C测试":  
  42.             //I2C读写  
  43.             byte[] bytRData = new byte[8];  
  44.             byte[] bytWData = new byte[3];  
  45.             bytWData[0] = (byte)IntI2CNum;  
  46.             bytWData[1] = (byte)(IntI2CNum * 2);  
  47.             bytWData[2] = (byte)(IntI2CNum * 3);  
  48.             I2CDevice.I2CTransaction[] i2c = new I2CDevice.I2CTransaction[2];  
  49.             i2c[0] = I2CBus.CreateReadTransaction(bytRData);  
  50.             i2c[1] = I2CBus.CreateWriteTransaction(bytWData);  
  51.             I2CBus.Execute(i2c, 100);   //执行  
  52.    
  53.             string strPace1 = " ";  
  54.             dc.DrawText("I2C(字节0-7):", YFFont, Colors.Black, 50, 80);  
  55.             string strInfo = bytRData[0].ToString() + strPace1 + bytRData[1].ToString() + strPace1 + bytRData[2].ToString() + strPace1 + bytRData[3].ToString() + strPace1 + bytRData[4].ToString() + strPace1 + bytRData[5].ToString() + strPace1 + bytRData[6].ToString() + strPace1 + bytRData[7].ToString();  
  56.             dc.DrawText(strInfo, YFFont, ColorUtility.ColorFromRGB(255, 255, 0), 50, 105);  
  57.             break;  
  58.         default:  
  59.             //.Net Micro Framework  
  60.             dc.DrawRectangle(new SolidColorBrush(Color.White), new Pen(Color.White), 55, 90, Width - 110, 50);  
  61.             dc.DrawText(".Net Micro Framework", Resources.GetFont(Resources.FontResources.MF), Colors.Black, 60, 105);  
  62.             break;   
  63.     }  
  64.    
  65.     //菜单显示  
  66.     if (bShowMenu)  
  67.     {  
  68.         menu.DrawMenu(dc);   
  69.      }  
  70.  }  
  71.    
  72. //按键信息  
  73. protected override void OnButtonDown(ButtonEventArgs e)  
  74. {  
  75.     switch (e.Button)  
  76.     {  
  77.         //按下确定键  
  78.         case Button.Select:  
  79.             if (bShowMenu)  
  80.             {  
  81.                 txtState.TextContent = menu.Text;  
  82.                 bShowMenu = false;  
  83.                 this.UpdateLayout();  
  84.             }  
  85.             break;  
  86.         //按下左键  
  87.         case Button.Left:  
  88.             break;  
  89.         //按下右键  
  90.         case Button.Right:  
  91.             break;  
  92.         //按向上  
  93.         case Button.Up:  
  94.             if (bShowMenu)  
  95.             {  
  96.                 menu.SelectIndex--;  
  97.                 this.UpdateLayout();  
  98.             }  
  99.             break;  
  100.         //按向下  
  101.         case Button.Down:  
  102.             if (bShowMenu)  
  103.             {  
  104.                 menu.SelectIndex++;  
  105.                 this.UpdateLayout();  
  106.             }  
  107.             break;  
  108.         //按下菜单  
  109.         case Button.Menu:  
  110.             bShowMenu = !bShowMenu;  
  111.             if (bShowMenu) menu.SelectIndex = 0;  
  112.             this.UpdateLayout();   
  113.             break;  
  114.         //按下返回键  
  115.         case Button.Back:  
  116.             txtState.TextContent = "就绪";  
  117.             break;  
  118.     }  
  119. }  
  120.  
  121.  
  122.  

 







本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/322933,如需转载请自行联系原作者

网友评论

登录后评论
0/500
评论
技术小美
+ 关注