PROGRAMMING WORKSHOP

.Net FrameWork,VB.Net | System.Drawing.Graphics

Timer의 활용

VBA에서는 타이머가 없다, 그냥 순환문을 돌려서
적절히 하거나 API함수등을 동냥질해서 사용하거나 하였지만
VB.Net에서는 아주 훌륭한 Timer를 사용할수 있다
그래서 Animation등 다양한 작업을 수월하게 할수 있다


''전역변수로 Timer를 하나 선언하고
WithEvents myTimer As Timer
''Timer종료의 조건을 줄 변수하나 준비하고
Dim iCounter As Integer
''특정 버튼을 크릭할때..
Private Sub Button13_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
''Timer를 생성하고
myTimer = New Timer
iCount = 0
''Timer의 시간간격을 주고
myTimer.Interval = 20
''Timer를 시작시킨다, 그러면 아래의 Timer의 Tick이벤트프로시져가 작동된다
myTimer.Start()
End Sub

''Timer를 시작시키면 Timer의 Tick이벤트가 지정된 시간각격으로
''작동되어 아래의 Tick이벤트프로시져의 내용이 작동되는 것
Private Sub myTimer_Tick(sender As Object, e As System.EventArgs) Handles myTimer.Tick
''한번 Tick이벤트가 호출될때마다..외부변수 iCount가 1씩 추가	
	iCount += 1
''iCount가 300보다 많으면..Timer중단시키기..	
	If iCount > 300 Then
		myTimer.Stop()
		myTimer.Dispose()
''위에서 시작할때 비활성화시켰던 버튼을 다시 활성화시키고		
		For Each oX As Control In Me.SplitContainer1.Panel2.Controls
			If TypeOf oX Is Button Then
				oX.Enabled = True
			End If
		Next
''Tick 이벤트프로시져를 아웃하고..모두 중단된다		
		Exit Sub
	Else
''iCount가 300미만일때는 계속 진행하면서..폼의 Text에 진행과정기록..	
		Me.Text = "Timer Work..." & iCount & "  300에서 종료"
	End If
'' 이 아래 부분에서 정상적인 하고 싶은 작업을 계속 진행하게 하면 되겠지
'' 쌤플화일을 보시면..아래의 그림과 같이 Gradient 가 시간에 따라서 변하는
'' 에니메이션 
 ....
 ....
 ....
 ....
 ....

End Sub



Excel의 도형에서도 Gradient에 관한 것을 많이 해보셨다면
VB.Net의 Gradient(점차적으로 색상이 변하는 것)이 낯섫지 않을 것이다
이것은 System.Drawing네임스페이스에 있지 않고
System.Drawing.Drawing2D라는 또 다른 확장된 NameSpace에 있는 개체들이다
위의 Animation에서 사용된 개체는 System.Drawing.Drawing2D라는 NameSpace에 들어있는
LinearGradientBrush크래스를 사용한것
아래코드를 엑셀의 VBA모듈에서 실행해보시면 Gradient라는 것이
어떤 일을 하시는지 좀더 확실하게 아시고, 위의 코드와 비교해 보시면
아하..하실 것이다

Sub useColorStop()
Dim oColorStop As ColorStop
Dim rTarget As Range
Set rTarget = Worksheets.Add.Range("B2").Resize(10, 6)
With rTarget
    .Formula = "=INT(RAND()*1000)+1000"
End With

With rTarget.Interior
 .Pattern = xlPatternLinearGradient
 .Gradient.Degree = 135
 .Gradient.ColorStops.Clear
End With
Set oColorStop = rTarget.Interior.Gradient.ColorStops.Add(0)
With oColorStop
 .ThemeColor = xlThemeColorDark1
 .TintAndShade = 0
End With
Set oColorStop = rTarget.Interior.Gradient.ColorStops.Add(0.5)
With oColorStop
 .ThemeColor = xlThemeColorAccent1
 .TintAndShade = 0
End With

With rTarget.Interior.Gradient.ColorStops.Add(1)
 .ThemeColor = xlThemeColorDark1
 .TintAndShade = 0
End With
End Sub



위의 그림과 같이 여러개의 버튼에 다양한 Animation을 구현하게 하였으니
모듈시트의 내용을 보시면 되겠다
Timer의 활용
System.Drawing.Bitmap 의 활용
System.Drawing.Drawing2D.GraphicsPath 의 활용
System.Drawing.Text.TextRenderingHint.AntiAlias 의 활용
그리고 가장 많이 사용되는
System.Drawing.Graphics 개체의
DrawString,DrawRectangle,FillRectangle,FillEllipse,Clear
ResetTransform,RotateTransform,TranslateTransform 메소드를
모두 사용해 보자
그리고 엑셀에서더 많이 사용하였던 Cos, Sin함수의 활용
이때 중요한 것은 Cos함수와 Sin함수의 매개변수는 각도값을 주는 것이 아니다
원이 360도라고 해서 이값을 Sin과 Cos에서 사용하는 것이 아니다
엑셀에서 Radians함수를 사용하였던 기억이 나시는지..
각도값을 Radians함수에 넣어서 얻은 값을 Sin과 Cos의 매개변수로 전달한다
Radians값은 각도가 1도일때 그 1도에 해당하는 원둘레의 길이를
말하는 것이다
이것만 이해하면 Cos함수와 Sin함수를 이용하여 원둘레상의
작업을 하는 것이 흥미롭고 모두 이해할수 있다
원둘레는 반지름*2*파이 라는 것은 초등학생도 안다
1도에 해당하는 원둘레상의 길이는 반지름*2*파이/360 인것이다
Radians함수는 바로 이것을 표현한 것이다
그래서 1도에 해당하는 Radians 값은 0.017453293이고
VB에는 Radians함수가 없다, 그냥 이렇게 계산하면 1*2*pi()/360 하면
역시 0.017453293가 되어 마찬가지인것이다
생각난김에 uno-code-library에 아래와 같이 하나 만들어서 올렸다..


'' 원둘레상에 도형그리기
''Worksheet함수인 Radians함수의 활용
''Cos함수와 Sin함수는 매개변수로 각도를 전달받는 것이 아니다
''각도값의 Radian값을 받는다, Worksheet함수인 Radians함수에 각도를 전달하여
''Radian값을 받아서 Cos,Sin함수에 전달해도되고
''Radians함수가 없을 경우
''Cos(파이*2*각도/360)으로 할수 있다
''즉 Radian값은=파이*2*각도/360 혹은 파이*각도/180
Sub useSinCosRadiansFunction()
Dim shtX As Worksheet
Dim degree As Integer
Dim shpX As Shape
Const Pi = 3.1415927

Dim iCenterX As Integer
Dim iCenterY As Integer
Dim iRadious As Integer
Dim iX As Integer
Dim iY As Integer

iCenterX = 200
iCenterY = 200
iRadious = 150

Set shtX = Worksheets.Add
ActiveWindow.DisplayGridlines = False

    For degree = 1 To 360 Step 20
        iX = iCenterX + iRadious * Cos(Application.WorksheetFunction.Radians(degree))
        iY = iCenterY + iRadious * Sin(Application.WorksheetFunction.Radians(degree))
        ''혹은 Worksheet함수인 Radians함수를 사용하지 않는다면/////////////////////////
        '' Radian값은 파이*반지름*2 * 주어진각도/360 이니까..
        '' 이것은 또 파이*반지름*주어진각도/180으로 해도 되고
'        iX = iCenterX + iRadious * Cos(Pi * 2 * degree / 360)
'        iY = iCenterY + iRadious * Sin(Pi * 2 * degree / 360)
        ''/////////////////////////////////////////////////////////////////////////////////////////
        Set shpX = shtX.Shapes.AddShape(msoShape10pointStar, iX, iY, 20, 20)

    Next
End Sub

***[LOG-IN]***