在MFC应用程序开发中,经常需要实现一些自定义的控件来满足特定的功能需求。本文将介绍如何实现一个类似于Microsoft Excel中文件夹标签的控件,但不允许重新排序标签页。这个控件包括第一个标签按钮、下一个标签按钮、最后一个标签按钮和上一个标签按钮。此外,用户还可以重命名标签页或添加/删除新的标签页。
最初,Paul DiLascia在MSDN杂志上分三期介绍了这个控件的代码实现,最后一篇文章发表于2002年10月。在此基础上,增加了第一和最后一个按钮以及标签重命名的功能。
要将这个控件集成到应用程序中,首先需要在视图类中包含头文件:
#include "ftab.h"
CFolderTabCtrl FolderTabs;
然后在视图类的OnCreate
方法中创建控件:
CFolderTabCtrl& ftc = FolderTabs;
VERIFY(ftc.Create(WS_CHILD | WS_VISIBLE, rc, this, 1, FTS_BUTTONS));
在OnDraw
方法中绘制控件和水平滚动条:
RECT rect;
GetClientRect(▭);
int newHeight = rect.bottom;
int newWidth = rect.right;
int folderTabWidth = FolderTabs.GetDesiredWidth();
int folderTabLimit = (newWidth * 4) / 5;
if (folderTabWidth > folderTabLimit) folderTabWidth = folderTabLimit;
FolderTabs.MoveWindow(0, newHeight - GetSystemMetrics(SM_CYHSCROLL), folderTabWidth, GetSystemMetrics(SM_CYHSCROLL), TRUE);
HorzScrollBar.MoveWindow(folderTabWidth, newHeight - GetSystemMetrics(SM_CYHSCROLL), newWidth - folderTabWidth - GetSystemMetrics(SM_CXVSCROLL), GetSystemMetrics(SM_CYHSCROLL), TRUE);
SCROLLINFO si;
ZeroMemory(&si, sizeof(SCROLLINFO));
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_RANGE | SIF_POS | SIF_PAGE;
si.nMin = 0;
si.nMax = giPaperWdDP;
si.nPos = gisFlsHorzOffset;
si.nPage = gisFlsHorzInc;
HorzScrollBar.SetScrollInfo(&si, TRUE);
在视图类中添加消息映射项以处理文件夹消息:
ON_NOTIFY(FTN_TABCHANGED, 1, OnChangedTab)
ON_NOTIFY(FTN_EDITSHEETS, 1, OnEditSheets)
ON_NOTIFY(FTN_TABNAMECHANGED, 1, OnChangedTabName)
ON_NOTIFY(FTN_ADDSHEET, 1, OnAddSheet)
ON_NOTIFY(FTN_DELETESHEET, 1, OnDeleteSheet)