如何将控件封装在可放置在MFC对话框中的窗口中?

我希望有一个窗口将被放置在一个可以包含另一个控件的对话框中。这样做的原因是我可以使封装的控件超出对话框中分配区域的大小,并使用独立的滚动条来查看完整的控件。如何将控件封装在可放置在MFC对话框中的窗口中?

此描述听起来像应该有一些已经做到这一点。那是对的吗?如果是这样,那是什么?如果不是,我会怎么做呢?

编辑

哦,等等,我已经看到了这个。带有标签页面。这些实际上创建了一个对话框,该对话框是主对话框的父对象。如果页面太小,则会出现滚动条。所以这是可能的,只需要弄清楚如何。玩VS的时候,有一个自定义控件可能是我正在寻找的。

回答:

要在对话框中封装了控制,应在对话中使用,请执行下列操作:

  1. 创建对话框资源和清空(即删除其所有控件),并设置以下标志:

    • 外观

      • 边框:
      • 风格:儿童
      • 标题栏:假 //自动
    • 行为

      • 应用程序窗口:条虚假 //自动
    • 其它

      • 控制:
      • ID:IDD_CONTROL_WRAPPER(或任何你想要的)

    这将是包装对话框。

  2. 创建包装对话框类(右键单击对话框,然后选择添加类...),我要叫它CControlWrapper这些指令。

  3. 在你的包装对话框中,将你想要封装的控件添加到你的类中,并添加一个变量来关联它(在我的例子中,我将使用一个ID为IDC_WRAPPED_CTRL的列表框和成员变量名m_ctrl)。
  4. 为了让这个控制占用对话框的整个空间:

    1. 添加ON_WM_SIZE()消息,你到你的包装对话框的消息映射。
    2. 创建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);

    }

    你可以改变任何你希望的控件的大小。使其变大只是使控制得到修剪。

  5. 如果您还没有这样做,请创建主对话框类。
  6. 将包装的对话框控件作为变量添加到主对话框类(在本例中,我将其称为m_childDlg)。
  7. 在主对话框的OnInitDialog()函数中创建对话框。

    m_childDlg.Create(IDD_CONTROL_WRAPPER, this); 

  8. 设置它的位置和大小:

    m_childDlg.SetWindowPos(0, 8, 8, 500, 500, SWP_SHOWWINDOW); 

就是这样!

以下是一些您可以选择的选项。

  1. 为了让这样就可以使用对话框编辑器主对话框上定位你的控制,你可以把它使封装的控制可以只把自己在您指定的一个:

    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(),并且您的控件将使用它正在替换的控件的边框。

  2. 添加WRAPPED_CTRL* CControlWrapper::operator->(),以便您可以轻松访问包装的对象。
  3. 天空是极限...... :)

以上是 如何将控件封装在可放置在MFC对话框中的窗口中? 的全部内容, 来源链接: utcz.com/qa/259343.html

回到顶部