在MFC应用程序开发中,有时需要实现一些自定义的控件以满足特定的用户界面需求。滚动控件(Rollup Control)就是这样一种控件,它允许用户通过点击来展开或收起内容区域。在本文中,将介绍如何实现一个基于MFC的滚动控件,以及如何在WTL应用程序中使用它。
滚动控件的实现主要依赖于两个类:CRolldownCtrl和CRolldownContainer。CRolldownCtrl类负责实现实际的滚动控制功能,而CRolldownContainer类则作为管理器,提供滚动控件的视觉展示区域。这两个类的实现代码位于AtlRolldownCtrl.h文件中,该文件包含在演示项目中。
要使用这个控件,需要WTL库。这些库可以从Microsoft网站下载。如果对WTL库不熟悉,可以查看《WTL入门 - 第一部分》。
要在应用程序中使用这个控件,首先需要将头文件AtlRolldownCtrl.h添加到项目中,然后在将要使用该控件的类定义中添加CRolloutContainer m_RolloutContainer;。
接下来,在资源编辑器中创建一个对话框框,设置为WS_CHILD样式,并像平常一样设置其WTL对话框类(例如CDlg1)。注意:要捕获IDOK和IDCANCEL,否则如果用户按下RETURN或ESC键,对话框将被销毁。
然后在类声明中添加CRolloutCtrl
m_dlg1.Create(m_RolloutContainer.m_hWnd, _T("My Rollout Control"));
m_RolloutContainer.AddRollout(m_dlg1);
对于额外的滚动控件,重复以上步骤。最终的OnCreate函数可能如下所示:
LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
...
m_RolloutContainer.Create(m_hWnd);
...
m_dlg1.Create(m_RolloutContainer.m_hWnd, _T("Rollout Control 1"));
m_RolloutContainer.AddRollout(m_dlg1);
m_dlg2.Create(m_RolloutContainer.m_hWnd, _T("Rollout Control 2"));
m_RolloutContainer.AddRollout(m_dlg2);
m_dlg3.Create(m_RolloutContainer.m_hWnd, _T("Rollout Control 3"));
m_RolloutContainer.AddRollout(m_dlg3);
...
}
以下是CRolloutCtrl类提供的一些用户方法:
创建
HWND Create(HWND hWndParent, LPCTSTR szWindowName, _U_RECT rect = NULL,
DWORD dwStyle = 0, DWORD dwExStyle = 0, DWORD dwExRcStyle = 0,
UINT nID = 0U, LPVOID lpCreateParam = NULL);
BOOL SubclassWindow(HWND hWnd);
属性
bool IsExpanded();
如果控件已展开,则返回true;否则返回false。
操作
void GetRect(bool fExpanded, RECT* pRect);
void Expand(bool fExpand = true);
void ToggleExpandCollapse();
GetRect方法返回展开(fExpanded = true)或折叠(fExpanded = false)控件的边界矩形。Expand方法用于展开(fExpand = true)或折叠(fExpand = false)控件。ToggleExpandCollapse方法用于切换控件的展开和折叠状态。
以下是CRolloutContainer类提供的一些用户方法:
创建
HWND Create(HWND hWndParent, LPCTSTR lpstrTitle = NULL, DWORD dwStyle = 0,
DWORD dwExStyle = 0, UINT nID = 0, LPVOID lpCreateParam = NULL);
HWND Create(HWND hWndParent, UINT uTitleID, DWORD dwStyle = 0,
DWORD dwExStyle = 0, UINT nID = 0, LPVOID lpCreateParam = NULL);
操作
void GetClientSize(SIZE* pClientSize);
int GetSpacing();
void SetSpacing(int nSpacing);
int AddRollout(HWND hWndRollout);
bool RemoveRollout(HWND hWndRollout);
bool RemoveRollout(int nIndex);
bool RemoveAllRollouts();
int GetRolloutCount();
HWND GetRollout(int nIndex);
void ExpandRollout(HWND hWndRollout, bool fExpand = true, bool fUpdate = true);
void ExpandRollout(int nIndex, bool fExpand = true, bool fUpdate = true);
void ExpandAllRollouts(bool fExpand = true);
bool IsRolloutExpanded(HWND hWndRollout);
bool IsRolloutExpanded(int nIndex);
void RolloutEnabled(HWND hWndRollout, bool fEnable);
void RolloutEnabled(int nIndex, bool fEnable);
bool IsRolloutEnabled(HWND hWndRollout);
bool IsRolloutEnabled(int nIndex);
void ScrollToRollout(HWND hWndRollout);
void ScrollToRollout(int nIndex);
这些方法允许获取容器的大小、设置滚动控件之间的间距、添加或移除滚动控件、获取滚动控件的数量和句柄、展开或折叠单个或所有滚动控件、检查滚动控件是否展开、启用或禁用滚动控件以及滚动到指定的滚动控件。