Как вызвать класс или DLL или создать DLL, чтобы можно было повторно использовать код в различных формах, таких как панель инструментов рабочего стола - vb 2010.net - PullRequest
0 голосов
/ 18 февраля 2012

Здравствуйте, у меня есть этот код, который я получил с другого форума.

Imports System
Imports System.Drawing
Imports System.Collections
Imports System.ComponentModel
Imports System.Windows.Forms
Imports System.Data
Imports System.Runtime.InteropServices

Public Class mainform

Private Structure RECT
    Public left As Integer
    Public top As Integer
    Public right As Integer
    Public bottom As Integer
End Structure

Private Structure APPBARDATA
    Public cbSize As Integer
    Public hWnd As IntPtr
    Public uCallbackMessage As Integer
    Public uEdge As Integer
    Public rc As RECT
    Public lParam As IntPtr
End Structure

Private Enum ABMsg As Integer
    ABM_NEW = 0
    ABM_REMOVE = 1
    ABM_QUERYPOS = 2
    ABM_SETPOS = 3
    ABM_GETSTATE = 4
    ABM_GETTASKBARPOS = 5
    ABM_ACTIVATE = 6
    ABM_GETAUTOHIDEBAR = 7
    ABM_SETAUTOHIDEBAR = 8
    ABM_WINDOWPOSCHANGED = 9
    ABM_SETSTATE = 10
End Enum

Private Enum ABNotify As Integer
    ABN_STATECHANGE = 0
    ABN_POSCHANGED
    ABN_FULLSCREENAPP
    ABN_WINDOWARRANGE
End Enum

Private Enum ABEdge As Integer
    ABE_LEFT = 0
    ABE_TOP
    ABE_RIGHT
    ABE_BOTTOM
End Enum

Private fBarRegistered As Boolean = False

Private Declare Function SHAppBarMessage Lib "shell32.dll" Alias "SHAppBarMessage" _
(ByVal dwMessage As Integer, <MarshalAs(UnmanagedType.Struct)> ByRef pData As _
APPBARDATA) As Integer

Private Declare Function GetSystemMetrics Lib "user32" Alias "GetSystemMetrics" _
(ByVal nIndex As Integer) As Integer

Private Declare Function MoveWindow Lib "user32" Alias "MoveWindow" (ByVal hwnd As
Integer, _
ByVal x As Integer, ByVal y As Integer, ByVal nWidth As Integer, ByVal nHeight As 
Integer, _
ByVal bRepaint As Integer) As Integer

Private Declare Function RegisterWindowMessage Lib "user32" Alias 
"RegisterWindowMessageA" _
(ByVal lpString As String) As Integer

Private uCallBack As Integer

Private Sub mainform_FormClosing(ByVal sender As Object, ByVal e As 
System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    RegisterBar()
End Sub

Private Sub appBar_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) 
Handles MyBase.Load
    Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
    Me.ClientSize = New System.Drawing.Size(600, 960)
    Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow

    RegisterBar()
    Me.Invalidate()
End Sub

Private Sub mainform_Paint(ByVal sender As Object, ByVal e As 
System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    e.Graphics.DrawLine(New Pen(Color.White, 3), 0, 0, Me.Width, 0)
    e.Graphics.DrawLine(New Pen(Color.White, 3), 0, 0, 0, Me.Height)
    e.Graphics.DrawLine(New Pen(Color.Black, 3), 0, Me.Height - 3, Me.Width, Me.Height
    - 3)
    e.Graphics.DrawLine(New Pen(Color.Black, 3), Me.Width - 3, 0, Me.Width - 3, 
    Me.Height)
End Sub

Private Sub RegisterBar()
    Dim abd As New APPBARDATA
    abd.cbSize = Marshal.SizeOf(abd)
    abd.hWnd = Me.Handle
    If Not fBarRegistered Then
        uCallBack = RegisterWindowMessage("AppBarMessage")
        abd.uCallbackMessage = uCallBack

        Dim ret As Integer = SHAppBarMessage(CType(ABMsg.ABM_NEW, Integer), abd)
        fBarRegistered = True

        ABSetPos()
    Else
        SHAppBarMessage(CType(ABMsg.ABM_REMOVE, Integer), abd)
        fBarRegistered = False
    End If
End Sub


Private Sub ABSetPos()
    Dim abd As New APPBARDATA()
    abd.cbSize = Marshal.SizeOf(abd)
    abd.hWnd = Me.Handle
    abd.uEdge = CInt(ABEdge.ABE_RIGHT)

    If abd.uEdge = CInt(ABEdge.ABE_LEFT) OrElse abd.uEdge = CInt(ABEdge.ABE_RIGHT) Then
        abd.rc.top = 0
        abd.rc.bottom = SystemInformation.PrimaryMonitorSize.Height
        If abd.uEdge = CInt(ABEdge.ABE_LEFT) Then
            abd.rc.left = 0
            abd.rc.right = Size.Width
        Else
            abd.rc.right = SystemInformation.PrimaryMonitorSize.Width
            abd.rc.left = abd.rc.right - Size.Width

        End If
    Else
        abd.rc.left = 0
        abd.rc.right = SystemInformation.PrimaryMonitorSize.Width
        If abd.uEdge = CInt(ABEdge.ABE_TOP) Then
            abd.rc.top = 0
            abd.rc.bottom = Size.Height
        Else
            abd.rc.bottom = SystemInformation.PrimaryMonitorSize.Height
            abd.rc.top = abd.rc.bottom - Size.Height
        End If
    End If

    ' Query the system for an approved size and position. 
    SHAppBarMessage(CInt(ABMsg.ABM_QUERYPOS), abd)

    ' Adjust the rectangle, depending on the edge to which the 
    ' appbar is anchored. 
    Select Case abd.uEdge
        Case CInt(ABEdge.ABE_LEFT)
            abd.rc.right = abd.rc.left + Size.Width
            Exit Select
        Case CInt(ABEdge.ABE_RIGHT)
            abd.rc.left = abd.rc.right - Size.Width
            Exit Select
        Case CInt(ABEdge.ABE_TOP)
            abd.rc.bottom = abd.rc.top + Size.Height
            Exit Select
        Case CInt(ABEdge.ABE_BOTTOM)
            abd.rc.top = abd.rc.bottom - Size.Height
            Exit Select
    End Select

    ' Pass the final bounding rectangle to the system. 
    SHAppBarMessage(CInt(ABMsg.ABM_SETPOS), abd)

    ' Move and size the appbar so that it conforms to the 
    ' bounding rectangle passed to the system. 
    MoveWindow(abd.hWnd, abd.rc.left, abd.rc.top, abd.rc.right - abd.rc.left, 
    abd.rc.bottom - abd.rc.top, True)
End Sub

Protected Overloads Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    If m.Msg = uCallBack Then
        Select Case m.WParam.ToInt32()
            Case CInt(ABNotify.ABN_POSCHANGED)
                ABSetPos()
                Exit Select
        End Select
    End If

    MyBase.WndProc(m)
End Sub

Protected Overloads Overrides ReadOnly Property CreateParams() As 
System.Windows.Forms.CreateParams
    Get
        Dim cp As CreateParams = MyBase.CreateParams
        cp.Style = cp.Style And (Not 12582912)
        ' WS_CAPTION
        cp.Style = cp.Style And (Not 8388608)
        ' WS_BORDER
        cp.ExStyle = 128 Or 8
        ' WS_EX_TOOLWINDOW | WS_EX_TOPMOST
        Return cp
    End Get
End Property

End Class

и что я хочу сделать, это, возможно, поместить его в файл .dll или отдельный класс, чтобы мне не пришлось делатьКод моего form1 огромен.и пример может быть

Public Class Docker
'all the appBar code can go here 
End Class

Private Sub appBar_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) 
Handles MyBase.Load

Docker.enabled = true

End Sub

Я вообще не знаю, как это сделать, поэтому, если вы могли бы дать мне подробный пример, это было бы здорово, спасибо:)

Ответы [ 2 ]

1 голос
/ 18 февраля 2012

В вашем обозревателе решений щелкните правой кнопкой мыши решение >> добавьте новый проект >> выберите проект библиотеки классов

Затем создайте новый проект (после того, как вы добавили туда класс)

В проекте пользовательского интерфейса (где ваша форма существует) щелкните правой кнопкой мыши >> Добавить ссылку >> вкладка проекты >> выберите проект DLL

Теперь вы можете видеть свой класс в форме, но не забудьте импортировать проект dll

Import YourDLLProject
0 голосов
/ 18 февраля 2012

Создайте пустую форму «MyForm», использующую этот код, а затем унаследуйте все остальные формы от MyForm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...