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