DHTML设计VC界面《二》- 背景

 

 首先我们生成一个基于DHtmlDialog编程的DHtmlUIDemo工程来做实现这个UI背景

 

  1. HTML资源准备

    把美工做好的HTML替换到程序的HTML文件中,图片资源文件放到res/下

    

    HTML代码如下

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  2. <html>
  3. <head>
  4.     <title>maindialog</title>
  5.     <style>
  6. body {
  7.     margin:0;
  8.     color:#fff;
  9.     font-size:12px;
  10. }
  11.    .sbTxt
  12.     {
  13.     color:#FFF;
  14.     float:left;
  15.     font:normal 12px 'Trebuchet MS','Arial';
  16.     }
  17.    .wh
  18.     {
  19.     color:#FFF;
  20.     float:left;
  21.     font:normal 9px 'Trebuchet MS','Arial';
  22.     }
  23.    .logout
  24.     {
  25.      cursor:hand;
  26.     color:#FFF;
  27.     float:left;
  28.     font:normal 9px 'Trebuchet MS','Arial';
  29.     text-decoration:underline;
  30.     }
  31.    .setting
  32.     {
  33.      cursor:hand;
  34.     color:#FFF;
  35.     float:left;
  36.     font:normal 9px 'Trebuchet MS','Arial';
  37.     text-decoration:underline;
  38.     }
  39.     .whs
  40.     {
  41.     color:#FFF;
  42.     float:left;
  43.     font:normal 15px 'Trebuchet MS','Arial';
  44.     }
  45.  .td_normal
  46.      {
  47.      cursor:hand;
  48.      }
  49.      .td_normal span
  50.      {
  51.         color:#FFF; /* 默认链接颜色 */
  52.         float:center;
  53.         text-decoration:none;
  54.         font:normal 8px 'Trebuchet MS','Arial';
  55.      }
  56.      .td_hover
  57.      {
  58.      cursor:hand;
  59.      background: url(res/button.png) no-repeat left center;
  60.      }
  61.      .td_hover span
  62.      {
  63.         color:#FFF; /* 默认链接颜色 */
  64.         float:center;
  65.         text-decoration:none;
  66.         font:normal 8px 'Trebuchet MS','Arial';
  67.      }
  68.      .td_gray
  69.      {
  70.         filter:gray;
  71.      }
  72.      .td_gray span
  73.      {
  74.         color:#999; /* 默认链接颜色 */
  75.         float:center;
  76.         text-decoration:none;
  77.         font:normal 8px 'Trebuchet MS','Arial';
  78.      }
  79.      .text
  80. {
  81.     border:1px solid #3261a7;
  82.     font:normal 12px 'Trebuchet MS','Arial';
  83. }
  84.    .bl
  85.     {
  86.     color:#FFF;
  87.     font:normal 9px 'Trebuchet MS','Arial';
  88.     }
  89. .btn {
  90.     background:url(res/btn.gif) no-repeat;
  91.     height:35px;
  92.     width:81px;
  93.     color:#fff;
  94.     border:none;
  95.     cursor:pointer;
  96.     font-size:14px;
  97. }
  98.  /*for tab*/
  99.  .tab1,.tab2{
  100.  border: 1px solid #CAE2FD;
  101.  border-bottom:none;
  102.  }
  103.  .tab2{
  104.  border-left:none;
  105.  }
  106.  .tab_current
  107.  {
  108.     cursor:hand;
  109.     border-bottom:1px solid #406DB0;
  110.     font:normal 9px 'Trebuchet MS','Arial';
  111.     height:23px;
  112.     padding:2px 6px 0 6px;
  113.     line-height:19px;
  114.     text-align:center;
  115.     color:#ffffff;
  116. }
  117.  .tab_normal
  118.  {
  119.     cursor:hand;
  120.     font:normal 9px 'Trebuchet MS','Arial';
  121.     height:23px;
  122.     padding:2px 6px 0 6px;
  123.     line-height:19px;
  124.     text-align:center;
  125.     border-bottom: 1px solid #CAE2FD;
  126.     color:#aeaeae;
  127.  }
  128.  .tab_hover
  129.  {
  130.     cursor:hand;
  131.     border-bottom:1px solid #CAE2FD;
  132.     font:normal 9px 'Trebuchet MS','Arial';
  133.     height:23px;
  134.     padding:2px 6px 0 6px;
  135.     line-height:19px;
  136.     text-align:center;
  137.     color:#ffffff;
  138.  }
  139.  .tab {
  140.     position:relative;
  141.     z-index:2;
  142.     top:4px;
  143.  }
  144.  .content
  145.  {
  146.     width:100%;
  147.     height:90%;
  148.     clear:both;
  149.     padding-top:5px;
  150.     background:#406DB0;
  151.     border:1px solid #CAE2FD;
  152.     position:relative;
  153.     
  154.     z-index:1;
  155.  }
  156.  .statusBar {
  157.     height:20px;
  158.     position:absolute;
  159.     bottom:0;
  160.     z-index:100;
  161.     width:100%;
  162.     border:none;
  163.     background:url(res/statusbar_bg.jpg) repeat-x #7FA7E2;
  164.  }
  165.   .statusBar img{
  166.   position:absolute;
  167.   right:0;
  168.   bottom:0;
  169.  }
  170.         </style>
  171.  </head>
  172.  <body leftmargin="0" topmargin="0">
  173. <img id=bkd style="position:absolute;width:100%;height:100%;z-index:-10" src="res/bg.jpg">
  174. <table id=tbOnline class="tab" width=100border=0 cellpadding=0 cellspacing=0>
  175. <tr><td valign=top>
  176.     <table  width=100cellpadding=0 cellspacing=0 border=0>
  177.     <tr>
  178.     <td align="left" valign=top>
  179.         <table>
  180.         <tr><td height=70>
  181.             <table cellpadding="0" cellspacing="0" border="0" id="tbToolbar">
  182.             </table>
  183.     </td></tr>
  184.     <tr><td valign=bottom>
  185.         <table  id=tbTab cellpadding="0" cellspacing="0" border=0>
  186.         </table>
  187.     </td></tr>
  188.     </table>
  189.     </td>
  190.     <td align="right" valign="top">
  191.     <table>
  192.     <tr><td valign=bottom><div class=bl id=divNickname></div></td><td> </td><td valign="bottom"><span class=setting id=divSetting>设置</span></td><td><span class=whs>|</span></td><td valign="bottom"><span class=logout id=divLogout>注销</span></td><td> </td></tr></table>
  193.     </td>
  194.     </tr>
  195.     </table>
  196. </td></tr>
  197. </table>
  198. <div class=content id=content></div>
  199. <div class="statusBar" id=statusBar><span class="sbTxt" id="sbTxt"></span><img id=imgStatus src="res/icon_resize.gif" alt="调整窗口大小" /></div>
  200. </body>
  201. </html>

       2. 基本代码准备

      2.1包含CHtmlEditor类库;

      2.2书写几个基本函数,主要用于替换HTML内部的相对地址到程序绝对地址,为什么有这份工作呢?因为我们的Demo程序使用的Html是包含在程序内部的HTML资源,那么默认资源寻址将对于exe文件有效,这是什么意思呢?,假如你的html里面有一段<img src=res/title.gif>,那么解析器并不会去找当前目录下的res子目录,而是会去找exe资源中的叫做"res/title.gif"的内部资源,我们必须手工将所有相对地址转向到"file///你的执行文件目录/res/图片资源"这样的地址,当然还有另外一种办法,就是让程序初始化不要加载exe里的html资源,而是直接加载硬盘上的html文件,这样相对寻址就会有效了,不需要做file:///这样的转换    

  1. std::string   _replace(std::string   &str,   const   char   *string_to_replace,   const   char   *new_string)
  2. {   
  3.     int   index   =   str.find(string_to_replace);   
  4.     while(index   !=   std::string::npos)   
  5.     {   
  6.         str.replace(index,   strlen(string_to_replace),   new_string);   
  7.         index   =   str.find(string_to_replace,   index   +   strlen(new_string));   
  8.     }   
  9.     return   str;   
  10. }   
  11. string _addabsurl(string abs)
  12. {
  13.     _replace(abs,"/","//");
  14.     char path[_MAX_PATH];
  15.     ::GetModuleFileName(0,path,sizeof(path));
  16.     string tmp = path;
  17.     int pos = tmp.rfind('//');
  18.     string folder = tmp.substr(0,pos);
  19.     char url[_MAX_PATH];
  20.     sprintf_s(url,sizeof(url),"file:///%s//%s",folder.c_str(),abs.c_str());
  21.     return url;
  22. }
  23. string _repleaseurl(string src)
  24. {
  25.     string filter = "res://";
  26.     if(src.substr(0,filter.length())!=filter)
  27.         return src;
  28.     src = src.substr(filter.length(),src.length()-filter.length());
  29.     int pos = src.find('/');
  30.     string abs = src.substr(pos+1,src.length()-pos-1);
  31.     return _addabsurl(abs);
  32. }
  33. string _repleaserule(string src)
  34. {
  35.     int pos = src.find('(');
  36.     int pos2 = src.find(')');
  37.     string abs = src.substr(pos+1,pos2-pos-1);
  38.     string chg = _addabsurl(abs);
  39.     return _replace(src,abs.c_str(),chg.c_str());
  40. }

      2.3  CDHtmlUIDemoDlg内部基本初始化代码

  我们需要在OnNavigateComplete当页面加载完成后把页面内部图片地址做绝对转换

  1. void CDHtmlUIDemoDlg::ChangeImgSrc(string tag)
  2. {
  3.     CComPtr<IHTMLElement> elem;
  4.     CDHtmlDialog::GetElement(tag.c_str(),&elem);
  5.     cHtmlImg img(elem);
  6.     if(img.Valid())
  7.     {
  8.         img.SetSrc(_repleaseurl((LPCTSTR)img.GetUrl()).c_str());
  9.     }
  10. }
  11. cHtmlStyleSheet CDHtmlUIDemoDlg::GetStyleSheet()
  12. {
  13.     try
  14.     {
  15.         CComPtr<IHTMLStyleSheetsCollection> i_Collect;
  16.         CComQIPtr<IHTMLStyleSheet, &IID_IHTMLStyleSheet> i_Sheet;
  17.         if(this->m_spHtmlDoc==NULL)
  18.             throw string("empty");
  19.         this->m_spHtmlDoc->get_styleSheets(&i_Collect);
  20.         long s32_Len;
  21.         i_Collect->get_length(&s32_Len);
  22.         if(s32_Len<=0)
  23.             throw string("Error");
  24.         CComVariant v_Index(0);
  25.         CComVariant  v_StyleSheet;
  26.         i_Collect->item(&v_Index, &v_StyleSheet);
  27.         i_Sheet = v_StyleSheet.pdispVal;
  28.         return cHtmlStyleSheet(i_Sheet);
  29.     }
  30.     catch(string)
  31.     {
  32.         return cHtmlStyleSheet(0);
  33.     }
  34. }
  35. void CDHtmlUIDemoDlg::OnNavigateComplete(LPDISPATCH pDisp, LPCTSTR szUrl)
  36. {
  37.     CDHtmlDialog::OnNavigateComplete(pDisp, szUrl);
  38.     ChangeImgSrc("bkd");
  39.     ChangeImgSrc("logoLogin");
  40.     ChangeImgSrc("logoLogining");
  41.     ChangeImgSrc("progress");
  42.     ChangeImgSrc("imgStatus");
  43.     cHtmlStyleSheet sheet = this->GetStyleSheet();  
  44.     if(sheet.Valid())
  45.     {
  46.         cHtmlStyle st = sheet.GetRule(".btn");
  47.         BSTR b;
  48.         if(st.Valid())
  49.         {
  50.             st.mi_RuleStyle->get_background(&b);
  51.             CString x = _repleaserule((LPCTSTR)CString(b)).c_str();
  52.             st.mi_RuleStyle->put_background(x.AllocSysString());
  53.         }
  54.         st = sheet.GetRule(".td_hover");
  55.         if(st.Valid())
  56.         {
  57.             st.mi_RuleStyle->get_background(&b);
  58.             CString x = _repleaserule((LPCTSTR)CString(b)).c_str();
  59.             st.mi_RuleStyle->put_background(x.AllocSysString());
  60.         }
  61.         st = sheet.GetRule(".statusBar");
  62.         if(st.Valid())
  63.         {
  64.             st.mi_RuleStyle->get_background(&b);
  65.             CString x = _repleaserule((LPCTSTR)CString(b)).c_str();
  66.             st.mi_RuleStyle->put_background(x.AllocSysString());
  67.         }
  68.     }
  69. }

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值