毫无疑问,Windows的流行推动了图形界面的发展,从最原始的Win32界面库到MFC,再到最近UWP界面库,Windows界面库的发展也代表了界面库和整个软件行业的发展方向。本文就简单梳理下整个Windows界面库的发展历程和现状。

Win32

Windows 整个系统的图形界面是建立在Win32图形界面接口上的,它提供了Windows界面编程的基本模型——显示管理窗口和消息循环分发事件。Win32是C接口形式,一个典型的窗口程序如下,可以看到就是按照通用界面库模型来的,不再赘述,对此感兴趣的可以看Petzold的《Windows程序设计》。Win32需要考虑细节太多,目前实际编程很少再用原生win32了,一般是第三方界面库基于Win32包装或其他语言通过包装Win32来提供基本界面功能。

#include <windows.h>LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{static TCHAR szAppName[] = TEXT ("窗口类名称");HWND         hwnd;MSG          msg;WNDCLASSEX   wndclassex = {0};//设计窗口类wndclassex.cbSize        = sizeof(WNDCLASSEX);wndclassex.style         = CS_HREDRAW | CS_VREDRAW;wndclassex.lpfnWndProc   = WndProc;wndclassex.cbClsExtra    = 0;wndclassex.cbWndExtra    = 0;wndclassex.hInstance     = hInstance;wndclassex.hIcon         = LoadIcon (NULL, IDI_APPLICATION);wndclassex.hCursor       = LoadCursor (NULL, IDC_ARROW);wndclassex.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);wndclassex.lpszMenuName  = NULL;wndclassex.lpszClassName = szAppName;wndclassex.hIconSm       = wndclassex.hIcon;//注册窗口类if (!RegisterClassEx (&wndclassex)){MessageBox (NULL, TEXT ("RegisterClassEx failed!"), szAppName, MB_ICONERROR);return 0;}//产生窗口hwnd = CreateWindowEx (WS_EX_OVERLAPPEDWINDOW, szAppName, TEXT ("窗口名称"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance,NULL); //显示窗口ShowWindow (hwnd, iCmdShow);UpdateWindow (hwnd);//启动消息循环泵循环获取消息分配到窗体过程函数处理while (GetMessage (&msg, NULL, 0, 0)){TranslateMessage (&msg);DispatchMessage (&msg);}return msg.wParam;
}//窗体过程函数
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{HDC hdc;PAINTSTRUCT ps;switch (message){case WM_CREATE:return (0);case WM_PAINT:hdc = BeginPaint (hwnd, &ps);EndPaint (hwnd, &ps);return (0);case WM_DESTROY:PostQuitMessage (0);return (0);}return DefWindowProc (hwnd, message, wParam, lParam);
}

MFC

可以看到Win32创建一个简单的界面需要大段的代码,既然是遵循相同的模型,恰好适逢C++技术发展,微软借助C++技术将界面编程抽象成许多类,包装诸多细节,最明显的两个特征:

1.简化窗口创建,窗口创建和类绑定,创建的公共操作封装到基类中

2.窗口过程统一勾到一个处理函数中,然后分发到对应的每个窗口类中(可以参考我的这篇文章)

这样开发者只需要重写部分虚函数,填充消息消息响应表实现响应函数即可,大大减少了开发者的工作量,而且结合VC提供的可视化功能,能够快速的完成界面代码的生成。但是MFC封装臃肿了,继承层次过多,且当时的C++标准尚未完善为了弥补有很多hack设计,但是MFC经过这么多年的发展已经相当稳定了,所以现在主要用在工业领域,算是工业领域的一个标准了,一些小公司和小工具也还是在用MFC,感兴趣的入门可以看看孙鑫《VC++深入详解》,提高可以看侯捷的《深入详解MFC》和David《Visual C++ 技术内幕》。

WTL

因为MFC的臃肿,微软的一个开发小组业余开发了WTL,并且逐渐被大家接受,WTL主要基于C++ 模板技术,封装很轻量级,而且兼具MFC的诸多优点,还可以和MFC混用。但是因为WTL技术上相对MFC要求较高,目前主要是一些大厂(360、金山等)在用,而且由于WTL的封装很易于扩展,国内大多数Windows C++界面库都是基于WTL开发的,接下来关于界面库的编写也主要基于WTL讲解。

WTL出来的相对较晚,微软也没有大力宣传过,市面上讲解的书不多,详细了解WTL可以看看WTL for MFC Programmers系列文章,这是中文版本链接。

Qt Widget

qt并非微软的界面库,他是一个跨平台的C++界面库,最早由诺基亚开发用于手机界面展示,现在由奇趣公司维护。之所以把Qt放在这里讲,是因为Qt在Windows上使用非常广泛,而且引入了非常多新的设计。如果把原生Win32比作界面库1.0,MFC/WTL比作界面库2.0,那么Qt Widget可以算是界面库3.0。它引入了xml布局界面,支持Qss样式,支持非常多系统组件,非常易于编写现代化的DirectUI界面,现在Qt被广泛的用在了工业领域,互联网产品比如WPS,YY语音等也都是基于Qt编写。可以说如果需要一种跨平台的C++界面库,那么Qt是最好的选择。可以参考书籍Jasmin 《C++ GUI Qt 4编程(第2版)》,这本书有点老,可以结合现在文档一起看,Qt的文档写的非常好。

WinForm

winform并非C++界面库,但是微软后期的主要精力在于推广自己的C#语言,因此winform可以看做是微软界面库发展的延续。Winform是基于Win32封装,屏蔽了很多细节,拥有超多组件,结合VC编写所见即所得界面非常简单。但是打包发布Winform窗体程序时,一般需要带上对应.Net 运行时,因此程序体积比较大,但是胜在开发效率快和COM、数据库集合非常好,很多企业化办公和管理系统都是基于Winform来编写的。

WPF

Winform主要还是基于win32界面库,在新的互联网时代DirectUI的诞生让开发者可以编写更加现代化更加炫酷支持更多自定义的界面,为此微软大力推出了WPF。DirectUI技术某种程度上其实就是在客户端界面编程做到类似Web前端开发,通过声明式的类xml和css控制显示,通过类脚本控制界面动作和效果,做到显示和逻辑分离。

WPF曾是微软大力推的界面技术,它引入了很多革新的概念——xaml布局、数据绑定技术等等,支持更加复杂的绘制和特效,和Qt Widget类似,但是更加强大,进一步提高了开发效率,可以看做界面库3.5。但是由于WPF最开始基于CPU渲染,有很大的性能问题,现在某种程度上已经得到了很好的优化,然而和winform一样有依赖.net运行时的问题,而许多互联网公司的产品都是需要支持Window XP(比如QQ、360安全卫士等),所以WPF不是桌面应用程序界面开发首选,WPF现在还是主要用在企业化办公和管理系统。

UWP和Qt QML

在移动互联网的路上,微软并没有走的很好,为了打出差异,推出了手机/平板/PC一体的Win8,随之推出的是号称一次编写到处运行UWP应用,其实UWP很像WPF,但是界面编写方式更贴近Web前端。UMP应用市场正在逐渐完善,但是毕竟操作体验和传统PC windows有差别,且很多地方还是处于一种混合的方式,只能等待微软改进和时间磨合了,具体前途怎样现在很难说,依赖于.Net的问题同样是现阶段的一个制约,微软马上要停止Win7的支持,可能有利于UWP的发展,国内的一些大厂都推出了自家的UWP应用(比如QQ、爱奇艺等)做提前布局。UWP可以看做界面库4.0,当然这是我个人的排序,仅做参考,感兴趣的可以直接看官方MSDN文档,示例非常全。

Qt QML和UWP很像,同时支持PC/平板/应用编写,编写方式也很类似Web前端,如果之前就是Qt Widget开发者可以很快入门,特别是有一些有跨平台需求多系统支持的场合应用较多,感兴趣的可以看看Qt官方文档。

libcef/node-webkit/electron

前面说过因为Web前端的方式真正做到了显示和逻辑分离,PC界面库越来越模仿Web前端的方式,与其模仿Web前端不如直接就用Web前端来写界面。之前介绍过通过内嵌IE浏览器来编写桌面应用的程序,但是因为微软各个版本的IE对现代化Web前端的支持有限,只能做有限的工作。得益于Google开源的Chromium项目,开发者们基于Chromium改造提供基于Web浏览器的界面库libcef/node-webkit/electron:

1.libcef打包了一部分Chromium常用功能,封装成库,开发者可以在程序中直接调用就完成了浏览器的嵌入

2.node-webkit/electron更甚,直接基于 Chromium 和 Node.js打造一套完整框架, 让你可以使用 HTML, CSS 和 JavaScript 构建应用

越来越多的应用开始采用这种方式,比如网易云音乐、网易云笔记甚至微软自家产品VS Code,唯一限制这种方式流行的是需要打包很多Chromium库,安装包体积较大,但是在现在这种宽带和磁盘体积下,似乎也不是什么大问题。

这种方式支持跨平台,支持老系统,且直接使用现有Web前端开发人员即可完成开发,减少学习成本,可以说是一个非常好的方式,这也是我强烈推荐的现阶段桌面应用构建方式。当然它也不是万能的,如果你想写个简单工具,或者系统优化应用最好还是用传统的方式。

Windows界面库的发展就介绍到这里,基本上整个脉络如此,由于主要讨论的是一般PC桌面应用开发,相关的其他技术比如DirectX、OpenGL、SiverLight不在讨论范围,感兴趣的可以自行查找下相关资料。

原创,转载请注明来自http://blog.csdn.net/wenzhou1219

2.Windows 界面技术发展现状相关推荐

  1. 目前互联网的技术发展现状和趋势如何?

    目前互联网的技术发展现状和趋势如何? 悬赏分:200 - 解决时间:2008-8-13 16:37 如ajax,flex,php,.net,jsp,前端开发,mvc什么的,都可以谈一下. 提问者: q ...

  2. 容器技术发展现状与展望

     一.容器技术发展现状 容器技术主要可以分为容器运行技术和容器编排技术.其中:容器运行技术主要包括Docker和rkt等:容器编排技术主要包括Kubernetes.Mesos和Swarm等. 1. 容 ...

  3. 计算机数据库技术的应用现状,数据库技术发展现状及趋势.doc

    数据库技术发展现状及趋势 数据库技术发展现状及趋势 摘要:数据库技术已发展成为信息科学里一项十分重要的技术,其应用领域之宽引人瞩目.本文介绍了数据库技术发展的现状及最新研究动态. 关键词:数据库技术 ...

  4. 2021 年云原生技术发展现状及未来趋势

    简介: 作者于雨担任了 2021 年 GIAC 会议云原生专场的出品人兼讲师,组织了前后四个场子的演讲,在这个过程中作者同时作为听众从这些同行的演讲中学到了很多非常有用的知识.本文算是对 2021 G ...

  5. 北海焊接机器人_水下焊接机器人技术发展现状及趋势

    11 20 08年1 1月 30 日 <机 器人 器人技术与应 用> 1 1 1 0.引言 实现高效低成本焊接自动化一直是焊接科研工作 者努力的方向,其中水下焊接自动化的实现要比在陆 地上 ...

  6. 电力网络计算机监控系统前景,电气火灾监控系统技术发展现状及前景分析

    电气火灾监控系统技术发展现状及前景分析 发布时间:2019/03/14 点击量: 电气消防系统是以火灾探测器为基础,在计算机上运行的一种工业软硬件系统.为了防止电气火灾的发生,对泄漏.温升.配电线路故 ...

  7. 区块链的技术发展现状,制约因素和发展方向

    转自: 作者:大圣2017 链接:https://www.jianshu.com/p/0186822510c8 区块链在3.0时代的10大发展方向 区块链1.0以比特币为代表,是可编程的数字货币: 区 ...

  8. 汽车以太网技术发展现状与趋势探究

    本文由涂孝军,张莹,李晓平联合创作 前言 随着半导体技术和智能化技术的发展演进,越来越多的新技术在汽车领域得到了推广,汽车电器成本在整车成本中所占比重也在不断增长,实现车载控制器间数据交互的网络带宽也 ...

  9. 区块链技术发展现状和趋势

    区块链是目前主流的分布式记账技术.在多个领域为对方提供信任基础,被认为是信任网络.价值互联网的基石.应用从金融领域逐步拓展到政府.供应链管理.工业制造等多个领域.区块链是目前主流的分布式记账技术.在多 ...

  10. 道路车辆 盲区监测(bsd)系统性能要求及试验方法_驾驶辅助系统硬件在环仿真技术发展现状...

    对智能汽车的驾驶辅助系统提升安全性能的需求不断提高,多传感器信息融合是驾驶辅助系统的应用趋势,硬件在环仿真测试平台能对驾驶辅助系统安全性进行深度测试.通过分析汽车典型驾驶辅助系统主要传感器构成和传感器 ...

最新文章

  1. 下一代搜索引擎长啥样?Google 给出了TA的答案
  2. 2022年:机器人技术的重大革命
  3. zcu102 hdmi example(一)
  4. [转]带宽计算-大B与小b的区别
  5. ThunderNet:国防科大、旷视提出首个在ARM上实时运行的通用目标检测算法
  6. Data truncation: Data too long for column错误分析
  7. $.ajax中contentType属性为“application/json”和“application/x-www-form-urlencoded”的区别...
  8. Android 小组件完整案例
  9. Itext学习(一)----官方网站学习
  10. Modal中的确认和取消按钮
  11. 判断一个数是不是奇数
  12. 文件下载-解决IOS自带浏览器下载乱码的问题
  13. 机动车号牌查询, 在线查询, api 查询
  14. HTML语言中用什么标签来标识,为了标识一个html文件应该使用什么标签
  15. 影视剧中十大经典反派台词!(来自大洋论坛)
  16. java 定义一个学生类,利用无参和带参方法调用
  17. esp8266解析php,ESP8266 Bootloader开源代码解析之rboot(一)
  18. 为什么大部分企业面试官都会问GMV,GMV是什么?
  19. ARGB颜色快速取大对比度色(保留原本透明度)
  20. 常用软件官网下载大总结

热门文章

  1. 高程计算 高程计算 高程计算
  2. 航模入门经典教材:航空模型教材
  3. f018计算机辅助设计是什么,F018,丝印Marking-电子元件丝印查询
  4. oracle下载安装教程
  5. vba 定义类_类接口的实现及应用
  6. linux操作系统基础及应用课后答案,Linux操作系统课后习题答案及复习要点
  7. 动易 当前服务器不允许上传文件,动易网站详细安说明及常见疑难解答.doc
  8. 2023河海大学计算机考研信息汇总
  9. 文件夹无法删除详细解决方案(Windows版)
  10. 毕设:基于Spring Boot的旅游攻略网的设计与实现