65.9K
CodeProject 正在变化。 阅读更多。
Home

WTL 下拉式控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (9投票s)

2001 年 9 月 4 日

3分钟阅读

viewsIcon

114502

downloadIcon

2013

3DSMax 中看到的 WTL 下拉式控件。

Sample Image - WtlRolldownCtrl.gif

引言

虽然这个实现看起来像是 MFC Rollup Control (作者 Johann Nadalutti) 的移植,但我开始开发它的时候比上述文章发表还要早几天。尽管如此,我还是要感谢 Johann Nadalutti 的出色工作,这给了我改进我的实现的机会。

这个实现包含两个类:CRolldownCtrl<TChild> 实现实际的卷帘控件,而 CRolldownContainer 实现一个管理器,它为卷帘控件提供可视区域。
类定义和实现在文件 AtlRolldownCtrl.h 中,该文件包含在演示项目中。

要求

您需要 WTL 库;可以从 Microsoft 站点下载这些库。如果 WTL 库对您没有意义,请参阅 WTL 简介 - 第 1 部分

如何在你的 WTL 应用中使用该控件

要在您的应用程序中使用此控件,请将头文件 AtlRolldownCtrl.h 添加到您的项目,然后将 CRolloutContainer m_RolloutContainer; 添加到将要使用该控件的类定义中。

  1. 在资源编辑器中创建一个带有 WS_CHILD 样式的对话框,并像往常一样将其 WTL 对话框类作为通常的类 (例如 CDlg1)。
    注意:捕获 IDOKIDCANCEL,否则如果用户按下 RETURN 或 ESC,对话框将被销毁。
  2. CRolloutCtrl<CDlg1> m_dlg1; 添加到将要使用该控件的类声明中。
  3. 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::ExpandRolloutCRolloutCtrl::Expand 仍然会展开已禁用的 rollout 控件。

已知限制/错误

  • 本文档中控件的命名不一致。
© . All rights reserved.