如何将控件封装在可放置在MFC对话框中的窗口中?
我希望有一个窗口将被放置在一个可以包含另一个控件的对话框中。这样做的原因是我可以使封装的控件超出对话框中分配区域的大小,并使用独立的滚动条来查看完整的控件。如何将控件封装在可放置在MFC对话框中的窗口中?
此描述听起来像应该有一些已经做到这一点。那是对的吗?如果是这样,那是什么?如果不是,我会怎么做呢?
编辑
哦,等等,我已经看到了这个。带有标签页面。这些实际上创建了一个对话框,该对话框是主对话框的父对象。如果页面太小,则会出现滚动条。所以这是可能的,只需要弄清楚如何。玩VS的时候,有一个自定义控件可能是我正在寻找的。
回答:
要在对话框中封装了控制,应在对话中使用,请执行下列操作:
创建对话框资源和清空(即删除其所有控件),并设置以下标志:
外观
- 边框:薄
- 风格:儿童
- 标题栏:假 //自动
行为
- 应用程序窗口:条虚假 //自动
- 其它
- 控制:真
- ID:IDD_CONTROL_WRAPPER(或任何你想要的)
这将是包装对话框。
创建包装对话框类(右键单击对话框,然后选择添加类...),我要叫它
CControlWrapper
这些指令。- 在你的包装对话框中,将你想要封装的控件添加到你的类中,并添加一个变量来关联它(在我的例子中,我将使用一个ID为
IDC_WRAPPED_CTRL
的列表框和成员变量名m_ctrl
)。 为了让这个控制占用对话框的整个空间:
- 添加
ON_WM_SIZE()
消息,你到你的包装对话框的消息映射。 - 创建
OnSize()
函数。
或者使用向导。你
OnSize()
功能看起来应该是这样的:void CControlWrapper::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
if (m_ctrl.m_hWnd)
m_ctrl.SetWindowPos(nullptr, 0, 0, cx, cy, SWP_SHOWWINDOW);
}
你可以改变任何你希望的控件的大小。使其变大只是使控制得到修剪。
- 添加
- 如果您还没有这样做,请创建主对话框类。
- 将包装的对话框控件作为变量添加到主对话框类(在本例中,我将其称为m_childDlg)。
在主对话框的
OnInitDialog()
函数中创建对话框。m_childDlg.Create(IDD_CONTROL_WRAPPER, this);
设置它的位置和大小:
m_childDlg.SetWindowPos(0, 8, 8, 500, 500, SWP_SHOWWINDOW);
就是这样!
以下是一些您可以选择的选项。
为了让这样就可以使用对话框编辑器主对话框上定位你的控制,你可以把它使封装的控制可以只把自己在您指定的一个:
void CControlWrapper::CreateOvertop(CWnd* pParent, int originalId)
{
CreateOvertop(pParent, pParent->GetDlgItem(originalId));
}
void CControlWrapper::CreateOvertop(CWnd* pParent, CWnd* pOrignalWnd)
{
// Create the control wrapper
Create(IDD_CONTROL_WRAPPER, pParent);
// This two lines makes it so that the drawing zorder is respected
ModifyStyle(0, WS_CLIPSIBLINGS);
// Also this line stops the original window from having a tab stop,
// if not cleared in dialog editor.
pOrignalWnd->ModifyStyle(WS_TABSTOP, WS_CLIPSIBLINGS);
// Position the control wrapper dialog control over the old control
CRect rect;
pOrignalWnd->GetWindowRect(rect);
pParent->ScreenToClient(rect);
// position this control over old control less border
SetWindowPos(pOrignalWnd->GetWindow(GW_HWNDPREV)
, rect.left + 2, rect.top + 2, rect.Width() - 4, rect.Height() - 4
, SWP_SHOWWINDOW);
}
然后从主对话框
OnInitDialog()
中,您可以调用其中一个函数而不是CControlWrapper::OnCreate()
,并且您的控件将使用它正在替换的控件的边框。- 添加
WRAPPED_CTRL* CControlWrapper::operator->()
,以便您可以轻松访问包装的对象。 - 天空是极限...... :)
以上是 如何将控件封装在可放置在MFC对话框中的窗口中? 的全部内容, 来源链接: utcz.com/qa/259343.html