Windows Mobile 自定义控件(一)

    最近总是在CSDN的移动论坛当中看到有关UI的问题,按照层次大致可以分为如何定制***控件,或者***控制如何实现***功能。或者再深入一点的比如实现透明的方式,如何画一个PNG支持ALPHA通道,再往下就是实现复杂控件当中所遇到的问题了。

    暂停了纯开发工作一段时间,反而有了一些心得,所以我想就这些问题给出我自己的解答,当然这可能不是最优的,但是我想通过对于某一问题的探讨大家集思广义,共同把自己的方法,关键是思路理顺。当然第一篇只是起始,欢迎大家留言,我也会尽量根据大家的观点来继续我后续的博客。

   不想在第一期就被什么.NET/C++的开发哪个更好等问题纠缠, 咱们先站在一个更高的角度来看自定义控件的开发,归根结底其实就是两个问题,

一 控件绘图的行为 二 用户输入事件的处理和传递。

    首先对于第一个绘制问题,其实很简单。如果是在面向对象的环境下做不管是。NET还是MFC WTL,工作都是从基类(CONTROL)继承,然后重载ONPAINT 或者ONPAINTBACKGROUND两个函数,而对于原生的WIN32程序则需要在CASE WMPAINT的时候做相应的处理。

    而对于第二个用户事件的处理来讲也是一样,对于。NET WTL MFC需要重载ONKEYDOW,ONMOUSEDOWN ONMOUSEUP等一系列函数。而对于WIN32程序也是一样在CASE LBUTTONDOWN,CASE LBUTTONUP的时候做相应的处理。

    下面举个非常简单的LIST的例子:

 

       Title

 

    string  icon
    string  icon
    string  icon

 

    其实就是两步咱们先解决画的问题,为了更加通俗易懂,用伪代码实现。

    string 标题;

    items[] 内容;

    int 标题高;

    int 行高;

    OnPaint

    {

       画标题()

       画内容()

    }

 

    画标题

    {

      DrawText(标题,粗体,5号字,位置,居中);

    }

    画内容

    {

       行数=(控件高-标题高)/行高;

       for(i<行数)

       {

          DrawText(items[i]->text,正常,2号字,位置,居左);

          DrawImage(items[i]->image,位置.x+文字宽,位置.y);

          位置.y+=行高;

 

       }

 

    }

    当然我以上的伪代码并没有关注细节,其实光是一个绘图一个环节就能说不止十篇的内容,比如让你的DRAW方法可以支持更多的分辨率的机器其实都需要技巧,但是这都是后话,本篇就是来整理一下宏观的思路。

画的问题基本上就是这些。咱们再来看用户输入的问题。以用户按键为例

  OnMouseDown(POINT 按键位置)

  {

      按键索引=(按键位置.y-标题高)/行高;//哪个键被按下

      画高亮索引(按键索引);//先将控件内部应处理的逻辑处理完如,将用户按下的地方高亮显示等。

      OnItemPress(按键索引);//如有必要将事件传出,由后台的UI ENGINE做联网或者取数据库,或者打开另外一个UI的操作。

 

  }

     OK,对于用户的输入处理的逻辑框架也大致说完了,只哆嗦一句,Mouse的位置有相对(相对于控件而言),和绝对(相于对整个屏幕而言)所以很多时候需要做坐标位置的转换。

    我想做为开篇,以上的内容已经足够了,不过接下来咱们是继续就整个自定义框架的问题深入探讨(目前咱们的例子还很简单,这个框架对于又有图片又要加透明效果还要有LIST风格等复杂一点的应用无能为力),还是就某些细节问题例如绘图技巧,焦点控制等展开我还没有什么想法,如果读者有什么意见请留言吧。我会根据大家的需要继续的。

 

 

 

 

posted @ 2010-01-16 19:01  javawebsoa  Views(190)  Comments(0Edit  收藏  举报