一直都觉得像类似QQ09这种界面并不是真正无句柄,只是用某种手段隐藏了,直到论坛上看到这篇文章
http://www.viksoe.dk/code/windowless1.htm
后来陆续发现,360最新版,QQ影音,甚至金山快快,都没有句柄。
就如有人说WPF是桌面界面开发大趋势,优点不言而喻,只不过转型要时间。
那么对于这种无句柄方式,看到的软件日益增多。上面地址里的源代码下来看过一点点(太多了),封装思想、原理果然和MFC很大不同,可能设计模式应用不多,还没有总结各个类的功能、构成。就从他的代码来看,基本是全用自己造的轮子,思维也非常好,对win32编程掌握深刻,设计模式也应用的到位,可能接触过很多UI框架(他提到应用java的控件容器思想)才有这样的构想。
但个人觉得,即使采用他的架构,从开发效率上也要熟悉他的想法,这样只不过从一种模式转移到另一种模式,他的界面可以很炫,但MFC同样可以做,对个人而言,mfc开发难度更小。最后,问题如题。谢谢!

解决方案 »

  1.   

    灌水,接分,完全不懂
    为什么用SPY++查QQ2010还是有window handle这一项呢
      

  2.   

    就类似网址中的demo,只是最外层框架,那个都没有怎么是windows程序?
      

  3.   

    本质上大家都没有区别。
    窗口用句柄来表示,无句柄的“窗口”或“控件”肯定有另一种比较私有的表示方法。
    任何窗口不管有没有句柄,都是屏幕上的一块区域。这些区域可以互相遮盖,互相裁剪。
    无论屏幕上怎么划分窗口区域,都给它取个名字,有人给它取名“句柄”,有人给它取名“画布”,有人给它取名“表面”……句柄用多了,控制方式成熟了,已经成为工业标准,所以搞特权,单列出来叫“有句柄窗口”,其它类型的统称为“无句柄窗口”,更好听的名字是“DirectUI”。这就是历史由来,所有窗口没有什么不同。无句柄窗口由于没有标准,私密性强,被认为很安全,一旦它也成为标准,它的下场就是另一个“有句柄窗口”。
      

  4.   


    一些特殊环境下需要这种“非正常的窗口绘图”,比如SoftICE,syser等直接在ring0层画窗口。它们采用的是直接写显存的方式,比你的还要底N层。虽然这是极端情形,但没了他,单机内核调试显示交流几乎无解。
      

  5.   

    有句柄的窗口是系统级的,无句柄的窗口是应用级的。
    一般情况下你要处理系统级的窗口需要调用API,而且有的API并不是你想要的。只要你掌握了API就基本掌握了窗口。应用级的窗口就灵活多变一些,想开发更高级的功能也相对容易一些。
    将来的窗口都是3D的,拭目以待吧。
      

  6.   

    在Ring0 层画窗口,LZ弄的那个URL也办不到的。大哥可否在这点上提示下小弟,直接操作显存画窗口如何做?
      

  7.   

    貌似前面有人提到WPF是无句柄的??
      

  8.   

    有兴趣的可以去看看https://directui.googlecode.com/svn,采用http://www.viksoe.dk/code/windowless1.htm的代码,但把它移植到了wince平台
      

  9.   

    win 32 应用程序还可以没有handle,第一次听说,学习。
      

  10.   

    Direct UI? 只在一个窗口上画所需要的控件。这个在XP上就已经有应用了。
    LZ,可以直接查查Direct UI相关的东西。不过,现在都是商业应用,没有能让我们借鉴的代码~~
      

  11.   

    能实现更牛b的绘制效果~
    这是我很久前写的  现在已经更新很多了  找个机会上传上去~
    http://biyou.blog.51cto.com/957202/288938
      

  12.   

    viksoe的代码很好,这个可以被运用到商业上。
    个人觉得这个框架比mfc甚至wtl的在构架、思想上高N倍。
    首先 viksoe采用layout机制动态计算各子窗口的坐标位置,自适应屏幕大小的变化。而MFC要求子窗口的坐标位置硬编码,结果要适应不同分辨率的屏幕非常困难。GTK+在窗口布局时分为两个阶段,第一个阶段父窗口先询问子窗口的最佳大小,第二个阶段父窗口根据自己的大小计算子窗口的实际大小,子窗口根据实际大小进行调整。其次viksoe采用容器机制来合理分离控件的职责,MFC没有容器这个概念,很难实现递归组合。viksoe中差不多所有控件都是容器,都可以容纳其它任何控件,而MFC只有顶层窗口才是容器,可以容纳其它子控件。容器这个概念对代码重用的影响非常之大,这里举两个例子:其一是带图片的按钮(BitmapButton),在viksoe中它就是CCanvasUI类和CButtonUI的组合,而在MFC中,图片和文字都要自己绘制。前者的CCanvasUI类和CButtonUI可以在很多地方重用,而后都的绘制代码和事件处理代码只有自己才能使用。在MFC中,即使只是实现一个不同外观的列表框,你都要采用自绘的方式,代码重用非常困难,向列表框中加入其它控件就更麻烦了,要使用一些非同寻常的手段不可。另外说句在驱动里画gui,这个和普通gui有所不同,上面说的directUI还是用到了Windows的消息,而驱动里只能自己hook key 、mouse 中断。然后实现各种消息的派发。但这样对兼容usb接口的键盘很成问题。这实际相当于自己实现了win32k里面的内容。而驱动里面画图其实不过是自己写显存。但又有很多兼容问题要解决,别的不说,每种显卡的显存位置就要自己实现,所以softICE直接做不下去了,syser在部分机器上也得靠directX来获取显存。
    我的blog hi.baidu.com/weolar
      

  13.   

    另外快快的代码我看了看,也不算是directUI吧,还是能找到控件的。
      

  14.   

    只是UI框架而已 MFC并不只是UI框架而已 不过不可否认的是MFC过于臃肿 
    大部分公司都会有自己的UI框架 以实现统一布局 界面美化 换肤等功能 
    而一些简单的控件自然会重写掉 成为无句柄的控件 
    说到底原理只是这套UI框架自己会维护一个容器和子控件的关系,并进行排版和绘制 和消息的分发
    是不是句柄倒是其次,一般来说一些实现很复杂的控件,比如CListCtrl之类还是有句柄的 因为自己实现这么个控件花费时间太大 而且不一定通用 具体可以看看360程序 里面TABControl仍旧是继承有句柄控件实现的PS:LZ的确火星了,很早前就是这么实现了,可以用spy++看看以前的一些软件 
    不过最纯净的是无句柄UI框架的软件就我现在看过的就是QQ和网易的闪印
    其他或多或少都是有些句柄的
      

  15.   


    第二点WPF就是这么个实现 而swing感觉很早之前就这样了
      

  16.   

    Java的Swing就是DirectUIDirectUI窗体至少得有一个主窗体.其余自绘.做好覆盖,重绘工作.
      

  17.   

    个人理解,类似于游戏中使用BitBlt贴图的方式自己画控件,然后根据主窗口坐标捕获事件的方式吧,
    这样做可能省掉了创建控件带来的系统管理上的开销,然后实现更换皮肤也更方便。
    个人觉得QQ现在那么庞大,创建控件的那点儿开销可以忽略不计,主要还是为了实现皮肤效果和一些界面上的动态效果用。
      

  18.   

    PS,我觉得directUI还有个很重要的优势,就是别人不好搞整你的程序了。比如QQ2009,要通过编程的方式,去找到一个好友,然后给他发消息,就比以前版本麻烦(不考虑通过模拟鼠标操作的方式).
      

  19.   

    MFC开发有点带着镣铐跳舞的感觉,directUI则自由多了。而且更易于将实现与界面分离。
      

  20.   

    HTMLayoutSDK   有时间看下这个,比较好用,用spy++去抓,也抓不到任何窗口,而且简单.htm文件描述,做界面那叫一个方便,效果也很不错,关键是免费,现在我都转这个做界面了.
      

  21.   

    应该是自己的窗口管理机制,不同于windows提供标准窗口,就像上面朋友说的应用级,可以看做是的非标准的窗口体系。就像游戏有自己的窗口系统一样。
    几年不来,变化很大啊。落后了。
      

  22.   

    我现在正在研究viksoe的这个DirectUI库,把它改写成wchar_t的了,并把类库中使用的CWindowWnd换成了atl/wtl的CWindowImpl, 我准备好好的在这个DirectUI库的基础上把这个库进行进一步的开发,做一个好用的强大的DirectUI库,有兴趣一块开发的可以联系我,放到Google code上,大家一块做[email protected]
    csdn上留言也行.不过不会经常查看
      

  23.   

    怎么看,感觉这种区别就好比Thread和Fiber那样(当然直接写显存的除外),各有利弊,很难说得清楚。但是相对有句柄的窗体而言,似乎更依赖于Windows的窗体框架,相对移植性而言,或许受到的牵制会更大。另外,个人以为处理消息也是一个问题,窗体句柄越多,受到的消息“干扰”也就越多,或许很多人对这些消息不以为然。但是对于拥有良好设计的系统而言,确实不会有什么大的问题,但是对于商业软件来讲,越是对于象游戏那样绘图也需要讲求效率(要知道很多人为了美化界面进行的自绘,实际上稍稍设计有点不合理就可能会重复绘制,而这些带来的消耗多了,绝对不是可以忽略的)的系统,有一个更为良好的界面绘制管理架框,比由Windows自身提供的窗体缓制消息响应模式,会在很多方面得到良好的可限制性和可控制性。
      

  24.   

    安全性.第三方软件得不到你的句柄,也就无法对你的窗体进行操作.
    GetItemText,PostMessage等等.
      

  25.   

    没有勇敢WFC, 以前偶们公司的界面, 是偶们用VC一个一个的画上去的, 还整的很炫,没有VC办不了的事,可能只有差别,效率的问题, 感觉用自己喜欢,熟练的工具去开发,总比去重0学另外一门工具好。
      

  26.   

    不是窗口没有句柄,而是所有的子窗口不用window的句柄来让windows来管理子窗口了。
    比如一个button,一个list在MFC里边实际上都是一个一个的真窗口(具有HANDLE,并且windows会传递此窗口的消息),而在这种界面里边,看起来是一个button,实际上只是画成了一个button的样子,通过计算鼠标位置(相对于最外边的那个有HANDLE的窗口)来画出相应的mouseover,click等等情况的样子。
    楼上也有人说这个自己造轮子,确实是自己造轮子,因为所有的控件都需要重新写(Button,checkbox,list, tree, richedit.......)
    我原来的公司专门做这个,花了3年时间。写一写对了解WINDOWS SDK很有帮助。
      

  27.   

    还是用sdk开发,只是再次自己实现了一套控件库。这套库全是绘制,没使用子窗口。俗称“DirectUI”,
    跟游戏开发的DirectX没任何关系。DirectUI意为直接在父窗口上绘图(Paint on parent dc directly)。即子窗口不以窗口句柄的形式创建(windowless),只是逻辑上的窗口,绘制在父窗口之上。微软的“DirectUI”技术广泛的应用于Windows XP,Vista,Windows 7,如浏览器左侧的TaskPanel,控制面板导航界面,Media Player播放器,即时通讯工具MSN Messager等。
      DirectUI好处在于可以很方便的构建高效,绚丽的,非常易于扩展的界面。国外如微软,国内如腾讯,百度等公司的客户端产品多采用这种方式来组织界面,从而很好的将界面和逻辑分离,同时易于实现各种超炫的界面效果如换色,换肤,透明等。 DirectUI 旨在满足客户端界面快速开发的需要,同时融入业界前沿的皮肤技术,为用户创建更加高效,专业的界面。
      2.1 DirectUI 主要特性
      ◆ 支持皮肤对象的布局
      ◆ 支持皮肤脚本(JavaScript)控制,可以让界面与逻辑彻底分离
      ◆ 支持bmp、png、jpg、gif、tga等图片格式
      ◆ 支持多图层Alpha混合特效
      ◆ 提供界面设计工具DirectUI Builder,支持拖拽式界面设计,让界面开发所见即所得
      ◆ 开放式开发平台,所有控件均为插件方式管理,支持用户自定义控件开发,与DirectUI平台无缝兼容
      ◆ 支持Windows平台所有的开发工具(VC++、VB6、VS.Net、PowerBuilder、Delphi、C++Builder、E语言)
      ◆ 支持所有标准控件的换肤
      ◆ 支持皮肤对象的导出与导入
      ◆ 支持Windows主题导入,让标准界面皮肤的制作简单快捷
      ◆ 让客户端代码简洁明了
      

  28.   

    direct UI 就每每月容器  控件的概念了 不过就一一个主窗口而已 。通用性不强啊。