使用 RollOut 窗口在运行时创建、定位、显示和隐藏控件






4.88/5 (13投票s)
2000 年 11 月 9 日

156600

2779
一种显示/隐藏相关控件组的绝佳方法。
引言
在本教程中,我想演示一种在开发图形应用程序等应用程序时发现非常有用的方法。
已知该应用程序将有许多控件供用户交互,以在他们正在制作的主题上获得所需的结果。
这些控件可以是使颜色发生变化的微调器、更改文本字符串的编辑框、处理某些内容的按钮等等。
为什么?
有时最好将可以分组的控件放在一个地方,以便用户在需要时可以轻松获得它们。
举个简单的例子,我想谈谈文本。很多时候,我们需要更改视图上显示的文本的字符串、颜色和背景颜色。这也是随附演示项目中演示的主题。
如何做到?
开始步骤:使用 Create(...) 或 CreateEx(...) 函数创建控件。
在运行时创建控件是 MFC 开发中最简单、最有趣的部分。我们通常用于在运行时创建任何 Windows 控件的函数是 Create(...)
函数,除非我们想要一些更扩展的样式,那么我们可以使用 CreateEx(...)
函数。
这些函数根据所讨论的控件、使用的样式以及该控件是否将出现在屏幕上而采用不同的参数。
例如,以下两个代码片段将使用我们在运行时传递给每个函数的参数设置的样式创建一个编辑框控件。请注意,创建的编辑控件不会出现在屏幕上,因为我们没有使用 WS_VISIBLE
样式位。我们这样做是为了能够演示本文的显示和隐藏功能。 :-)
示例 1. Create(...) 函数
如果 m_wndEditBox
是 CEdit
类的一个对象,这将创建一个具有扁平化和单黑线边框效果的编辑框,如下所示
m_wndEditBox.Create(ES_AUTOHSCROLL | // Show scroll bars automatically. ES_MULTILINE | // Multiline text support. ES_LEFT | // Left aligned text in control. ES_NOHIDESEL | // Always show the selection. WS_CHILD | // This is child window. WS_HSCROLL | // Has Horizontal scrollbars. WS_VSCROLL, // Has Vertical scrollbars. WS_BORDER | // Single flat black line border. edtRect, // The rectangle area for position and size. this, // How is the Parent Window? ID_EDIT); // The resource ID defintion.
相同编辑框的屏幕截图,创建时没有 3D 外观,而是扁平外观。
示例 2. CreateEx(...) 函数
而这个与 CreateEx(...)
一起使用,可以在控件周围产生 3D 边框效果
m_edtEdit.CreateEx(WS_EX_CLIENTEDGE, // Make a 3D-border _T("EDIT"), // This is very IMPORTANT!, or it won't appear 3D! NULL, ES_AUTOHSCROLL | ES_MULTILINE | ES_LEFT | ES_NOHIDESEL | WS_CHILD | WS_HSCROLL | WS_VSCROLL, edtRect, // The rectangle area for position and size. this, ID_EDIT);
很棒的效果,不是吗?
上面创建的编辑框的屏幕截图,具有 3D 外观。
这两个函数的原型如下
BOOL Create(DWORD dwStyle, const RECT &rect, CWnd *pParentWnd, UINT nID); BOOL CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT &rect, CWnd *pParentWnd, UINT nID, LPVOID lpParam = NULL);
下一步:调整控件的大小和位置。
如果 rcClickMe
是 CRect
类的一个对象,而 m_btnClickMe
是 CButton
类的一个对象,那么通过使用 SetRect(...)
,我们可以设置所讨论的任何控件的位置和大小,如下所示,附带代码和屏幕截图
CRect rcClickMe; // The CRect object for this control's rectangle area SetRect(&rcClickMe, 50,290,220,310); // This function actually sets the area // This is the Create(...) function that actually creates the control but // without using the WS_VISIBLE style as expalined above. m_btnClickMe.Create("Click Me!", // The caption of the button. WS_CHILD | // A child window. BS_PUSHBUTTON, // A push button style. rcClickMe, // The position and size rectangle. this, // The parent window. ID_CLICKME); // The resource ID.
上面带有“Click Me!”字幕的按钮的屏幕截图,显示了其大小和位置。
注意当应用程序扩展时,所有控件都可见,使用 SW_SHOW
宏。
应用程序折叠时的屏幕截图。
请注意,当我们首次创建控件时,没有使用 WS_VISIBLE
,然后稍后使用 SW_HIDE
宏隐藏它们,所有控件都已隐藏。
最后一步:使用 ShowWindow(...) 和 UpdateWindow(...) 函数显示和隐藏已创建和定位的控件。
重要提示:我们在创建控件时,控件的样式中一定不能包含 WS_VISIBLE
!
// This code will SHOW the edit control m_edtEdit.ShowWindow(SW_SHOW); UpdateWindow(); // This code will HIDE the edit control m_edtEdit.ShowWindow(SW_HIDE); UpdateWindow();
关于演示应用程序
功能及其作用
OnPushButtonClicked ()
- 此函数是负责人,负责展开然后显示控件或折叠并隐藏所谓的 RollOut 窗口中的控件。ShowChildren(BOOL bShow)
- 这个函数是实际的边界警察,负责物理地显示和隐藏 RollOut 窗口的子控件。它接受一个布尔值,以确定是否由用户显示或隐藏子控件。OnCreate (LPCREATESTRUCT lpcs)
- 这是 MFC 自带的WM_CREATE
处理程序。在这里我们必须创建所需的控件。
特点
- 您可以单击扩展/折叠按钮来切换子控件以及窗口的大小和可见性。
- 您可以更改编辑框内的文本,以查看静态文本框内的文本。
- 您可以单击 Click Me! 按钮查看效果。请注意编辑框和静态文本的变化。
- 单击任何一个单选按钮,查看静态文本颜色的变化。
- 单击复选框将静态背景颜色切换为黄色或灰色。
这就是全部了,朋友们。祝您有美好时光,并不断学习一切可以学到的知识! :-)
欢迎提问、评论和建议。您可以在这里发布,也可以随意通过我的电子邮件发布。