如何在UserControl中创建部分客户区?

用户3391751

在上一个问题中,我整理了如何创建依赖于容器的控件。现在,我在该控件中遇到问题。控件的设计有点令人困惑。设计看起来像这样。

在此处输入图片说明

在这种设计中,开发人员无法在页面控件之外添加控件。PageControl将自动添加到工作区中。我想防止用户在PageControl之外添加控件。我不会再感到困惑了。所以,我的问题是我该怎么做?

在此处输入图片说明

您可以在上一个问题中看到类声明

如果您有其他想法可以这样做,请提出建议。

更新:

控制应该看起来像这样。

在此处输入图片说明

但是,在分配非客户区域后,放置的控件将进入客户区域内。我想防止用户在该部分中添加控件。在此处输入图片说明

比昂·罗格·克林佐(Bjørn-RogerKringsjå)

简单的方法

最简单的方法是XWizardPage每当其父项的大小更改时重新计算the的范围

Public Class XWizardPage
    Inherits DevExpress.XtraEditors.XtraPanel
    Implements IComparable(Of XWizardPage)

    Protected Overrides Sub OnResize(e As System.EventArgs)
        MyBase.OnResize(e)
        If (Not Me.positioningInternal) Then Me.Position()
    End Sub

    Protected Overrides Sub SetBoundsCore(x As Integer, y As Integer, width As Integer, height As Integer, specified As System.Windows.Forms.BoundsSpecified)
        MyBase.SetBoundsCore(x, y, width, height, specified)
        If (Not Me.positioningInternal) Then Me.Position()
    End Sub

    Protected Overrides Sub OnParentChanged(e As System.EventArgs)
        MyBase.OnParentChanged(e)
        If (Not Me.cachedParent Is Nothing) Then
            RemoveHandler Me.cachedParent.SizeChanged, AddressOf Me.OnParentSizeChanged
        End If
        Me.cachedParent = If(((Not Me.Parent Is Nothing) AndAlso (TypeOf Me.Parent Is XWizardControl)), Me.Parent, Nothing)
        If (Not Me.cachedParent Is Nothing) Then
            AddHandler Me.cachedParent.SizeChanged, AddressOf Me.OnParentSizeChanged
        End If
    End Sub

    Private Sub OnParentSizeChanged(sender As Object, e As EventArgs)
        Me.Position()
    End Sub

    Private Sub Position()
        If (Not Me.cachedParent Is Nothing) Then
            Dim r As Rectangle = Me.cachedParent.ClientRectangle
            r.Y += 10
            r.Height -= (10 * 2)
            If (Me.Bounds <> r) Then
                Me.positioningInternal = True
                Me.Bounds = r
                Me.positioningInternal = False
            End If
        End If
    End Sub

    Private cachedParent As Control
    Private positioningInternal As Boolean

End Class

艰难的道路

困难的方法需要本地调用。尽管可行,但我无法附加完整的解决方案,因为这很复杂。您要查找的术语是nonclient area网络上有很多教程,您应该进行搜索。

以下代码仅是向您展示从哪里开始的示例,而不是最终的解决方案。对于这个完美的工作,你需要处理Window redrawMouse events等等。

Public Class XWizardControl
    Inherits DevExpress.XtraEditors.XtraUserControl

    <DllImport("user32.dll", CharSet:=CharSet.Auto, ExactSpelling:=True)> _
    Private Shared Function GetDCEx(ByVal hWnd As IntPtr, ByVal hrgnClip As IntPtr, ByVal flags As Integer) As IntPtr
    End Function

    Private Sub WmNcCalcSize(ByRef m As Message)
        If (m.WParam.ToInt32() = 0) Then
            Dim ncRect As RECT = DirectCast(m.GetLParam(GetType(RECT)), RECT)
            ncRect.top += 10
            ncRect.bottom -= 10
            Marshal.StructureToPtr(ncRect, m.LParam, False)
            m.Result = IntPtr.Zero
        ElseIf (m.WParam.ToInt32() = 1) Then
            Dim ncParams As NCCALCSIZE_PARAMS = DirectCast(m.GetLParam(GetType(NCCALCSIZE_PARAMS)), NCCALCSIZE_PARAMS)
            ncParams.rectProposed.top += 10
            ncParams.rectProposed.bottom -= 10
            Marshal.StructureToPtr(ncParams, m.LParam, False)
            m.Result = IntPtr.Zero
        Else
            MyBase.WndProc(m)
        End If
    End Sub

    Private Sub WmNcPaint(ByRef m As Message)
        Dim hDC As IntPtr = GetDCEx(m.HWnd, m.WParam, (DCX.WINDOW Or DCX.INTERSECTRGN Or DCX.CACHE Or DCX.CLIPSIBLINGS))
        If (hDC.ToInt32() <> 0) Then
            Using g As Graphics = Graphics.FromHdc(hDC)
                g.Clear(Color.Red)
            End Using
            m.Result = IntPtr.Zero
        Else
            MyBase.WndProc(m)
        End If
    End Sub

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Select Case m.Msg
            Case WM_NCCALCSIZE : Me.WmNcCalcSize(m) : Exit Select
            Case WM_NCPAINT : Me.WmNcPaint(m) : Exit Select
            Case Else : MyBase.WndProc(m) : Exit Select
        End Select
    End Sub

    Public Const WM_NCCALCSIZE As Integer = 131
    Public Const WM_NCPAINT As Integer = 133

    <StructLayout(LayoutKind.Sequential)> _
    Private Structure RECT
        Public left As Integer
        Public top As Integer
        Public right As Integer
        Public bottom As Integer
    End Structure

    <StructLayout(LayoutKind.Sequential)> _
    Private Structure NCCALCSIZE_PARAMS
        Public rectProposed As RECT
        Public rectBeforeMove As RECT
        Public rectClientBeforeMove As RECT
        Public lppos As WINDOWPOS
    End Structure

    <StructLayout(LayoutKind.Sequential)> _
    Private Structure WINDOWPOS
        Public hwnd As IntPtr
        Public hWndInsertAfter As IntPtr
        Public x As Integer
        Public y As Integer
        Public cx As Integer
        Public cy As Integer
        Public flags As UInteger
    End Structure

    Private Enum DCX As Integer
        CACHE = &H2
        CLIPCHILDREN = &H8
        CLIPSIBLINGS = &H10
        EXCLUDERGN = &H40
        EXCLUDEUPDATE = &H100
        INTERSECTRGN = &H80
        INTERSECTUPDATE = &H200
        LOCKWINDOWUPDATE = &H400
        NORECOMPUTE = &H100000
        NORESETATTRS = &H4
        PARENTCLIP = &H20
        VALIDATE = &H200000
        WINDOW = &H1
    End Enum

End Class

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在UserControl中创建部分客户区?

来自分类Dev

如何在Android Room中创建部分索引

来自分类Dev

如何在HTML中创建部分水平线?

来自分类Dev

在Facebook中创建部分

来自分类Dev

如何在 Github PR 中创建部署链接?

来自分类Dev

如何创建部分发票?

来自分类Dev

如何从Scala中的运行时值创建部分函数

来自分类Dev

您如何创建部分初始化的结构?

来自分类Dev

在Python / Pandas中创建部分SAS PROC Summary替换

来自分类Dev

根据DO块中声明的变量创建部分索引

来自分类Dev

在 React Native 中创建部分透明的背景布局

来自分类Dev

如何在UserControl中创建/ WPF依赖项属性?

来自分类Dev

使用Django 1.7创建部分索引

来自分类Dev

AJAX更新div而不创建部分

来自分类Dev

如何在 NSPopUpButton 中创建命名部分

来自分类Dev

如何创建部分依赖外部参数的函数数组?(Python)

来自分类Dev

如何从另一个数组创建部分对象数组?

来自分类Dev

如何创建部分回发以启动逻辑以添加新的div?

来自分类Dev

如果haskell中的每个函数都被管理,那么我怎么不能创建部分对?

来自分类Dev

React Native-在列表中创建部分并带有可点击的屏幕链接

来自分类Dev

尝试从Textmate 2中的选择创建部分内容会引发错误

来自分类Dev

如何在全方位付款中创建客户

来自分类Dev

Acumatica:如何在红宝石中创建新客户?

来自分类Dev

如何在Stripe(Rails)中创建费用和客户

来自分类Dev

如何在Django中创建客户端?

来自分类Dev

如何在python中创建合成客户数据

来自分类Dev

如何在Excel功能区中创建清晰的图标?

来自分类Dev

如何在CSS中创建功能区形状

来自分类Dev

如何在Ruby on Rails中创建省,市和区

Related 相关文章

热门标签

归档