当前位置:C++技术网 > 精选软件 > MFC下的DirectUI框架实现讲解1:整体框架实现概述

MFC下的DirectUI框架实现讲解1:整体框架实现概述

更新时间:2018-11-10 10:36:08浏览次数:1+次

    MFC下的DirectUI框架开源免费项目源码下载地址点此下载MFC下的DirectUI框架项目源码

    一直都在做MFC下的软件开发,一提到MFC,各种说法,主要的就是界面不好看了。之前研究了Windows上的控件自绘方面的技术,也有所总结,可以参考《4种控件自绘技术(修改颜色、用户自绘、拥有者自绘和子类化)的对比分析》。
    自绘确实可以实现不错的界面效果,然后所需的技术含量就比较高了。详细WPF或者其他界面开发的,做界面就和做网页界面一下,感觉技术含量太低了,顿时失去了兴趣。不过话说回来,界面和代码的分离,确实提高了开发效率,如果不是为了提高自身水平的话,WPF这一类确实还是不错的。不过里面有太多的规则,又得去学习一遍。对于我们做C++的,也就得去熟悉C#和xaml语法,想想都是头痛。
    我们做C++就好好做C++,语言学杂了,一个都不精深,也不好。可以考虑将底层的代码逻辑和界面分开做。代码核心功能封装成dll,用C++来做。然后将dll提供给其他语言使用,这样其他语言可以利用他便利的界面库轻松实现界面。这部分的内容,请参考《C++封装dll给C#语言使用的经验总结》。在这种模式下,核心功能和界面分离,给不同的人做,熟悉C++的做核心功能封装,熟悉界面的做界面,这样分工还是挺高效的。然而,如果这两者还是同一个人做,实际上效率还是不高。为什么呢?一般你也只主要熟悉一种语言,比如C++,那么对于C#或者WPF等就不熟悉了,虽然也能做,不过很多都要上网查,然后慢慢做出来。对于开发效率是极大的影响。同时,在跨语言的参数传递时,也有很多问题,你得清楚了解不同的语言的类型。反正对于我来说,我主要熟悉C++,对于C#的特性很多不熟,基本是靠上网查资料才搞定。而C++本身的东西,基本不用查,都可以直接拍脑袋做出来。
    所以说,混合语言编程在明确的分工时还是不错的选择。这是一种代码和界面的分离方案,而且是跨语言的方案,还是蛮有优势的。
    然而在中小型公司中,通常一个人负责一整块,从底层到最上层,都是你一个人做。所以你不仅要处理逻辑,还要处理界面。如果只熟悉C++和MFC,那也只能用C++做。你也可能纠结要不要转方向做C#或者用QT。新的东西学起来还是要花不少时间,如果是临时学着做做界面,感觉有点夸张了。完全转方向则是另外一回事。
    考虑到MFC的应用场景还是很多,别跟我说什么MFC没前途这些扯淡的东西,MFC只是一个工具,能用上就可以用,没有必要追什么潮流,潮流这东西还不是人家制造的。人家开发了一个新的东西,方便使用,就成为潮流了。如果我们将MFC也搞出一套不错的东西,是不是也可能成为潮流呢?况且MFC沉淀了这么久,资料很多,技术成熟。虽然说微软没有主推MFC,但是MFC一直都在更新,并没有一成不变。微软不主推MFC,而推.NET是他的商业意向,和技术本身没有太大关系。
    所以既然有这么多人在用MFC,那就写一个MFC环境下的DirectUI框架吧。不用太复杂,越简单越好。在win32环境下有一个Duilib,虽然也不错,然而却不能结合MFC的优势,而且Duilib也只是一个纯粹的UI框架而已。如果你在做MFC,又要做漂亮界面,Duilib还是不太好整。不过Duilib框架的这一套思路,我们可以学习。duilib源码和demo下载地址:点此下载Duilib源码和demo
    从MFC的DirectUI刚做出来,我会坚持维护下去,希望把它做完善。我也想在做UI框架的过程中,锻炼一下开发框架的能力,做UI框架比做UI本身有趣的多。如果你也有兴趣,不妨看看我写的这一系列的UI框架实现分析文章吧。做好了UI框架,后面做MFC咱们也就直接用MFC的DirectUI框架做界面,多爽呀。没有什么过不过时的,咱们要的潮流咱们自己引领一下,岂不更爽。
    好了,废话不多说了,开始讲述框架实现的基本流程原理了。因为本文是开篇,所以背景说的比较多,不过都是有必要的。
    我默认你都清楚了如何写MFC程序了。后续谈到的MFC本身的东西我就不细说,不过也不多。MFC本身使用的是各种控件实现界面布局,控件都是窗口,所以我们对于这样的界面构成模式,其实都是窗口编程那一套。只要我们拥有了控件的句柄,就可以操作控件了。如果要控件变得好看,就对控件自绘。
    所以,MFC做界面就感觉是堆积木一般,界面上的控件都可以通过Spy++识别出来,Spy++的使用介绍,请参考《窗口跟踪神器Spy++和窗口反跟踪技术DirectUI的整体分析》。然而这样的堆积木方式的界面,每一个元素都是窗口组成,每一个窗口都由对应的窗口过程来处理绘制界面,而控件这些都是由系统提供的默认的窗口过程来处理,如此一来让我们美化见面带来了麻烦。界面处理起来很不灵活,要美化就只有通过MFC或者系统提供的几个接口了(自绘技术)。所以,如果你要清楚自绘技术,那就要对整个窗口机制很了解才能够做好漂亮界面。那么一般的程序员都只是拖拖控件而已,深入的层次压根就不知道。对于这类的技术,也没有成套的教程来讲解,我们C++技术网推出了一套《Windows零基础入门教程》,非常详细,所以也非常耗时间。因为工作原因,时间也不多,更新的不是很快,不过已经更新的这部分,对于理解窗口机制非常有用,至于更高级的有待更新。
    这也是为什么Windows界面美化困难的原因吧。所以后面索性就用了DirectUI技术实现界面,这才让现在的界面开发泛滥。太没有技术含量做出来的界面俗不可耐。大多数人也就简单的换张图片就OK了。各种界面做出来的效果都大同小异,缺乏特色。真的有特色的界面还是得花心思,虽然directUI降低了界面开发的门槛,但是也不是说界面开发真可以随便做做而已。
    DirectUI技术就是直接在窗口上画界面的技术。高级点还可以用程序绘图,这样做出来的界面还算有点技术含量。然后为了加快速度,就直接使用xml文件来布局,和html基本差不多了。界面只需要用图片即可,UI引擎会直接将图片贴在窗口。那么界面的好坏就全看这个图的搭配了,界面完全就是美工的事情了,这个和程序员关系不大了。如果你只是做UI界面开发,而且是基于DirectUI的,那真是太没有劲了。甚至你这些工作完全可以交给美工做了,要你程序员做什么呢?在direct ui技术下,程序员不是做ui的了,而是单纯的做程序逻辑的。
    不过,做ui框架的程序员则和做ui应用软件完全不一样。技术含量迅速提高,档次也迅速提高了。
    DirectUI我就简称DUI吧。既然现在是直接在窗口上画,那么界面上看到的所有东西,都是你画出来的,就不再是控件,不再是窗口了。做这样一个比喻,MFC上的控件组成的窗口,就感觉是立体的,而DUI就感觉是平面的。你使用Spy++是无法识别到界面上的元素的,Spy++是识别窗口的,你画在窗口上的东西就只是你笔下的墨水而已。
    所以问题就来了。基于窗口模式的消息响应,直接画在窗口上的各种“控件”如何响应呢?实际上,DUI绘制的所有东西,不存在所谓的控件。我们说的控件是窗口,DUI中说的控件都是逻辑上的控件,实际上就只是客户区的一个矩形区域而已。你对DUI控件的操作就是对客户区的操作,UI框架会根据你点击的不同位置来区分不同的逻辑上的控件,然后做不同的反应。每一个响应都要绘制一下界面,从而显示出响应后的效果。这一切都在不停的画、画、画。
    所以一个完整流程的大概情况是这样的:首先要画出来界面,不同的逻辑控件占据不同的位置。然后就是交互,用户的操作也就是窗口客户区消息,那么用户是对哪一个地方的操作需要通过一个检测机制来检测,从而识别到底操作了哪一个逻辑控件。检测到操作之后,也就要做消息响应,我们需要提供一种消息处理机制来分派消息,处理消息。处理之后,要反应处理后的界面,就要再绘制界面。
    那么整个DUI的框架逻辑简单整理为:绘图---检测界面消息---识别操作的位置和操作类型(单击、双击还是右击等等)---消息分派---消息处理---界面重绘。那么这个流程就是完全用代码来控制的,这里没有什么xml之类的。看似第一步绘图蛮简单,实则这是DUI的关键,也不简单。如何绘图是一个非常有学问的技术。
    为了清楚的绘图,分清不同的逻辑控件等,并不能简单的直接将各个逻辑控件画在界面上。因为我们后面要检测单击,要做消息处理。所以这个和普通的绘制一个图形完全不同。因为它不只是绘图,而是带有结构的绘图,有逻辑层次的绘图。
    如果你是第一次做DUI,可能你不知道这么做有什么好处,然而你不这样做,后续无法进行检测了。为了更好的检测,也就出现了UI节点树,所有的界面元素都在UI节点树中,每一个元素在哪里都记在节点中,这样后续检测也就是将得到的鼠标消息的坐标和节点树中的节点进行比较,从而确定单击到哪个元素了。然后才确定后续的消息处理。消息处理倒是不太难,毕竟我们都很熟悉MFC这一套了,借用即可。dui的界面绘制和检测是大家不熟悉的,所以这才是难点。当然,当你看完这一系列的讲解文章,想信你对dui有新的认识,最好是自己动手写代码,给MFC的DUI项目添砖加瓦,将会让你理解的更深,以后再用其他的DUI框架,那就超简单了。
    如果要支持更多的鼠标操作,比如鼠标悬停,则要将消息分类,然后做不同的消息处理。如果想支持xml,在ui节点树基础上,也就是将xml的节点和属性,读取解析生成一个ui节点树就可以支持了。
    当你自己在做ui框架时,而不是ui应用时,你可以给框架添加更多的富有表现力的元素,而不只是使用dui技术而已。ui框架越强大,越有个性,自然做出来的界面也就越有特色。这个在ui框架开发中可以实现,而ui应用开发则无法做到。
    本文是一个概述性的描述,整体逻辑也有描述,想了解更多dui框架开发技术,请先下载源码阅读,然后自己动手,然后再看后续的分析文章(分析文章都在C++技术网中发布)。