欲行千里,必积跬步!!
关于UI控件的控制事件和响应,无论在PC还是在手机或者其他设备,处理方式基本是一样的。
如何理解呢?你可以试着想一下,假如有这个一个需求,
1、你只能得到显示器的分辨率,比如1024*1280,以及鼠标点击坐标,以及移动的坐标;
2、设备只提供几个画图的函数,你可以画几个框框,并进行背景设置等等;
3、你需要在这个设备上面开发一个窗口,窗口上面有一个按钮;
4、程序运行后,设备会提供一个函数,调用这个函数,你会得到当前窗口在屏幕中的位置,假设为函数名为 GetCurProcecssWindowPos();
5、点击下这个按钮,设备会做点什么,这由其他人完成;
然后到此结束
当你接到这个案子,你会怎么做?试着思考一下。
如果你见过windows窗体,你可能会按照下面的步骤进行
1、程序运行后,先使用画图函数画一个窗体,窗体上面有标题栏,关闭按钮,以及需求中的提到的按钮,并记下窗体上面各个按钮的相对位置
2、记下窗体中各个按钮的相对位置(这是因为主窗口的位置随时变,记下绝对位置没用)
3、主窗体固定后,调用GetCurProcecssWindowPos函数获得窗体在屏幕中的位置
4、定时去获取鼠标的点击位置
5、获取鼠标位置了,通过计算,并对比是否鼠标点击的位置是否在我们需要的按钮上面,如果是,则调用鼠标响应的函数。
抛开操作系统,我们是不是可以按照上面的方式设计一个窗体程序?答案是肯定的。
回到windows上面,windows操作系统提供的大量的函数和系统事件,我们可以按照上面的逻辑设计一套窗体系统,为了达到更好的结构,我们或许会想着把逻辑和界面的部分分离开来。
首先,我们需要一个文件来描述控件的布局,控件使用的图片,控件的特征,控件的标示等等,假定该文件为,描述如下面所示,
<HorizontalLayout width="97" align="left">
<Button name="checkRemKey" width="17" height="17" normalimage="image\" hotimage="image\" pushedimage="image\" />
</HorizontalLayout>
然后我们会去设计一个线程,专门用来解析,并进行相应的绘制,我们还可能设计一个线程专门用来监控windows的各种事件(设备的输入输出,系统消息),该线程实现可能会是这样
switch(GetMsg())
case WM_LBUTTONDOWN:
XXX;
break;
case WM_TIMER:
XXX;
于是,一个逻辑和界面分开的程序就被设计出来了,
以上就是各种界面库的原理