当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 实现类似Excel和Visual C++里文件夹式样的标签控制(三)
VC++ 中的 实现类似Excel和Visual C++里文件夹式样的标签控制(三)
| 实现类似Excel和Visual C++里文件夹式样的标签控制(三) 下载本文例子源代码 void CFolderButton::OnLButtonDblClk (UINT nFlags, CPoint pt){ SendMessage(WM_LBUTTONDOWN, nFlags, MAKELONG(pt.x,pt.y));} 另一个特性是用户按着按钮不放,则标签会一直滚动,直到标签的端口。实现这个特性的方法是用一个定时器,当定时器被激活时,CFolderButton向它的父窗口发送一个WM_COMMAND消息,就好像按钮已经被压下一样。 void CFolderButton::OnTimer(UINT nIDEvent){ GetParent()->SendMessage(WM_COMMAND, GetDlgCtrlID());} 详细的实现细节请参考本文的源代码。实际上,CFolderButton::OnTimer的实现是有一个启动延时的,所以持续滚动特性犹如键盘操作一样:在重复按下之前有轻微的延时。CFolderButton并不知道有标签页以及如何滚动它们。它只知道如何画出按钮并响应鼠标行为。当用户按下按钮,Windows将WM_COMMAND/BN_CLICKED消息发送到父窗口:也就是CFolderTabCtrl。CFolderTabCtrl才能使标签页滚动。CFolderTabCtrl是按钮和标签的操纵者,就有点象组合框(ComboBox)操纵其编辑框、下拉按钮和列表框一样。 在CFolderTabCtrl中添加滚动按钮需要对几个地方进行修改。首先,你必须创建按钮。在哪里创建呢?记住!无论你什么时候创建有子窗口的复合控制,都应该在OnCreate中进行。 // 在 CFolderTabCtrl::OnCreate 中if (m_dwFtabStyle & FTS_BUTTONS) { CRect rc; for (int id=FTBPREV; id<=FTBNEXT; id++) { VERIFY(m_wndButton[id-1].Create( WS_VISIBLE|WS_CHILD, this, rc, id)); } m_cxButtons = 2*CXBUTTON;} FTS_BUTTONS是CFolderTabCtrl显示按钮的新式样。FTBPREV和FTBNEXT是枚举类型,其值分别为1和2,用于标示按钮的IDs。在Windows系统里,你只要有子窗口,就必须管理它们的大小。这个工作由CFolderTabCtrl::OnSize专门负责。现在标签控制中加入了按钮,你就必须修改CFolderTabCtrl::OnPaint函数,将标签画在按钮的右边。为此不用修改原来的绘制代码,只要改一下视图窗口就可以了: // x origin = (按钮的宽度) - (第一个标签页的x 坐标);int xOrigin = m_cxButtons - |