Visual Basic에서는 개발자용으로 미리 정의된 상수와 열거형이 여러 가지가 제공됩니다.상수는 응용 프로그램을 실행하는 동안 일정하게 유지되는 값을 저장하며,열거형은 관련 상수 집합을 사용하고 상수 값을 이름과 연결하는 편리한 방법을 제공합니다.

 

아래의 표에서는 상수형에 대한 자료를 나타냅니다.

 

상수

설명

 vbCrLf  캐리지 리턴/줄 바꿈 문자 조합
 vbCr  캐리지 리턴 문자
 vbLf  줄 바꿈 문자
 vbNewLine  줄 바꿈 문자
 vbNullChar  Null 문자
 vbNullString  길이가 0인 문자열("")과는 다르며 외부 프로시저를 호출하는 데 사용됩니다.
 vbObjectError  오류 번호.사용자 정의 오류 번호는 이 값보다 커야 합니다.예를 들면 다음과 같습니다.

Err.Raise(Number) = vbObjectError + 1000

 vbTab

 탭 문자

 vbBack

 백스페이스 문자

 vbFormFeed  Microsoft Windows에서는 사용되지 않습니다.
 vbVerticalTab  Microsoft Windows에서는 유용하지 않습니다.

 

 

아래의 표에서는 열거형에 대해서 보여줍니다.

 

열거형 

설명 

 AppWinStyle

 Shell 함수를 호출할 때 호출된 프로그램에 사용할 창 스타일을 나타냅니다.

 AudioPlayMode

 오디오 메서드를 호출할 때 소리가 재생되는 방식을 나타냅니다.

 BuiltInRole

 IsInRole 메서드를 호출할 때 확인할 역할 유형을 나타냅니다.

 CallType

 CallByName 함수를 호출할 때 호출되는 프로시저 형식을 나타냅니다.

 CompareMethod

 비교 함수를 호출할 때 문자열이 비교되는 방법을 나타냅니다.

 DateFormat

 FormatDateTime 함수를 호출할 때 날짜가 표시되는 방법을 나타냅니다.

 DateInterval

 날짜 관련 함수를 호출할 때 날짜 간격을 설정하고 서식을 지정하는 방법을 나타냅니다.

 DeleteDirectoryOption

 삭제될 디렉터리에 파일이나 디렉터리가 포함된 경우 수행해야 하는 작업을 지정합니다.

 DueDate

 금융 메서드를 호출할 때 지불 만기일을 나타냅니다.

 FieldType

 텍스트 필드가 구분되어 있는지 또는 고정 폭인지 여부를 나타냅니다.

 FileAttribute

 파일 액세스 함수를 호출할 때 사용할 파일 특성을 나타냅니다.

 FirstDayOfWeek

 날짜 관련 함수를 호출할 때 사용할 주의 첫째 요일을 나타냅니다.

 FirstWeekOfYear

 날짜 관련 함수를 호출할 때 사용할 연도의 첫째 주를 나타냅니다.

 MsgBoxResult

 메시지 상자에서 눌러진 단추(MsgBox 함수에서 반환)를 나타냅니다.

 MsgBoxStyle

 MsgBox 함수를 호출할 때 표시할 단추를 나타냅니다.

 OpenAccess

 파일 액세스 함수를 호출할 때 파일을 여는 방법을 나타냅니다.

 OpenMode

 파일 액세스 함수를 호출할 때 파일을 여는 방법을 나타냅니다.

 OpenShare

 파일 액세스 함수를 호출할 때 파일을 여는 방법을 나타냅니다.

 RecycleOption

 파일을 영구적으로 삭제할지 아니면 휴지통에 넣을지 지정합니다.

 SearchOption

 모든 디렉터리를 검색할지 최상위 디렉터리만 검색할지 지정합니다.

 TriState

 숫자 형식 지정 함수를 호출할 때 기본값을 사용할지 여부 또는 Boolean 값을 나타냅니다.

 UICancelOption

 작업 중 사용자가 취소를 클릭할 경우 수행할 작업을 지정합니다.

 UIOption

 파일이나 디렉터리를 복사, 삭제 또는 이동할 때 진행률 대화 상자의 표시 여부를 지정합니다.

 VariantType

 variant 개체의 형식을 나타내며 VarType 함수에서 반환됩니다.

 VbStrConv

 StrConv 함수를 호출할 때 수행할 변환 형식을 나타냅니다.

 

< 참고 >

상수 개요(Visual Basic)

 

파일의 속성을 설정하려면,

System.IO.File 클래스의 SetAttributes 메소드를 사용합니다.

비트마다의 OR (논리합)로, 속성을 추가할 수 있습니다.

 

'패스를 정수로 정의한다
Const FILE_PATH As String = "C: \Hoge.txt"
'파일의 속성을 취득한다
Dim uAttribute As System.IO.FileAttributes = System.IO.File.GetAttributes(FILE_PATH)
'독해 전용 속성을 추가한다(논리합으로 추가한다)
System.IO.File.SetAttributes(FILE_PATH, uAttribute Or System.IO.FileAttributes.ReadOnly)

파일의 타임 스탬프에는, 작성 일시, 갱신 일시, 액세스 일시가 있습니다. 작성 일시를 취득하려면 , System.IO.File 클래스의 GetCreateTime 메소드를 사용합니다. 갱신 일시를 취득하려면 , 동클래스의 GetLastWrite 메소드를 사용합니다. 액세스 일시를 취득하려면 , 동클래스의 GetLastAccessTime 메소드를 사용합니다.

 

'패스를 정수로 정의한다
Const FILE_PATH As String = "C: \Hoge.txt"
'작성 일시를 취득한다
Dim dtCreate As DateTime = System.IO.File.GetCreationTime(FILE_PATH)
'갱신 일시를 취득한다
Dim dtUpdate As DateTime = System.IO.File.GetLastWriteTime(FILE_PATH)
'액세스 일시를 취득한다
Dim dtAccess As DateTime = System.IO.File.GetLastAccessTime(FILE_PATH)
'취득한 타임 스탬프를 표시한다
MessageBox.Show("작성 일시: " & dtCreate.ToString())
MessageBox.Show("갱신 일시: " & dtUpdate.ToString())
MessageBox.Show("액세스 일시: " & dtAccess.ToString())

파일의 타임 스탬프에는, 작성 일시, 갱신 일시, 액세스 일시가 있습니다. 작성 일시를 설정하려면 , System.IO.File 클래스의 SetCreateTime 메소드를 사용합니다. 갱신 일시를 설정하려면 , 동클래스의 SetLastWrite 메소드를 사용합니다. 액세스 일시를 설정하려면 , 동클래스의 SetLastAccessTime 메소드를 사용합니다.

 

'패스를 정수로 정의한다
Const FILE_PATH As String = "C: \Hoge.txt"
'작성 일시를 현재의 로컬 시각에 갱신한다
System.IO.File.SetCreationTime(FILE_PATH, DateTime.Now)
'갱신 일시를 현재의 로컬 시각에 갱신한다
System.IO.File.SetLastWriteTime(FILE_PATH, DateTime.Now)
'액세스 일시를 현재의 로컬 시각에 갱신한다
System.IO.File.SetLastAccessTime(FILE_PATH, DateTime.Now)

파일의 버젼 정보는, System.Diagnostics.FileVersionInfo 클래스로부터 취득합니다. 이 클래스의 인스턴스를 생성하려면 , GetVersionInfo 메소드를 사용합니다.

'지정한 파일의 버젼 정보를 취득한다
Dim hVerInfo As System.Diagnostics.FileVersionInfo = ( _
System.Diagnostics.FileVersionInfo.GetVersionInfo("C: \WINDOWS\Notepad.exe") _
)
Dim stNewLine As String = System.Environment.NewLine
Dim stPrompt As String = String.Empty
'파일까지의 패스
stPrompt &= "파일명: " & hVerInfo.FileName & stNewLine
'파일의 설명(AssemblyTitle)
stPrompt &= "파일의 설명: " & hVerInfo.FileDescription & stNewLine
'코멘트(AssemblyDescription)
stPrompt &= "코멘트: " & hVerInfo.Comments & stNewLine
'회사명(AssemblyCompany)
stPrompt &= "회사명: " & hVerInfo.CompanyName & stNewLine
'제품명(AssemblyProduct)
stPrompt &= "제품명: " & hVerInfo.ProductName & stNewLine
'저작권(AssemblyCopyright)
stPrompt &= "저작권: " & hVerInfo.LegalCopyright & stNewLine
'상표(AssemblyTrademark)
stPrompt &= "상표: " & hVerInfo.LegalTrademarks & stNewLine
'정식 파일명(어셈블리명)
stPrompt &= "정식 파일명: " & hVerInfo.OriginalFilename & stNewLine
'내부명
stPrompt &= "내부명: " & hVerInfo.InternalName & stNewLine
'언어
stPrompt &= "언어: " & hVerInfo.Language & stNewLine
'파일의 버젼 정보
stPrompt &= "파일의 버젼 번호: " & hVerInfo.FileVersion & stNewLine
stPrompt &= "파일의 메이저 번호: " & hVerInfo.FileMajorPart & stNewLine
stPrompt &= "파일의 마이나 번호: " & hVerInfo.FileMinorPart & stNewLine
stPrompt &= "파일의 빌드 번호: " & hVerInfo.FileBuildPart & stNewLine
stPrompt &= "파일의 프라이빗 번호: " & hVerInfo.FilePrivatePart & stNewLine
'제품의 버젼 정보
stPrompt &= "제품의 버젼 번호: " & hVerInfo.ProductVersion & stNewLine
stPrompt &= "제품의 메이저 번호: " & hVerInfo.ProductMajorPart & stNewLine
stPrompt &= "제품의 마이나 번호: " & hVerInfo.ProductMinorPart & stNewLine
stPrompt &= "제품의 빌드 번호: " & hVerInfo.ProductBuildPart & stNewLine
stPrompt &= "제품의 프라이빗 번호: " & hVerInfo.ProductPrivatePart & stNewLine
'빌드 정보
stPrompt &= "프라이빗 빌드 정보: " & hVerInfo.PrivateBuild & stNewLine
stPrompt &= "특수 빌드 정보: " & hVerInfo.SpecialBuild & stNewLine
'그 외의 정보
stPrompt &= "디버그 정보를 격납할까: " & hVerInfo.IsDebug & stNewLine
stPrompt &= "개발 버젼(프레리리스)인가: " & hVerInfo.IsPreRelease & stNewLine
stPrompt &= "파일이 변경되고 있을까: " & hVerInfo.IsPatched & stNewLine
stPrompt &= "표준 릴리스 프로시저로 생성되었는지: " & hVerInfo.IsPrivateBuild & stNewLine
stPrompt &= "특수 빌드인지 어떤지: " & hVerInfo.IsSpecialBuild & stNewLine
'취득한 모든 버젼 정보를 표시한다
MessageBox.Show(stPrompt)

 

여기에서는, PictureBox의 Image 프롭퍼티를 사용하고, 픽쳐 박스에 이미지를 표시하는 방법을 소개합니다 

PictureBox.Image 프롭퍼티를 사용한다.
픽쳐 박스에 이미지를 표시시키는 제일 간단한 방법은, PictureBox의 Image 프롭퍼티에 표시하는 이미지를 지정하는 것입니다.
다음의 예에서는 이 방법에 의해, 픽쳐 박스 PictureBox1에 이미지 파일"C:\test.jpg"를 표시합니다.

 

PictureBox1.Image = System.Drawing.Image.FromFile("C:\test.jpg")

 

 

 

이미지의 배치 방법을 지정한다
PictureBox.Image 프롭퍼티로 표시하는 이미지의 배치 방법을 지정하려면 , PictureBox.SizeMode 프롭퍼티를 사용합니다. SizeMode 프롭퍼티로 지정할 수 있는 PictureBoxSizeMode 구조체의 멤버를 이하에 나타냅니다. 아무것도 지정하지 않으면 Normal이 됩니다.

 

 PictureBoxSizeMode의 멤버 설명

 설명

 Normal

 이미지를 PictureBox의 왼쪽에 표시한다.

 이미지의 크기는 기본크기

 StretchImage

 PictureBox의 크기 가득 이미지가 표시되도록(듯이), 이미지를 확대 또는 축소해 표시한다. 

 AutoSize

 PictureBox의 크기를 이미지의 크기와 같게 표시한다.

 CenterImage

 이미지를 PictureBox의 중앙에 표시한다.

 이미지의 크기는 기본크기

 Zoom

 PictureBox의 크기에 맞추어 이미지를 확대 또는 축소해 표시한다. StretchImage와 달리, 이미지의 사이즈 비율은 보관 유지한다. 이미지는 PictureBox의 중앙에 표시된다.

.NET Framework 2.0 이후에 유효.

 

 

다음의 예에서는, 이미지 파일"C:\test.jpg"를 PictureBox1의 크기에 맞추어 표시시키도록 하고 있습니다.

 

'이미지의 크기를 PictureBox에 맞춘다
PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
'이미지를 표시한다
PictureBox1.Image = System.Drawing.Image.FromFile("C:\test.jpg")

 

 

 

. NET Framework 2.0이후로, 지정한 장소의 이미지를 표시한다

. NET Framework 2.0에서는, PictureBox.ImageLocation 프롭퍼티를 사용하고, 지정한 URI의 이미지를 PictureBox에 표시할 수 있습니다. 이 방법이 Image 프롭퍼티에 의한 방법보다 간단합니다.
ImageLocation 프롭퍼티로 읽어들인 이미지는, Image 프롭퍼티로 설정됩니다.

따라서, PictureBox.SizeMode 프롭퍼티로 지정된 이미지의 배치 방법이 적용됩니다.
이하에 이미지 파일"C: \test.bmp"를 표시하는 예를 나타냅니다. ImageLocation에"C: \test.bmp"와 같은 패스를 지정해도 괜찮습니다만, 아래의 예처럼,"file: ///"(으)로 하는 방법이 추천 되고 있습니다.

 

'PictureBox1에"C: \test.bmp"를 표시한다
PictureBox1.ImageLocation = "file: ///C:/test.bmp"

 

 

 

PictureBox.Image 프롭퍼티를 사용해 표시한 이미지를 삭제하는방법

PictureBox.Image 프롭퍼티를 사용해 표시한 이미지를 삭제하려면 , Image 프롭퍼티에 Nothing을 설정하면 됩니다.

If Not (PictureBox1.Image Is Nothing) Then
    PictureBox1.Image.Dispose()
    PictureBox1.Image = Nothing
End If

 

 

BackgroundImage 프롭퍼티를 사용한다

이미지를 표시하는 목적으로 사용하는 것은 적당하지는 않습니다만, Control.BackgroundImage 프롭퍼티에 의해 이미지를 표시할 수도 있습니다. 이 경우는 통상 이미지가 보통레벨로 표시됩니다.
. NET Framework 2.0에서는 Control.BackgroundImageLayout 프롭퍼티에 의해 배경 이미지의 배치법을 변경할 수 있습니다. BackgroundImageLayout 프롭퍼티로 지정할 수 있는 ImageLayout 열거체의 멤버를 이하에 나타냅니다.

 

 ImageLayout 열거체의 멤버

 설명

 Tile

 이미지를 전체에 늘여서 표시한다.

 None

 이미지를 컨트롤의 왼쪽상단에 표시한다.

 Center

 이미지를 컨트롤의 중앙에 표시한다.

 Stretch

 이미지를 컨트롤의 크기에 맞추어 늘여서 표시한다.

 Zoom

 이미지를 컨트롤의 크기에 맞추어 신축해 표시한다. StretchImage와 다르게 이미지의 사이즈 비율은 보관 유지한다. 위치는, 컨트롤의 중앙

 

BackgroundImageLayout을 Zoom로 해 배경 이미지를 설정하는 예를 아래에 나타냅니다.

 

PictureBox1.BackgroundImageLayout = ImageLayout.Zoom
PictureBox1.BackgroundImage = System.Drawing.Image.FromFile("C:\testjpg")

여기에서는, 어플리케이션 시작때는 폼을 표시시키지 않고 , 조건에 의해서 표시하는 방법을 소개합니다.

시작때에 폼을 비표시하는 방법은, MSDN의 [시작 Windows Form 숨기기] 로 소개되고 있습니다. 이와 같이, 엔트리 포인트의 Main 메소드로 메인 폼을 표시할까를 판단해, 조건이 채워졌을 때만 메인 폼을 표시하도록(듯이) 합니다. MSDN의 예에서는 Form.ShowDialog 메소드로 폼을 표시시키고 있습니다만, 통상은 Application.Run로 표시시키는 것이 좋을 것입니다.

메인 폼을 표시시키기 전에 메시지 박스를 표시하고, Yes 버튼이 클릭되었을 때만 메인 폼을 표시하는 예를 소개합니다. 엔트리 포인트의 Main 메소드를 아래의 코드와 같이 고쳐 써 주세요.

 

<STAThread> _
Shared Sub Main()
    'Yes일때, 폼을 표시한다
    If MessageBox.Show("폼을 표시하시겠습니까?", _
            "질문", MessageBoxButtons.YesNo) = _
                System.Windows.Forms.DialogResult.Yes Then
        '.NET Framework 1.0일때는 아래는 1행을 삭제
        Application.EnableVisualStyles()
        '.NET Framework 1.1이하의 경우는 아래의 1행을 삭제
        Application.SetCompatibleTextRenderingDefault(False)
        Application.Run(New Form1())
    End If
End Sub

STAThread란?

STAThreadAttribute 속성의 의미에 대해서는, MSDN의 [STAThreadAttribute 클래스] 에 있습니다. 그 설명은, 「어플리케이션의 COM 스렛드모델이 단일스렛드아파트먼트(STA: Single-Threaded Apartment)인 것을 나타냅니다」라고 하는 것입니다. 만약 Main 메소드에 STAThreadAttribute 속성을 붙이지 않았으면, C#에서는, 멀티스렛드아파트먼트(MTA: multithreaded apartment)가 됩니다.

다만 VB.NET에서는, Main 메소드에 STAThreadAttribute 속성을 붙이지 않아도 STA가 됩니다.
STA와 MTA에 대해서는, Wikipedia의 [Component Object Model(컴포넌트 오브젝트 모델)] 에 설명이 있습니다. 간단하게 말하면, STA는 단일의 스렛드로 COM를 실행시키기 위해서 필요하고, 그것은 Windows의 메시지 큐를 이용해 행해집니다. 따라서 STA로 밖에 동작하지 않는 COM는 스렛드정책이 아닙니다만, MTA로 동작하는 COM는 스스로 스렛드의 동기를 취할 필요가 있어, 가끔 스렛드를 블록 합니다.
본론으로 돌아가서 Main 메소드에 STAThread가 필요한가? 라고 한다면, STA로 밖에 움직이지 않는 COM를 사용하는 경우는, 필요하다 라는 결론입니다.(VB.NET의 경우는 디폴트가 STA이므로 별도선언이 필요는 없습니다만, 명시적으로 기술해 두는 것이 좋을 것입니다). 많은 COM(특히 유저 인터페이스 관계의 COM)는 STA로 밖에 동작하지 않기 때문에, 통상은 COM를 사용하는 경우에 필요하게 됩니다.

스스로 COM를 직접 사용하지 않다고 해도 .NET Framework의 일부의 기능은 COM을 사용하고 있기 때문에, 그러한 기능을 사용하는 경우는 반드시 STA로 할 필요가 있습니다.

STA가 아니면 사용할 수 없는 .NET Framework의 기능에는, 이하와 같은 것이 있습니다.

(아래와 같은 [참고]에 있는 페이지등을 참고로 했습니다. )

1. 드러그&드롭 기능
2. 클립보드 관계의 기능
3. OpenFileDialog, SaveFileDialog와 같은 FileDialog의 상속 클래스나, FolderBrowserDialog 클래스에 의한 다이얼로그의 표시
4. WebBrowser 컨트롤
5. IME의 사용
6. RichTextBox 컨트롤의 일부의 기능(미확인)
7. 리플렉션을 이용한 메소드의 호출(. NET Framework 1.0만? )

Visual Studio의 코드 분석에서는, System.Windows.Forms 네임스페이스를 참조하고 있어서 Main 메소드에 STAThreadAttribute 속성이 붙지 않은 경우, 「Windows 폼의 엔트리 포인트를 STAThread로 마크 합니다」라고 하는 경고가 나옵니다. 이 경고의 설명에 의하면, STAThreadAttribute 속성은 Windows 폼을 사용하는 모든 어플리케이션의 엔트리 포인트로 지정할 필요가 있어, MTA는 Windows 폼으로 서포트되어 있지 않다고 하는 것입니다.
이러한 사항으로 보았을때, Windows 폼 어플리케이션에서는 Main 메소드에 STAThreadAttribute 속성이 필요하다고 생각해도 좋을 것입니다.

참고 : Why is STAThread required?

Could you explain STA and MTA?

폼의 프롭퍼티인 TopMost를 True로 설정하여 그 윈도우를 항상 앞에 표시할 수 있습니다.

해제하기 위해서는 TopMost를 False로 설정하면 됩니다.


다음의 예는, 폼에 버튼 컨트롤 Button1이 있고, Button1이 클릭될 때마다 항상 앞으로 들어온것을 삭제하는 예제 입니다.

 

Private Sub Button1_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Button1.Click

    'Button1이 클릭될때마다 폼의 최상위객체를 삭제한다.
    Me.TopMost = Not Me.TopMost
End Sub

 

 

타이틀바가 없는 폼을 마우스로 이동시키는 방법입니다.

여기에서는 Win32 API를 사용하지 않는 방법을 소개합니다.

 

[ 마우스 이벤트를 이용하는 방법 ]

우선은, 가장 기본적인 방식입니다.

다음의 코드에서는, 단순하게 폼(Form1) 상에서 마우스의 왼쪽 버튼이 눌려져서 이동시킨 것을 감지하는 것으로써 처리하고 있습니다.

 

'마우스의 클릭위치를 기억한다.
Private mousePoint As Point

'마우스의 버튼이 눌러졌을때

Private Sub Form1_MouseDown(ByVal sender As Object, _
  ByVal e As System.Windows.Forms.MouseEventArgs) _
  Handles MyBase.MouseDown
    If (e.Button And MouseButtons.Left) = MouseButtons.Left Then
        '위치를 기억한다.
        mousePoint = New Point(e.X, e.Y)
    End If
End Sub

 

'마우스가 이동했을때

Private Sub Form1_MouseMove(ByVal sender As Object, _
  ByVal e As System.Windows.Forms.MouseEventArgs) _
  Handles MyBase.MouseMove
    If (e.Button And MouseButtons.Left) = MouseButtons.Left Then
        Me.Left += e.X - mousePoint.X
        Me.Top += e.Y - mousePoint.Y
        '혹은, 아래와같이 처리한다.
        'Me.Location = New Point( _
        '    Me.Location.X + e.X - mousePoint.X, _
        '    Me.Location.Y + e.Y - mousePoint.Y)
    End If
End Sub

 

위의 예에서는 폼에 있는 컨트롤에서 마우스의 버튼을 눌러 드래그 해도, 윈도우는 이동하지 않습니다. 컨트롤상의 드래그로도 이동할 수 있도록 하려면, 그 컨트롤의 MouseDown 및 MouseMove 이벤트 핸들러에 Form1_MouseDown 및 Form1_MouseMove를 추가하면 됩니다.

예를 들면 Form1에 PictureBox1 오브젝트가 있어, PictureBox1상에서 mouse button을 눌러 드래그를해도 Form1을 이동할 수 있도록 하려면 다음과 같이 하면 됩니다.

 

Private mousePoint As PointPrivate Sub Form1_MouseDown(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.MouseEventArgs) _
        Handles MyBase.MouseDown, PictureBox1.MouseDown   

End Sub


Private Sub Form1_MouseMove(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.MouseEventArgs) _
        Handles MyBase.MouseMove, PictureBox1.MouseMove  

End Sub

+ Recent posts