今天看了下directui的源码:directui_src,界面上的元素都是通过XML来配置的。可不知道XML中数值的具体意思,希望谁能提供个directui文档给我看看。
还有,我现在手上的directui_src可以用于开发吗?还是只适合学习?XML格式如下:LPCTSTR CStartPageWnd::GetDialogResource() const 

   return "<Dialog>"
      "<HorizontalLayout>"
        "<VerticalLayout width=\"150\" >"
          "<Toolbar>"
            "<ToolGripper />"
          "</Toolbar>"
          "<NavigatorPanel>"
            "<PaddingPanel height=\"18\" />"
            "<NavigatorButton name=\"page_start\" text=\"<i 0> Start\" selected=\"true\" tooltip=\"Vis start siden\" />"
            "<NavigatorButton name=\"page_registers\" text=\"<i 4> Registre\" tooltip=\"Vis forskellige registre\" />"
            "<NavigatorButton name=\"page_systems\" text=\"<i 4> Systemer\" />"
            "<NavigatorButton name=\"page_configure\" text=\"<i 4> Ops鎡ning\" />"
            "<NavigatorButton name=\"page_reports\" text=\"<i 4> Rapporter\" />"
          "</NavigatorPanel>"
        "</VerticalLayout>"
        "<VerticalLayout>"
          "<Toolbar>"
            "<LabelPanel align=\"right\" text=\"<f 6><c #fffe28>Start Side</c></f>\" />"
          "</Toolbar>"
          "<ToolbarTitlePanel text=\"<f 7>Bjarke's Test Program</f>\" />"
          "<TitleShadow />"
          "<WindowCanvas water=\"StartWater\" >"
            "<VerticalLayout>"
              "<TextPanel text=\"<f 8>V鎙g startomr錮e?</h>\" />"
              "<FadedLine />"
              "<TileLayout scrollbar=\"true\" >"
                "<TextPanel name=\"link_registers\" text=\"<i 7 50><a><f 6>&Registre</f></a>\n<h>\n<c #444540>V鎙g denne menu for at rette i diverse registre i systemet.\n\nDu kan rette i kunde, vogn og chauff鴕-reigsteret.\" shortcut=\"R\" />"
                "<TextPanel name=\"link_systems\" text=\"<i 9 50><a><f 6>&Systemer</f></a>\n<h>\n<c #444540>Gennem denne menu kan du ops鎡te diverse ting.\" shortcut=\"S\" />"
                "<TextPanel name=\"link_configure\" text=\"<i 6 50><a><f 6>Ops鎡ning</f></a>\n<h>\n<c #444540>Ops鎡ning giver adgang til konfiguration af de mange k鴕sels-systemer og regler.\" />"
                "<TextPanel name=\"link_reports\" text=\"<i 5 50><a><f 6>Rapporter</f></a>\n<h>\n<c #444540>Rapporter giver dig overblik over registre samt hverdagens ture og bestillinger.\n\nGennem statistik og lister kan du hurtigt f?pr鎠enteret historiske data fra systemet.\" />"
              "</TileLayout>"
            "</VerticalLayout>"
          "</WindowCanvas>"
        "</VerticalLayout>"
      "</HorizontalLayout>"
      "</Dialog>";     
}

解决方案 »

  1.   

    部分的解析函数:CControlUI* CDialogBuilder::_Parse(CMarkupNode* pRoot, CControlUI* pParent)
    {
       CDialogLayoutUI* pStretched = NULL;
       IContainerUI* pContainer = NULL;
       CControlUI* pReturn = NULL;
       for( CMarkupNode node = pRoot->GetChild() ; node.IsValid(); node = node.GetSibling() ) {
          LPCTSTR pstrClass = node.GetName();
          SIZE_T cchLen = _tcslen(pstrClass);
          CControlUI* pControl = NULL;
          switch( cchLen ) {
          case 4:
             if( _tcscmp(pstrClass, _T("List")) == 0 )                  pControl = new CListUI;
             break;
          case 6:
             if( _tcscmp(pstrClass, _T("Canvas")) == 0 )                pControl = new CCanvasUI;
             else if( _tcscmp(pstrClass, _T("Button")) == 0 )           pControl = new CButtonUI;
             else if( _tcscmp(pstrClass, _T("Option")) == 0 )           pControl = new COptionUI;
             break;
          case 7:
             if( _tcscmp(pstrClass, _T("Toolbar")) == 0 )               pControl = new CToolbarUI;
             else if( _tcscmp(pstrClass, _T("TabPage")) == 0 )          pControl = new CTabPageUI;
             else if( _tcscmp(pstrClass, _T("ActiveX")) == 0 )          pControl = new CActiveXUI;
             break;
          case 8:
             if( _tcscmp(pstrClass, _T("DropDown")) == 0 )              pControl = new CDropDownUI;
             break;
          case 9:
             if( _tcscmp(pstrClass, _T("FadedLine")) == 0 )             pControl = new CFadedLineUI;      
             else if( _tcscmp(pstrClass, _T("TaskPanel")) == 0 )        pControl = new CTaskPanelUI;
             else if( _tcscmp(pstrClass, _T("Statusbar")) == 0 )        pControl = new CStatusbarUI;
             else if( _tcscmp(pstrClass, _T("TabFolder")) == 0 )        pControl = new CTabFolderUI;
             else if( _tcscmp(pstrClass, _T("TextPanel")) == 0 )        pControl = new CTextPanelUI;
             break;
          case 10:
             if( _tcscmp(pstrClass, _T("ListHeader")) == 0 )            pControl = new CListHeaderUI;
             else if( _tcscmp(pstrClass, _T("ListFooter")) == 0 )       pControl = new CListFooterUI;
             else if( _tcscmp(pstrClass, _T("TileLayout")) == 0 )       pControl = new CTileLayoutUI;
             else if( _tcscmp(pstrClass, _T("ToolButton")) == 0 )       pControl = new CToolButtonUI;
             else if( _tcscmp(pstrClass, _T("ImagePanel")) == 0 )       pControl = new CImagePanelUI;
             else if( _tcscmp(pstrClass, _T("LabelPanel")) == 0 )       pControl = new CLabelPanelUI;
             break;
          case 11:
             if( _tcscmp(pstrClass, _T("ToolGripper")) == 0 )           pControl = new CToolGripperUI;
             else if( _tcscmp(pstrClass, _T("WhiteCanvas")) == 0 )      pControl = new CWhiteCanvasUI;
             else if( _tcscmp(pstrClass, _T("TitleShadow")) == 0 )      pControl = new CTitleShadowUI;
             break;
          case 12:
             if( _tcscmp(pstrClass, _T("WindowCanvas")) == 0 )          pControl = new CWindowCanvasUI;
             else if( _tcscmp(pstrClass, _T("DialogCanvas")) == 0 )     pControl = new CDialogCanvasUI;
             else if( _tcscmp(pstrClass, _T("DialogLayout")) == 0 )     pControl = new CDialogLayoutUI;
             else if( _tcscmp(pstrClass, _T("PaddingPanel")) == 0 )     pControl = new CPaddingPanelUI;
             else if( _tcscmp(pstrClass, _T("WarningPanel")) == 0 )     pControl = new CWarningPanelUI;
             break;
          case 13:
             if( _tcscmp(pstrClass, _T("SeparatorLine")) == 0 )         pControl = new CSeparatorLineUI;
             else if( _tcscmp(pstrClass, _T("ControlCanvas")) == 0 )    pControl = new CControlCanvasUI;
             else if( _tcscmp(pstrClass, _T("MultiLineEdit")) == 0 )    pControl = new CMultiLineEditUI;
             else if( _tcscmp(pstrClass, _T("ToolSeparator")) == 0 )    pControl = new CToolSeparatorUI;
             break;
          case 14:
             if( _tcscmp(pstrClass, _T("VerticalLayout")) == 0 )        pControl = new CVerticalLayoutUI;
             else if( _tcscmp(pstrClass, _T("SingleLineEdit")) == 0 )   pControl = new CSingleLineEditUI;
             else if( _tcscmp(pstrClass, _T("SingleLinePick")) == 0 )   pControl = new CSingleLinePickUI;
             else if( _tcscmp(pstrClass, _T("NavigatorPanel")) == 0 )   pControl = new CNavigatorPanelUI;
             else if( _tcscmp(pstrClass, _T("ListHeaderItem")) == 0 )   pControl = new CListHeaderItemUI;
             else if( _tcscmp(pstrClass, _T("GreyTextHeader")) == 0 )   pControl = new CGreyTextHeaderUI;
             break;
          case 15:
             if( _tcscmp(pstrClass, _T("ListTextElement")) == 0 )       pControl = new CListTextElementUI;
             else if( _tcscmp(pstrClass, _T("NavigatorButton")) == 0 )  pControl = new CNavigatorButtonUI;      
             else if( _tcscmp(pstrClass, _T("TabFolderCanvas")) == 0 )  pControl = new CTabFolderCanvasUI;      
             break;
          case 16:
             if( _tcscmp(pstrClass, _T("ListHeaderShadow")) == 0 )      pControl = new CListHeaderShadowUI; 
             else if( _tcscmp(pstrClass, _T("HorizontalLayout")) == 0 ) pControl = new CHorizontalLayoutUI;
             else if( _tcscmp(pstrClass, _T("ListLabelElement")) == 0 ) pControl = new CListLabelElementUI;
             else if( _tcscmp(pstrClass, _T("SearchTitlePanel")) == 0 ) pControl = new CSearchTitlePanelUI;
             break;
          case 17:
             if( _tcscmp(pstrClass, _T("ToolbarTitlePanel")) == 0 )  pControl = new CToolbarTitlePanelUI;
             else if( _tcscmp(pstrClass, _T("ListExpandElement")) == 0 ) pControl = new CListExpandElementUI;
             break;
          }
          // User-supplied control factory
          if( pControl == NULL && m_pCallback != NULL ) {
             pControl = m_pCallback->CreateControl(pstrClass);
          }
          ASSERT(pControl);
          if( pControl == NULL ) return NULL;
          // Add children
          if( node.HasChildren() ) {
             _Parse(&node, pControl);
          }
          // Attach to parent
          if( pParent != NULL ) {
             if( pContainer == NULL ) pContainer = static_cast<IContainerUI*>(pParent->GetInterface(_T("Container")));
             ASSERT(pContainer);
             if( pContainer == NULL ) return NULL;
             pContainer->Add(pControl);
          }
          // Process attributes
          if( node.HasAttributes() ) {
             TCHAR szValue[500] = { 0 };
             SIZE_T cchLen = lengthof(szValue) - 1;
             // Set ordinary attributes
             int nAttributes = node.GetAttributeCount();
             for( int i = 0; i < nAttributes; i++ ) {
                pControl->SetAttribute(node.GetAttributeName(i), node.GetAttributeValue(i));
             }
             // Very custom attributes
             if( node.GetAttributeValue(_T("stretch"), szValue, cchLen) ) {
                if( pStretched == NULL ) pStretched = static_cast<CDialogLayoutUI*>(pParent->GetInterface(_T("DialogLayout")));
                ASSERT(pStretched);
                if( pStretched == NULL ) return NULL;
                UINT uMode = 0;
                if( _tcsstr(szValue, _T("move_x")) != NULL ) uMode |= UISTRETCH_MOVE_X;
                if( _tcsstr(szValue, _T("move_y")) != NULL ) uMode |= UISTRETCH_MOVE_Y;
                if( _tcsstr(szValue, _T("move_xy")) != NULL ) uMode |= UISTRETCH_MOVE_X | UISTRETCH_MOVE_Y;
                if( _tcsstr(szValue, _T("size_x")) != NULL ) uMode |= UISTRETCH_SIZE_X;
                if( _tcsstr(szValue, _T("size_y")) != NULL ) uMode |= UISTRETCH_SIZE_Y;
                if( _tcsstr(szValue, _T("size_xy")) != NULL ) uMode |= UISTRETCH_SIZE_X | UISTRETCH_SIZE_Y;
                if( _tcsstr(szValue, _T("group")) != NULL ) uMode |= UISTRETCH_NEWGROUP;
                if( _tcsstr(szValue, _T("line")) != NULL ) uMode |= UISTRETCH_NEWLINE;
                pStretched->SetStretchMode(pControl, uMode);
             }
          }
          // Return first item
          if( pReturn == NULL ) pReturn = pControl;
       }
       return pReturn;
    }
      

  2.   

    还有,差点忘记了,directui 中的XML解析不了中文,有乱码。
    我想在前加个:charset=UTF-8 什么的。好像也是不行?
      

  3.   

    不需要写charset=UTF-8 什么的。
    只要将xml文件以utf8格式保存.
      

  4.   

    没有XML文件,是直接在代码中,初始化的:LPCTSTR CStartPageWnd::GetDialogResource() const 

       return "<Dialog>"
          "<HorizontalLayout>"
            "<VerticalLayout width=\"150\" >"
              "<Toolbar>"
                "<ToolGripper />"
              "</Toolbar>"
              "<NavigatorPanel>"
                "<PaddingPanel height=\"18\" />"
                "<NavigatorButton name=\"page_start\" text=\"<i 0> Start\" selected=\"true\" tooltip=\"Vis start siden\" />"
                "<NavigatorButton name=\"page_registers\" text=\"<i 4> Registre\" tooltip=\"Vis forskellige registre\" />"
                "<NavigatorButton name=\"page_systems\" text=\"<i 4> Systemer\" />"
                "<NavigatorButton name=\"page_configure\" text=\"<i 4> Ops鎡ning\" />"
                "<NavigatorButton name=\"page_reports\" text=\"<i 4> Rapporter\" />"
              "</NavigatorPanel>"
            "</VerticalLayout>"
            "<VerticalLayout>"
              "<Toolbar>"
                "<LabelPanel align=\"right\" text=\"<f 6><c #fffe28>Start Side</c></f>\" />"
              "</Toolbar>"
              "<ToolbarTitlePanel text=\"<f 7>Bjarke's Test Program</f>\" />"
              "<TitleShadow />"
              "<WindowCanvas water=\"StartWater\" >"
                "<VerticalLayout>"
                  "<TextPanel text=\"<f 8>V鎙g startomr錮e?</h>\" />"
                  "<FadedLine />"
                  "<TileLayout scrollbar=\"true\" >"
                    "<TextPanel name=\"link_registers\" text=\"<i 7 50><a><f 6>&Registre</f></a>\n<h>\n<c #444540>V鎙g denne menu for at rette i diverse registre i systemet.\n\nDu kan rette i kunde, vogn og chauff鴕-reigsteret.\" shortcut=\"R\" />"
                    "<TextPanel name=\"link_systems\" text=\"<i 9 50><a><f 6>&Systemer</f></a>\n<h>\n<c #444540>Gennem denne menu kan du ops鎡te diverse ting.\" shortcut=\"S\" />"
                    "<TextPanel name=\"link_configure\" text=\"<i 6 50><a><f 6>Ops鎡ning</f></a>\n<h>\n<c #444540>Ops鎡ning giver adgang til konfiguration af de mange k鴕sels-systemer og regler.\" />"
                    "<TextPanel name=\"link_reports\" text=\"<i 5 50><a><f 6>Rapporter</f></a>\n<h>\n<c #444540>Rapporter giver dig overblik over registre samt hverdagens ture og bestillinger.\n\nGennem statistik og lister kan du hurtigt f?pr鎠enteret historiske data fra systemet.\" />"
                  "</TileLayout>"
                "</VerticalLayout>"
              "</WindowCanvas>"
            "</VerticalLayout>"
          "</HorizontalLayout>"
          "</Dialog>";     
    }
    还有这里面的数值具体的含义是什么?谁有研究过directui,指导下·!~!
      

  5.   

    哦,那就在代码中改成unicode吧.
    const wchar_t* CStartPageWnd::GetDialogResource() const 

       return L"<Dialog>"
          L"<HorizontalLayout>"
    ............
    }
      

  6.   

    沒有文檔,不過問題不大啊,作者只是使用了一種非標準的xml,在顯示字符之前加上了若干控制符,以達到不同的顯示效果。
      

  7.   

    但是 , 我现在如果想绘制个 ImagePanel ,格式就不知道该怎么写了?
      

  8.   

    哦,那說明一下好了,首先是Dialog節點,然後是Layout節點。這兩個都只能是唯一節點,就是說不能有同級的節點存在,否則會出錯。至於是哪個Layout,就按你的需要了。然後再添加各種Panel或者控件。
      

  9.   

    好多人把DirectUI狂的很炫,甚至于要专门成为一门学术来进行研讨。其实,这样是给不是很懂控件开发的程序员们一种误解。熟悉windows开发的人都清楚。windows是消息驱动的,任何一个窗口。对话框,框架,甚至于按钮等全部是一个窗口。只要是窗口,就会有消息循环,有消息循环,就会接收并且可以处理大多数的windows消息。     比如,鼠标按下或者抬起会响应WM_LBUTTONDOWN WM_LBUTTONUP, 而如果要绘制内容(按钮的各种正常、按下、不可用状态),菜单的鼠标滑过、按下等等,所有的表现形式,必须在WM_PAINT 消息中,也就是 OnPaint处理函数中,进行绘制过程,c#,delphi等等语言都相同,无非就是封装的程度不同罢了。好多还不是很熟悉windows的程序开发人员一般会提出这样或那样的问题。为什么我绘制的图像一挡窗口就消失了。 读到这里您应该明白了。你不应该在OnPaint消息之外的任何地方进行绘制。否则当然会消失。     这里可能又有人会问了,那我想鼠标按下开始绘制矩形,鼠标移动后又绘制终点,难道不在这个时候绘制? 而要到OnPaint中绘制吗?感觉想不通。这个地方我希望入门的兄弟姐妹们好好思考一下。我们应该建立一个数据模型。比如任何业务处理中存储一些数据,而在绘制过程中(OnPaint)函数中来根据这些数据进行视觉表达。     至于DirectUI。和前面所讲的处理方式有所不同,说明白就是定义一些数据结构,来进行消息的处理与绘制过程。这些数据结构要定义好某个非窗口控制(按钮,滚动条等等)的显示区域,然后根据鼠标和键盘以及其他的一些需求来在预定的区域绘制不同的表现形式。至于DirectUI无非是注册了一个窗口类叫DirectUI罢了。并不是一种技术而已。我们其实接触这样的例子很多很多。全部的游戏内的窗口等都是。     我给大家具个例子。扑克牌的游戏大家一定都知道吧。鼠标点击某个扑克牌就会跳起火者出牌等。难道每一个扑克牌都是一个窗口??? 我们可以把扑克牌看成一个特殊的控制,比如按钮。鼠标移动到指定的区域,然后绘制相应的表现罢了。     这方面做得比较好的有 珠海优软 精灵画笔软件http://www.eusoftware.com/这里还有一个例子 http://www.skinfeature.com/bbs/a/a.asp?B=3&ID=20其他的类视的代码应该还比较多吧。大家可以baidu查找下载学习。
      

  10.   

    个人其实挺想用DirectX实现软件界面的,不过写套UI实在是很烦人……或者用HTML做界面也未尝不可……
      

  11.   

    DirectUI就是在资源中用XML来描述界面,然后自行绘制而已。这种方式很好,但也没什么神奇的。
    你想添加那种界面元素,可以添加XML节点,自行定义绘制处理函数即可。
      

  12.   

    IS 高薪诚聘UI界面 VC++开发高级工程师.
    要求:
    1. VC++ 开发有2年以上经验,熟悉MFC 
    2. 有使用VC++开发过Skin UI产品的经验
    3. 工作勤奋,有团队意识,能很好的和其他人协作.
    招聘时间:
    到 2009-4-1近期工作目标:
    1.开发出最好的UI界面
    能换肤,能界面能变形. 
    类似的软件产品如:QQ, Media Player公司介绍:
    IS公司是一家高速发展中的互联网软件公司,现处于创业已起步阶段,已有多家投资公司投资.
    我们专注于互联网的娱乐增值服务,目前开发的IS游戏语音平台,是NO.1 .
    只要你通过baidu 或者google搜索 :"游戏语音",甚至 "语音",
    您在最前面的搜索结果会看到: iSpeak 游戏语音 团队语音
    我们的产品都是以口碑相传,已经千万级注册用户,同时在线有几十万,他们多是我们最忠实的用户.
    您的加盟是我们IS公司发展的最大力量.您的智慧,经验,勤奋都有希望成为我们的中坚力量.
    欢迎您加入我们的团队.公司网址: 
    www.ipark.cn
    公司地址:
    上海市徐家汇。
    工作地点:
    上海市徐家汇数娱大厦(番愚路与虹桥路交叉口)。联系方式:
    MSN:  [email protected]   (加MSN ,请注明 UI VC++开发应聘)
    email [email protected]  (请把简历发到此邮箱)
      

  13.   

    楼主可以看看我们的DirectUI:我们公司开发这款产品:DirectUI 网站:http://www.directui.com我公司的网站:http://www.uipower.com下面是我们用DirectUI开发的案例:中科大洋的产品:
    http://www.uipower.com/userfiles/mam_01.jpg江民杀毒软件产品:
    http://www.uipower.com/userfiles/jiangmin_image.jpg盛大PPNext产品:
    http://www.uipower.com/userfiles/PPNext2.jpg
      

  14.   

    同样 在找文档啊啊,XML 里面的 大部分能看懂,但是光靠看一两个demo,要写出好东西来还是 有点勉强啊。
    好多 属性都 不知道 怎么添加。