• 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风格等复杂一点的应用无能为力),还是就某些细节问题例如绘图技巧,焦点控制等展开我还没有什么想法,如果读者有什么意见请留言吧。我会根据大家的需要继续的。

  • 相关阅读:
    连接mysql遇到的问题
    洛谷 P3369 【模板】普通平衡树(Treap/SBT)
    开博啦
    luogu【P2753】[USACO4.3]字母游戏Letter Game
    luogu【P3377】 【模板】左偏树
    POJ-2251
    HDU-1518
    Coderforces-455A
    UVA-1608
    Coderfocers-551C
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/2458390.html
Copyright © 2020-2023  润新知