浅谈wince项目开发---窗体布局
在园子里混了这么多年,从这里得到无数却从未有过付出,倍感汗颜;今天终于申请了个博客,也想着不管咋地也要为咋们中国的软年事业做点贡献^-^,不过却是提笔无言呀,就随便写点吧,希望各位大虾多抛砖、多批评、多指证,不是说无批判的欣赏不是真正的欣赏吗。
前不久手上刚好有个wince的项目完工,在此我就对在项目开发过程中的一些问题和经验和大家做个分享吧!此项目是一个大型连锁商城的物流无线RF管理系统,使用的设备是MOTO MC3000;今天就先跟大家说点肤浅的东西(我可不是一个肤浅的人...)窗休的布局。无论做什么样的项目需求是必须的吧,也不单是软件项目啦,其实无论做什么事我觉得这个都是必不可少的,做没有任何目的的事,这种事这种人到现目前我基本还没发现;废话太多...进入正题
窗体需求:1、统一大小、统一界面、界面简单,原因很简单因为大家都知道手持设备的屏幕都很小,如果窗体大小不统一,界面上控件太多,那会让使用的人眼花缭乱,用户休验就不说了,那会大大增加操作员的操作失误;2、窗体数量庞大,同时加载的窗体比较多,窗体间的切换频繁、数据交换量大。
其实这个需求也很简单,大家可能脑子里现在已经有一套完整的解决方案了,这里我就给先给大家说说我自己的思路吧 ;
第一方案就按照需求一个一个的做吧,相同的大小,统一的界面我复制吧,这样快多了......还好我最终没有这么做,不然可能早被老板开了; 现在都SOA了你还POP。没办法那就第二方案吧,你不是说我POP嘛,那我就也整点OOP吧,你一定也想到了吧,继承不就解决问题了吗,我定义一个父窗体,其他的都从他继承那就好了,哈哈我聪明吧;问题解决了吗?回过头来看看需求,第一条算勉强解决了吧,可第二条呢,同时加载大量的窗体,性能上怎么控制,对于一个内存32M的设备这个是必须考虑的;在大量的窗体间进行切换,窗体间大量数据的传递,这样的控制又该怎么做呢。对于这些问题第二方案不管怎么做都有些不尽人意的地方;没办法重头在来吧,谁叫咋不是老板呢。到了这里我们的主角(用户空件)终于要出场了,用户空件能很轻松的帮解决了上面的种种问题,实现非常简单我就不细说了,这里就是提供一种思路,当然可能很多大虾早就是这种在做的了,也可能还有更好的办法,望提出给大家学习学习,不要藏私哟!
为了照顾刚刚初涉此道的朋友,我还是把具体的思路说一下:
1、整个程序只使用一个窗体作为容器;
2、定义一个baseControl继承于UserControl,我们可以在这里统一定制界面和其他共有的属性方法 ,后面所有的窗体控件都从这里继承
namespace xinzhi.rf.sortingDelivery { /// <summary> /// 定义一个用户件件继承于UserControl,后面所有的用户控件都从这里继承 /// </summary> public partial class baseControl : UserControl { public baseControl() { InitializeComponent(); } /// <summary> /// 清除所文本框里的内容 /// </summary> public void clearAllTextBox() { foreach (Control control in base.Controls) { if (control is TextBox) { ((TextBox)control).Text = ""; } } } /// <summary> /// 实现快捷键 ,这个是必须的,因为在这些手持设备上基本都是快捷键操作 /// </summary> /// <param name="e"></param> public virtual void processKeyDown(KeyEventArgs e){} /// <summary> /// 实现控件的Show事件,这个也是必须的 /// </summary> public virtual void initShow(){} ...... } }
3、我这里就贴出其中一个窗体控件的代吗,相信聪明的你一看就明白了
namespace xinzhi.rf.sortingDelivery { public partial class MainControl : baseControl { public MainControl() { InitializeComponent(); } /// <summary> /// 打开拣货分发主窗口--注意这里,所有的窗口的控制都是放在Program下一个呢nextForm的方法来做的 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ButSortingClick(object sender, EventArgs e) { var sc = new SortingControl(); Program.nextForm((frm_main)this.Parent, sc, "新知分拣发货系统--任务管理"); } /// <summary> /// 退出程序 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ButCancelClick(object sender, EventArgs e) { Program.messageConfirm("你是否确定退出?"); Application.Exit(); } /// <summary> /// 重写OnKeyDown实现快捷键 /// </summary> /// <param name="e"></param> public override void processKeyDown(KeyEventArgs e) { base.processKeyDown(e); Keys keyCode = e.KeyCode; if (keyCode == Keys.Escape) { this.ButCancelClick(null, null); } else { switch (keyCode) { case Keys.F1: this.ButSortingClick(null, null); return; case Keys.F2: this.but_delivery_Click(null, null); return; } } } /// <summary> /// 重写initShow实现Show事件,这里主要是对窗体控件的一些初始设置 /// </summary> public override void initShow() { base.initShow(); if (this.cmb_user.Text.Trim() != "") { this.txt_passwd.Focus(); } else { this.cmb_user.Focus(); } } } }
到这里这篇处女作算是完工了,当然还有很多的东西没说明白,不过那不是本文的重点;在此我要非常感谢你看这么劣质的文章能看到这里!以后我想我会进步的,谢谢!