这个界面库是开源的,地址在http://www.oschina.net/p/duilib下载了源码,想看看里面的绘图机制,尤其是按钮等需要随鼠标消息切换的。
看了下源码,没有找到我想了解的,或者说没有找到一个途径去看,随源码附带的例子里,貌似响应消息的也没有绘图相关的代码,按钮类的绘制函数里面,倒是有setfocus的字样,可是对应的处理却是一个invalidate,并没有其他的设置状态等等。
绘制按钮的图片又是何时进行加载,绘制的方式又是怎样?希望有熟悉这个库或者了解类似的界面库原理的前辈朋友为我解惑,DirectUI技术里面的绘图机制是怎么样的?或者指点一下源码的哪个文件的哪些相关函数做了这些操作。

解决方案 »

  1.   

    目前我了解到的DUI就是一个配置文件(很多用XML)+一个协议+绘制(就是平常的绘制)
      

  2.   

    LZ看下这些类
    CPaintManagerUI -> 管理控件的绘制以及消息处理分发等功能
    其中关联了真正的主窗口HWDN以及HOVER,FOCUS,CLICK等控件指针。CControlUI -> 大多控件的基类。
    包含控件各种属性,需要子类控件处理的消息的虚函数等。button响应消息过程
    1.CPaintManagerUI findcontrol,根据点找到CControlUI
    2.该控件调用虚函数的DoEvet(如按钮具体是改变自身一些flag)
    3.调用基类(CControlUI)的Invalidate.(此Invalidate是依次找父UI(layout之类)和当前区域相交结果,只刷新那一部分).
    4.m_pRoot调用DoPaint。从最下层依次调用有子关系的CControlUI的DoPaint。(涉及剪切,区域相交等)加载应该是初始化对话框根据资源的xml加载。
    具体读CDialogBuilder::Create CControlUI::SettAttribute
      

  3.   

    看到了你的留言,楼上说的DuiLib那个开源库的过程比较全面了。但关键是你还没有理解DirectUI是什么就视图从源码找出来是怎么搞的。
    DirectUI通俗来说就是在窗口上指定一块区域(仅仅是一个区域,不是一个实体控件)通过各种消息模拟一个控件的功能。完全可以在一个对话框类的OnMouseMove、OnLButtonDown等函数中模拟一个按钮出来。但是模拟的控件一多就混乱了,为了统一管理,逻辑上更清晰类似于实体控件。把每种控件封装成类处理各种消息,并通过自定义的消息分发机制把消息分发到各个模拟控件里。知道了DirectUI的机制以后,再去看代码,思路上逻辑上就很清晰了!