DHTML设计VC界面《四》- TabCtrl标签栏

 

 

DHtml中的TabCtrl模拟比toolbar模拟简单得多

也就是简单的CSS即可实现

本文使用了3个css来实现

 .tab_current
 {
  cursor:hand;
 border-bottom:1px solid #406DB0;
    font:normal 9px 'Trebuchet MS','Arial';

  height:23px;
  padding:2px 6px 0 6px;
  line-height:19px;
  text-align:center;
  color:#ffffff;
}
 .tab_normal
 {
  cursor:hand;
    font:normal 9px 'Trebuchet MS','Arial';

  height:23px;
  padding:2px 6px 0 6px;
  line-height:19px;
  text-align:center;
  border-bottom: 1px solid #CAE2FD;
  color:#aeaeae;
 }
 .tab_hover
 {
  cursor:hand;
 border-bottom:1px solid #CAE2FD;
    font:normal 9px 'Trebuchet MS','Arial';

  height:23px;
  padding:2px 6px 0 6px;
  line-height:19px;
  text-align:center;
  color:#ffffff;
 }

 

函数集

 

 int m_currentTab;
 void AddTabElem(CString text,CString title,int id);
 void ClearTabElem();
 void SwitchTabElem(int id);
 int  GetTabElemCount();

  1. int CDHtmlUIDemoDlg::GetTabElemCount()
  2. {
  3.     cHtmlTable tb(this->GetElem("tbTab"));
  4.     if(!tb.Valid()||tb.GetRowCount()<=0)
  5.         return 0;
  6.     return tb.GetRow(0).GetCellCount();
  7. }
  8. void CDHtmlUIDemoDlg::AddTabElem(CString text,CString title,int id)
  9. {
  10.     cHtmlTable tb(this->GetElem("tbTab"));
  11.     if(!tb.Valid())
  12.         return;
  13.     cHtmlTableRow tr(0);
  14.     if(tb.GetRowCount()<=0)
  15.         tr = tb.InsertRow(-1,0);
  16.     else
  17.         tr = tb.GetRow(0);
  18.     CString css;
  19.     if(tr.GetCellCount()==0)
  20.         css = "tab1";
  21.     else
  22.         css = "tab2";
  23.     cHtmlTableCell tc = tr.InsertColumn(-1);
  24.     tc.mi_Elem->put_className(css.AllocSysString());
  25.     stringstream ss;
  26.     ss << "<div id='tabelem_" << id << "' class='tab_normal'>" << text << "</div>";
  27.     tc.SetInnerHtml(ss.str().c_str());
  28. }
  29. void CDHtmlUIDemoDlg::ClearTabElem()
  30. {
  31.     cHtmlTable tb(this->GetElem("tbTab"));
  32.     if(!tb.Valid())
  33.         return;
  34.     if(tb.GetRowCount()>0)
  35.         tb.GetRow(0).Remove();
  36. }
  37. void CDHtmlUIDemoDlg::SwitchTabElem(int id)
  38. {
  39.     char sid[100];
  40.     sprintf_s(sid,sizeof(sid),"tabelem_%d",id);
  41.     cHtmlElement elem = this->GetElem(sid);
  42.     if(elem.Valid())
  43.     {
  44.         elem.mi_Elem->put_className(CString("tab_current").AllocSysString());
  45.     }
  46.     if(this->m_currentTab>=0)
  47.     {
  48.         sprintf_s(sid,sizeof(sid),"tabelem_%d",this->m_currentTab);
  49.         cHtmlElement elem = this->GetElem(sid);
  50.         if(elem.Valid())
  51.             elem.mi_Elem->put_className(CString("tab_normal").AllocSysString());
  52.     }
  53.     this->m_currentTab = id;
  54. }

添加标签的代码

 this->AddTabElem("标签1","我的标签1",TAB_1);
 this->AddTabElem("标签2","我的标签2",TAB_2);
 this->SwitchTabElem(TAB_2);

由于只是演示而已,所以只要标签添加的函数,并没有标签管理的函数,读者可以自行添加。

处理事件也很简单,使用DHTML_EVENT_CLASS+CSS即可

  1. BEGIN_DHTML_EVENT_MAP(CDHtmlUIDemoDlg)
  2.     DHTML_EVENT_CLASS(DISPID_HTMLELEMENTEVENTS_ONMOUSEOVER, _T("tab_normal"),  OnMouseOverTab)
  3.     DHTML_EVENT_CLASS(DISPID_HTMLELEMENTEVENTS_ONMOUSEOUT, _T("tab_hover"),  OnMouseOutTab)
  4.     DHTML_EVENT_CLASS(DISPID_HTMLELEMENTEVENTS_ONCLICK, _T("tab_hover"),  OnClickTab)
  5. END_DHTML_EVENT_MAP()
  6. HRESULT CDHtmlUIDemoDlg::OnMouseOverTab(IHTMLElement *phtmlElement)
  7. {
  8.     phtmlElement->put_className(CString("tab_hover").AllocSysString());
  9.     return S_OK; 
  10. }
  11. HRESULT CDHtmlUIDemoDlg::OnClickTab(IHTMLElement *phtmlElement)
  12. {
  13.     BSTR bstr;
  14.     phtmlElement->get_id(&bstr);
  15.     string sid = (LPCTSTR)CString(bstr);
  16.     int pos = sid.find('_');
  17.     int id = atoi(sid.substr(pos+1,sid.length()-pos-1).c_str());
  18.     CString fmt;
  19.     fmt.Format("Tab ID:%d click",id);
  20.     AfxMessageBox(fmt);
  21.     this->SwitchTabElem(id);
  22.     return S_OK;
  23. }
  24. HRESULT CDHtmlUIDemoDlg::OnMouseOutTab(IHTMLElement *phtmlElement)
  25. {
  26.     phtmlElement->put_className(CString("tab_normal").AllocSysString());
  27.     return S_OK;
  28. }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值