PROGRAMMING WORKSHOP

Skip Navigation Links. Skip Navigation Links.

.NetFrameWork | Window Form - Menu

한 페이지씩 소화시키기 좋게 차근차근 해보자..
아주 오래전에 [엑셀로 VB를 배웁시다]를 하였던 기억을 살려서
하다 보면 프로그래밍능력이 확장 될 것이니..

이번 페이지는 윈도우에 메뉴개체를 생성하여 붙여보고
메뉴개체의 하위 콘트롤개체를 삽입하고
콘트롤에 Image화일을 적용하여 보고
메뉴콘트롤을 크릭하면 계속하여 버튼이 생성되게 하면서
버튼에도 Image화일을 적용하여 보자..아래의 그림과 같이



엑셀 VBA에서 CommandBar를 처리하였던 기억이 날 것이다
Window폼에도 역시 메뉴시스템이 있는 것
그것을 처리해 보는 것이다

모든 것은 개체생성하여 그 개체를 관리하는 집합체에
Add 시켜주면 해당 개체의 역할을 마음대로 사용하게 되는 것이다
메뉴스트립..MenuStrip이라는 개체가 있다
이것은 VBA에서 CommandBar와 같은 역할을 하는 것이라고 보면 될것이다

아래와 같이 MenuStrip개체를 하나 생성하고
이것은 System.Windows.Forms.MenuStrip
에서 앞에 것 다 빼도 알아서 처리하니까..그냥 New MenuStrip 하여 변수에 담고

Dim oMenustrip As New MenuStrip

만들었으면 위치 잡는 것은 이제 상식이고..
위치는 Point개체로 잡아서 Location속성에 주면 되고
크기는 Size속성을 Size개체를 만들어서 주고

With oMenustrip
   .Location = New Point(0, 0)
   .Size = New Size(Me.Width, 24)
End With

Point와 Size 개체는
Sytem.Drawing.Size와 System.Drawing.Point를 생략하여 표현한 것이고
위의 내용은 폼의 최 상단에 위치시키는 것

다양한 속성..Orientation, LayOutStyle등등 위치와 모양을 보완하는
것들이 많으나 ..차차 다른 예제를 하면서 계속 나올 것이니
위치를 잡고 배치를 하는 것은 위의 방법이 원칙이 아니고
또 다른 방법들도 있는 것이니..융통성있는 생각을 갖으시고

VBA에서 CommandBar에 콘트롤을 추가하던 생각이 날 것이고
당연히 일을 할 컨트롤을 위의 상자는 콘트롤을 담는 틀일 뿐
아직 아무것도 할 수 없는 상태다
자식들을 만들어 붙여야 할 것이고
그중의 한 방법이
ToolStripMenuItem개체가 메뉴를 구성하는 콘트롤역할을 한다

역시 개체 생성해야지

Dim oMenuItem As New ToolStripMenuItem

와 같이 ToolStipMenuItem 개체를 생성하고

With oMenuItem
   .Text = "File"
   .Image = Image.FromFile("orange.ico")
End With

Text속성에 File이라고 하던 아무것이나 원하는 캡션으로 하고
Image속성에 Image.FromFile("그림화일명")
System.Drawing.Image.FromFile("....") 와 같이 Drawing 이라는 NameSpace가
갖고 있는 Image개체의 FromFile메소드

VBA메뉴에서는 Caption속성이나 FaceID로 아이콘을 처리하는 것에 해당한다
역시 만들었으니 맨위체서 만든 틀의 Items 집합체에 Add시킨다

oMenustrip.Items.Add(oMenuItem)

이제 하다 보면 그냥 항상 같은 방법이다
개체만들고 붙이고, 만들고 붙이고..
알아야 할 것은 이런..저런 일을 시키고 싶은데 어떤 개체가 하나???!#
만 알면 되는 것이다
레고블록 조립하듯이!!!

메뉴를 크릭하면 어떤 일을 시킬지 설계를 하여(이벤트프로시져를 만들고)
이것을 연결해준다

AddHandler oMenuItem_.Click, AddressOf menuitem2_click

이제 개체들을 조립하였으니
나머지는 VBA에서 갈고 딱은 코딩실력으로 뚝딱거리면 된다

Private Sub menuitem2_click(ByVal sender As Object, ByVal e As EventArgs) Dim iLeft As Integer, iTop As Integer iTag += 1 If oLastBtn Is Nothing Then iLeft = 10 iTop = 30 Else iLeft = oLastBtn.Left + 30 If Me.Width < iLeft + 30 + 10 Then iY += 1 iLeft = 10 Me.Height = iY * 30 + 90 End If iTop = 30 * iY End If oLastBtn = New Button oLastBtn.Image = Image.FromFile("orange.ico") With oLastBtn .Location = New Point(iLeft, iTop) .Size = New Size(30, 30) .Tag = iTag End With AddHandler oLastBtn.Click, AddressOf clickByBtn Me.Controls.Add(oLastBtn) End Sub

메뉴를 크릭할때마다 버튼개체를 생성하고
정해진 사이즈로 위치를 계산하여 붙여주고
또 새로 생성된 버튼에 또 다른 이벤트프로시져를 연결해주고
윈도우폼의 폭과 높이는 버튼이 만들어지는 갯수에 따라서
계산하여 조정해 나간다

역시 변수를 어떻게 적절히 활용하여야 하는 일반적인
프로그래밍 테크닉인 것이다..VBA에서 갈고 딱은..!!

VBA에서는 어떤 버튼을 크릭하였는지를
Application.Caller라는 문자열 정보로 크릭한 개체의 이름을 얻었었으나
여기에서는 이벤트프로시져의 Sender라는 매개변수
이 매개변수는 As Object라는 범용으로 타입이 정해져 있어서
Sender. 라고 쩜을 찍어도 버튼에 관련된 속성이나 메소드..멤버목록을
볼수 없다
이때는
CType(sender,Button). 이라고 CType함수로 개체타입으로
전환한후 쩜을 찍으면 해당 개체의 속성이나 관련된 멤버목록을
볼수 있어서 코딩하기 편하게 된다

***[LOG-IN]***