📄 0501005.htm
字号:
<P align=justify>IDC_DIST int m_nDist</P>
<P align=justify>IDC_BLACK int m_nColor</P>
<P align=justify>IDC_TEXT Cstring m_cText</P>
<P align=justify>IDC_BOLD BOOL m_bBold</P>
<P align=justify>IDC_ITALIC BOOL m_bItalic</P>
<P align=justify>IDC_UNDERLINE BOOL m_bUnderline</P>
<HR align=left SIZE=1 width="69%">
<P>以上数据成员也可以在TABDlg.h、StylePage.h和TextPage.h中利用手工方法增加。</P>
<P align=justify>4、将要显示的数据成员加入到视类中去,来和对话框之间进行数据交换,并且将其在初始化函数中进行数据初始化。</P>
<P align=justify>(1)在TabView.h中增加如下代码:</P>
<P align=justify>#include "TabDlg.h"</P>
<P align=justify>#include "TextPage.h"</P>
<P align=justify>#include "StylePage.h"</P>
<P align=justify>class CTabView : public CView</P>
<P align=justify>{public:</P>
<P align=justify>int nDist;//数值</P>
<P align=justify>int nColor;//颜色</P>
<P align=justify>CString cText;//中文字符串</P>
<P align=justify>BOOL bBold,bItalic,bUnderline;//字体属性</P>
<P align=justify>}</P>
<P align=justify>(2)在TabView.cpp中对数据成员进行如下初始化。</P>
<P align=justify>CTabView::CTabView()</P>
<P align=justify>{ nDist=20;</P>
<P align=justify>nColor=1;</P>
<P align=justify>cText=CString("标签控制演示实例");</P>
<P align=justify>bBold=bItalic=bUnderline=FALSE;</P>
<P align=justify>}</P>
<P align=justify>(3)在TabDlg.cpp中向控制中增加标签,来实现背景设置功能。</P>
<P align=justify>BOOL CTabDlg::OnInitDialog() </P>
<P align=justify>{ CDialog::OnInitDialog();</P>
<P align=justify>TC_ITEM tcItem;//添加标签</P>
<P align=justify>tcItem.mask=TCIF_TEXT;</P>
<P align=justify>tcItem.pszText="字 间 距";</P>
<P align=justify>m_tabCtrl.InsertItem(0,&tcItem);</P>
<P align=justify>tcItem.pszText="颜色设置";</P>
<P align=justify>m_tabCtrl.InsertItem(1,&tcItem);</P>
<P align=justify>m_tabCtrl.SetCurSel(1);</P>
<P align=justify>return TRUE;</P>
<P align=justify>}</P>
<P
align=justify>当标签切换时,标签控制会自动向对话框窗口发送TCN_SELCHANGE通知消息,这时需要根据所选择的标签索引号对属性页的显示和隐藏进行切换控制,应完善OnSelchangeTabctrl()函数:</P>
<P align=justify>void CTabDlg::OnSelchangeTabctrl(NMHDR* pNMHDR, LRESULT*
pResult) </P>
<P align=justify>{ int iPage=m_tabCtrl.GetCurSel();//所选标签号</P>
<P align=justify>switch(iPage){</P>
<P align=justify>case 0://字间距</P>
<P align=justify>GetDlgItem(IDC_STATIC2)->ShowWindow(SW_HIDE);//隐藏选择按钮</P>
<P align=justify>GetDlgItem(IDC_BLACK)->ShowWindow(SW_HIDE);//隐藏选择按钮</P>
<P align=justify>GetDlgItem(IDC_RED)->ShowWindow(SW_HIDE);//隐藏选择按钮</P>
<P align=justify>GetDlgItem(IDC_BLUE)->ShowWindow(SW_HIDE);//隐藏选择按钮</P>
<P align=justify>GetDlgItem(IDC_STATIC1)->ShowWindow(SW_SHOW);//显示输入项数</P>
<P align=justify>GetDlgItem(IDC_DIST)->ShowWindow(SW_SHOW);//显示输入项数</P>
<P align=justify>break;</P>
<P align=justify>case 1://颜色设置</P>
<P align=justify>GetDlgItem(IDC_STATIC1)->ShowWindow(SW_HIDE);//隐藏项数输入</P>
<P align=justify>GetDlgItem(IDC_DIST)->ShowWindow(SW_HIDE);//隐藏项数输入</P>
<P align=justify>GetDlgItem(IDC_STATIC2)->ShowWindow(SW_SHOW);//显示选项选择</P>
<P align=justify>GetDlgItem(IDC_BLACK)->ShowWindow(SW_SHOW);//显示选项选择</P>
<P align=justify>GetDlgItem(IDC_RED)->ShowWindow(SW_SHOW);//显示选项选择</P>
<P align=justify>GetDlgItem(IDC_BLUE)->ShowWindow(SW_SHOW);//显示选项选择</P>
<P align=justify>break;</P>
<P align=justify>}</P>
<P align=justify>*pResult = 0;</P>
<P align=justify>}</P>
<P
align=justify>(4)菜单功能的完善。在执行相应的菜单功能时,必须对类向导增加的相应功能函数进行代码完善,这就要处理TabView.cpp文件,背景设置功能函数如下:</P>
<P align=justify>void CTabView::OnBkgrnd() </P>
<P align=justify>{ CTabDlg ctd;</P>
<P align=justify>ctd.m_nDist=nDist;</P>
<P align=justify>ctd.m_nColor=nColor;</P>
<P align=justify>if(ctd.DoModal()==IDCANCEL) return;</P>
<P align=justify>nDist=ctd.m_nDist;</P>
<P align=justify>nColor=ctd.m_nColor;</P>
<P align=justify>Invalidate();//重新绘制窗口</P>
<P align=justify>}</P>
<P align=justify>同样,也要对前景设置功能函数进行完善:</P>
<P align=justify>void CTabView::OnFrgrnd() </P>
<P align=justify>{ CPropertySheet cps("前景设置");//创建属性表对象</P>
<P align=justify>CTextPage ctp; //显示文字属性页</P>
<P align=justify>CStylePage csp;//显示字体属性页</P>
<P align=justify>ctp.m_cText=cText;</P>
<P align=justify>csp.m_bBold=bBold;</P>
<P align=justify>csp.m_bItalic=bItalic;</P>
<P align=justify>csp.m_bUnderline=bUnderline;</P>
<P align=justify>cps.AddPage(&ctp);//添加属性页</P>
<P align=justify>cps.AddPage(&csp);</P>
<P align=justify>if(cps.DoModal()==IDCANCEL) return;</P>
<P align=justify>cText=ctp.m_cText;</P>
<P align=justify>bBold=csp.m_bBold;</P>
<P align=justify>bItalic=csp.m_bItalic;</P>
<P align=justify>bUnderline=csp.m_bUnderline;</P>
<P align=justify>Invalidate();//重新绘制窗口</P>
<P align=justify>}</P>
<P
align=justify>(5)为了充分演示标签控制与各属性页之间的数据交换功能,应该实现标签控制各属性页与用户之间数据交换结束后的窗口显示功能,笔者实现的功能函数显示了由属性页中输入的字体及背景网格功能,TabView.cpp中的对应函数代码如下:</P>
<P align=justify>void CTabView::OnDraw(CDC* pDC)</P>
<P align=justify>{ CTabDoc* pDoc = GetDocument();</P>
<P align=justify>ASSERT_VALID(pDoc);</P>
<P align=justify>// TODO: add draw code for native data here</P>
<P align=justify>RECT rc;</P>
<P align=justify>GetClientRect(&rc);</P>
<P align=justify>int i,j,k;</P>
<P align=justify>CPen pen,*pOldPen;</P>
<P align=justify>COLORREF color;</P>
<P align=justify>switch (nColor){</P>
<P align=justify>case 0:color=RGB(0,0,0); //设置黑色</P>
<P align=justify>break;</P>
<P align=justify>case 1:color=RGB(0xff,0,0);//设置红色</P>
<P align=justify>break;</P>
<P align=justify>case 2:color=RGB(0,0,0xff);//设置蓝色</P>
<P align=justify>break;</P>
<P align=justify>}</P>
<P align=justify>pen.CreatePen(PS_SOLID,1,color);</P>
<P align=justify>pOldPen=pDC->SelectObject(&pen);//绘制背景网格</P>
<P align=justify>j=rc.right/nDist+1;</P>
<P align=justify>k=rc.bottom/nDist+1;</P>
<P align=justify>for(i=0;i<j+k;i++){</P>
<P align=justify>pDC->MoveTo(i*nDist,0);</P>
<P align=justify>pDC->LineTo(0,i*nDist);</P>
<P align=justify>if(i<j){</P>
<P align=justify>pDC->MoveTo(i*nDist,0);</P>
<P align=justify>pDC->LineTo(rc.right,(j-i)*nDist);</P>
<P align=justify>} else {</P>
<P align=justify>pDC->MoveTo(0,(i-j)*nDist);</P>
<P align=justify>pDC->LineTo(rc.right,i*nDist);</P>
<P align=justify>}</P>
<P align=justify>}</P>
<P align=justify>pDC->SelectObject(&pOldPen);</P>
<P align=justify>CFont font,*pOldFont;</P>
<P align=justify>font.CreateFont(50,0,0,0,bBold?1000:200,</P>
<P align=justify>bItalic,bUnderline,0,ANSI_CHARSET,</P>
<P align=justify>OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,</P>
<P align=justify>DEFAULT_QUALITY,DEFAULT_PITCH,NULL);</P>
<P align=justify>pOldFont=pDC->SelectObject(&font);</P>
<P align=justify>pDC->TextOut(20,20,cText);</P>
<P align=justify>pDC->SelectObject(pOldFont);</P>
<P align=justify>}</P>
<P align=justify>标签控制的整个实现过程虽然比较繁锁,但只要掌握其实现的本质,设计一个优秀的标签控制界面也并非很困难的事情。</P>
<P align=justify>笔者实现的标签控制的演练示例结果如下:</P>
<P align=justify><IMG height=382 src="../../images/Image81.gif"
width=403> 标签控制演练示例结果</P></BIG></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -