Windows Mobile 自定义控件(一)

本文探讨了自定义控件开发中的两大核心问题:控件绘图行为与用户输入事件处理。通过伪代码示例说明了如何实现一个简单列表控件的绘制与交互逻辑,并提出进一步讨论的方向。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值