2014-03-06 28 views
1

当我使用VB.NET进口无项目名称

Imports WindowsApplication1.FrameGrabber 

但我的形式只适用于没有当我使用

Imports FrameGrabber 

我会在几个不同的项目中使用的图像采集卡,所以我会真的更喜欢只说“Imports FrameGrabber”。

我的 “采集卡/ CameraWindow的” 的定义是这样的:

Imports System.Collections 
Imports System.ComponentModel 
Imports System.Drawing 
Imports System.Data 
Imports System.Windows.Forms 
Imports System.Threading 

Namespace FrameGrabber 
    ''' <summary> 
    ''' Summary description for CameraWindow. 
    ''' </summary> 
    Public Class CameraWindow 
     Inherits System.Windows.Forms.Control 
     Private m_camera As Camera = Nothing 
     Private m_autosize As Boolean = False 
     Private needSizeUpdate As Boolean = False 
     Private firstFrame As Boolean = True 

     ' AutoSize property 
     <DefaultValue(False)> _ 
     Public Overrides Property AutoSize() As Boolean 
      Get 
       Return m_autosize 
      End Get 
      Set(value As Boolean) 
       m_autosize = value 
       UpdatePosition() 
      End Set 
     End Property 

     ' Camera property 
     <Browsable(False)> _ 
     Public Property Camera() As Camera 
      Get 
       Return m_camera 
      End Get 
      Set(value As Camera) 
       ' lock 
       Monitor.Enter(Me) 

       ' detach event 
       If m_camera IsNot Nothing Then 
        RemoveHandler m_camera.NewFrame, AddressOf Me.pCameraWindow_NewFrame 
       End If 

       m_camera = value 
       needSizeUpdate = True 
       firstFrame = True 

       ' atach event 
       If m_camera IsNot Nothing Then 
        AddHandler m_camera.NewFrame, AddressOf Me.pCameraWindow_NewFrame 
       End If 

       ' unlock 
       Monitor.[Exit](Me) 
      End Set 
     End Property 

     ' Constructor 
     Public Sub New() 
      InitializeComponent() 

      SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.DoubleBuffer Or ControlStyles.ResizeRedraw Or ControlStyles.UserPaint, True) 
     End Sub 

#Region "Windows Form Designer generated code" 
     Private Sub InitializeComponent() 
      Me.SuspendLayout() 
      Me.ResumeLayout(False) 

     End Sub 
#End Region 

     ' Paint control 
     Protected Overrides Sub OnPaint(pe As PaintEventArgs) 
      If (needSizeUpdate) OrElse (firstFrame) Then 
       UpdatePosition() 
       needSizeUpdate = False 
      End If 

      ' lock 
      Monitor.Enter(Me) 

      Dim g As Graphics = pe.Graphics 
      Dim rc As Rectangle = Me.ClientRectangle 

      If m_camera IsNot Nothing Then 
       Try 
        m_camera.Lock() 

        ' draw frame 
        If m_camera.LastFrame IsNot Nothing Then 
         g.DrawImage(m_camera.LastFrame, rc.X + 1, rc.Y + 1, rc.Width - 2, rc.Height - 2) 
         firstFrame = False 
        Else 
         ' Create font and brush 
         Dim drawFont As New Font("Arial", 12) 
         Dim drawBrush As New SolidBrush(Color.White) 

         g.DrawString("Connecting ...", drawFont, drawBrush, New System.Drawing.PointF(5, 5)) 

         drawBrush.Dispose() 
         drawFont.Dispose() 
        End If 
       Catch generatedExceptionName As Exception 
       Finally 
        m_camera.Unlock() 
       End Try 
      End If 

      ' unlock 
      Monitor.[Exit](Me) 

      MyBase.OnPaint(pe) 
     End Sub 
     Public Function getImage() As Image 

      If Not m_camera Is Nothing Then 
       If Not m_camera.LastFrame Is Nothing Then 
        Return m_camera.LastFrame 
       End If 
      End If 

      Return Nothing 

     End Function 
     ' Update position and size of the control 
     Public Sub UpdatePosition() 
      ' lock 
      Monitor.Enter(Me) 

      If (m_autosize) AndAlso (Me.Parent IsNot Nothing) Then 
       Dim rc As Rectangle = Me.Parent.ClientRectangle 
       Dim width As Integer = 320 
       Dim height As Integer = 240 

       If m_camera IsNot Nothing Then 
        m_camera.Lock() 

        ' get frame dimension 
        If m_camera.LastFrame IsNot Nothing Then 
         width = m_camera.LastFrame.Width 
         height = m_camera.LastFrame.Height 
        End If 
        m_camera.Unlock() 
       End If 

       ' 
       Me.SuspendLayout() 
       Me.Location = New Point((rc.Width - width - 2) \ 2, (rc.Height - height - 2) \ 2) 
       Me.Size = New Size(width + 2, height + 2) 

       Me.ResumeLayout() 
      End If 
      ' unlock 
      Monitor.[Exit](Me) 
     End Sub 

     ' On new frame ready 
     Private Sub pCameraWindow_NewFrame(sender As Object, e As System.EventArgs) 
      Invalidate() 
     End Sub 

    End Class 
End Namespace 

感谢您的帮助!

回答

1

您需要为您的项目更改根名称空间或覆盖它。当您将课程封装在Namespace区块(例如Namespace FrameGrabber)中时,给定的命名空间与您项目的根名称空间相关。换句话说,如果你的根名字空间是WindowsApplication1,那么当你说Namespace FrameGrabber时,所有的封闭类型实际上将在WindowsApplication1.FrameGrabber命名空间中。

如果你想覆盖根名称空间代码的一节,您可以使用Global关键字,这样的命名空间声明是不是相对的,就像这样:

Namespace Global.FrameGrabber 
    ' ... 
End Namespace 

使用在Global关键字的尽管如此,名称空间声明似乎是重写根名称空间似乎是VB.NET的新增内容。从我可以告诉的基础上,the MSDN article列入关于它的信息,在Visual Studio 2012中添加了对支持你还可以找到this MSDN article上的信息:

Global关键字,也可以用于名称空间语句中。这使您可以从项目的根名称空间中定义名称空间。有关详细信息,请参阅Visual Basic中的命名空间中的“全局关键字中的命名空间语句”一节。

另一种选择是从项目属性中删除根命名空间,然后宣布对每项目中的每个代码文件的完整的命名空间。该设置可以在项目设置设计器屏幕中找到:我的项目>应用程序>根名称空间

无论是或者提出了一个更有利于VB.NET偏心的命名约定。例如,如果您为项目创建了根名称空间的公司名称,那么MyCompany.FrameGrabber肯定比WindowsApplication1.FrameGrabber更有意义。