• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

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

mfc 来源:Adrian 5次浏览

我希望有一个窗口将被放置在一个可以包含另一个控件的对话框中。这样做的原因是我可以使封装的控件超出对话框中分配区域的大小,并使用独立的滚动条来查看完整的控件。如何将控件封装在可放置在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. 天空是极限…… :)

版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)