WTL 下拉式控件






4.93/5 (9投票s)
2001 年 9 月 4 日
3分钟阅读

114502

2013
3DSMax 中看到的 WTL 下拉式控件。
引言
虽然这个实现看起来像是 MFC Rollup Control (作者 Johann Nadalutti) 的移植,但我开始开发它的时候比上述文章发表还要早几天。尽管如此,我还是要感谢 Johann Nadalutti 的出色工作,这给了我改进我的实现的机会。
这个实现包含两个类:CRolldownCtrl<TChild>
实现实际的卷帘控件,而 CRolldownContainer
实现一个管理器,它为卷帘控件提供可视区域。
类定义和实现在文件 AtlRolldownCtrl.h
中,该文件包含在演示项目中。
要求
您需要 WTL 库;可以从 Microsoft 站点下载这些库。如果 WTL 库对您没有意义,请参阅 WTL 简介 - 第 1 部分。
如何在你的 WTL 应用中使用该控件
要在您的应用程序中使用此控件,请将头文件 AtlRolldownCtrl.h
添加到您的项目,然后将 CRolloutContainer m_RolloutContainer;
添加到将要使用该控件的类定义中。
- 在资源编辑器中创建一个带有
WS_CHILD
样式的对话框,并像往常一样将其 WTL 对话框类作为通常的类 (例如CDlg1
)。
注意:捕获IDOK
和IDCANCEL
,否则如果用户按下 RETURN 或 ESC,对话框将被销毁。 - 将
CRolloutCtrl<CDlg1> m_dlg1;
添加到将要使用该控件的类声明中。 - 在
OnCreate
函数中创建控件并将其添加到容器,例如: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);
返回展开 (fExpanded = true
) 或折叠 (fExpanded = false
) 控件的边界矩形。
void Expand(bool fExpand = true); void ToggleExpandCollapse();
展开 (fExpand = true
) 或折叠 (fExpand = false
) 控件。
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);
将卷帘控件添加到容器。如果返回值大于或等于 0,则它是容器中卷帘控件的从零开始的索引。如果发生错误,则返回值为 -1。
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);
展开 (fExpand = true
) 或折叠 (fExpand = false
) 一个或所有 Rollout 控件。如果 fUpdate
设置为 true
,则将重新计算布局。
bool IsRolloutExpanded(HWND hWndRollout); bool IsRolloutExpanded(int nIndex);
如果控件已展开,则返回 true
,否则返回 false
。
void RolloutEnabled(HWND hWndRollout, bool fEnable); void RolloutEnabled(int nIndex, bool fEnable);
启用 (fEnable = true
) 或禁用 (fEnable = false
) 指定的 rollout 控件。
bool IsRolloutEnabled(HWND hWndRollout); bool IsRolloutEnabled(int nIndex);
如果控件已启用,则返回 true
,否则返回 false
。
void ScrollToRollout(HWND hWndRollout); void ScrollToRollout(int nIndex);
将指定的卷帘控件滚动到视图中。
更新
2001 年 9 月 4 日
- 首次公开发布。
2001 年 9 月 28 日
- 添加了版权/免责声明标头。
- 添加了更新布局的标志到
ExpandRollout()
。 - 更改了上下文菜单。如果光标未悬停在 rollout 上,则 Close Rollout 项将灰显。
- 将 rollout 容器消息名称从
RCM_*
更改为RCCM_*
。 - 修复了页面拖动。
- 修复了焦点绘制。
2001 年 12 月 4 日
- 添加了
CRolloutCtrlButton
以支持 tab 键切换。 - 向
CRolloutContainer
添加了EnableRollout()
。 - 修复了 tab 键切换。
2002 年 3 月 5 日
- 灰显了已禁用 rollout 控件的上下文菜单项。
CRolloutContainer::ExpandRollout
和CRolloutCtrl::Expand
仍然会展开已禁用的 rollout 控件。
已知限制/错误
- 本文档中控件的命名不一致。