날짜함수중 DateSerial과 DateAdd 함수를 이용하여 해당월에 마지막 날짜을 알아오는 방법을 알아보겠습니다.

MSDN 자료를 보면


DateSerial 함수

지정된 년, 월, 일의 Variant(Date) 값을 반환합니다.


구문

DateSerial(year, month, day)

DateSerial 함수 구문은 다음과 같은 명명된 인수로 되어 있습니다.


 구성 

설명 

 year

필수. Integer. 100에서 9999 까지의 수 또는 수식

 month

필수. Integer. 모든 수식

 day

필수. Integer. 모든 수식

참고

예를 들어 1991년 12월 31일처럼 어떤 날짜를 지정하려면 각 DateSerial 인수의 숫자는 해당 인수의 허용 범위 안에 있어야 합니다. 즉, 일은 1 – 31이며, 월은 1 - 12입니다. 그러나 특정 날짜의 앞 뒤에 년, 월, 일 등을 나타내는 수식을 사용하여 각 인수의 상대 날짜를 지정할 수 있습니다.

다음은 특정 일자를 지정하지 않고 수식을 사용한 예제입니다. DateSerial 함수는 1990의 10년 전(1990-10) 8월의 2개월 전(8-2) 첫째 날에서 하루를 뺀(1-1), 즉 1980년 5월 31일을 반환합니다.

DateSerial(1990 - 10, 8 - 2, 1 - 1)

year 인수의 값이 0–99 사이의 값이면 1900부터 1999년까지로 해석되며 그 밖의 모든 year 인수는 1800년처럼4 자릿수의 완전한 연도를 사용합니다.

인수가 허용되는 범위를 넘으면 적절한 상위 단위로 변환하여 계산합니다. 예를 들어 35일을 지정하면 적용 연도에 따라 1개월 며칠로 계산합니다. 그러나 한 인수가 -32,768 - 32,767 범위를 넘는 인수이거나 세 인수를 사용하여 지정된 날짜가 허용 범위를 넘을 경우 오류가 발생합니다.


DateAdd 함수

특정 시간 간격을 포함한 Variant(Date) 값을 반환합니다.


구문

DateAdd(interval, number, date)

DateAdd 함수 구문은 다음과 같은 명명된 인수로 되어 있습니다.


 구성 요소

설명 

 interval

필수. 문자식을 사용하여 시간 간격을 표시합니다.

 number

필수. 수식을 사용하여 날짜에 시간 간격을 가감합니다. 양수(이후 시간을 계산하는 경우)와 음수(이전 시간을 계산하는 경우) 모두 사용 가능합니다.

 day

필수. Variant(Date) 형의 날짜에는 시간 간격이 가감됩니다.


설정

interval 인수의 설정은 다음과 같습니다.


 구성 

설명 

 yyyy 연도
 q 분기 
 m

 y 일(일년 기준) 
 d 일 
 w

요일

 ww 주 
 h

시간

 n 분 
 s


참고

날짜에 특정 시간을 더하거나 뺄 때 DateAdd 함수를 사용합니다. 예를 들어 현재 시간부터 45분 이후 시간이나 현재 일로부터 30일 이후의 날짜를 계산할 때 DateAdd 함수를 사용합니다.

date에 날짜를 더할 때 연("y"), 일("d")이나 요일("w")을 사용합니다.

DateAdd 함수는 틀린 날짜 값은 반환하지 않습니다. 다음은 95년 1월 31일에 1개월(30일)을 더한 예제입니다.

DateAdd("m", 1, "95 1 31")

위의 경우 DateAdd 함수는 95년 2월 31일이 아닌 95년 2월 28일을 반환합니다. date가 96년 1월 31일인 경우는 윤년이기 때문에 96년 2월 29일을 반환합니다.

계산한 날짜가 100년을 넘어가면 오류가 발생합니다. 실제 date보다 많은 연도를 가감했기 때문입니다.

number가 Long 값이 아니면 가까운 정수값으로 반올림한 후 계산합니다.

메모 DateAdd 함수의 반환값 형식은 date 인수에 전달된 형식 대신 [제어판] 설정에 의해 결정됩니다.



먼저 DateSerial 함수를 살펴보겠습니다.

예제에서와 같이 인수가 허용하는 범위를 넘으면 적절한 상위단위로 변환하여 계산한다고 하는 설명이 있는데 이를 이용하여 

2013년 02월 달의 마지막일을 구하려는 수식은

DateSerial(2013, 3, 1 - 1)    '결과는 2013-02-28 

즉 매월 0일은 계산식에 의해 이전달의 마지막일을 구할 수 있음을 알 수 있습니다.


다음으로 DateAdd 함수를 보면

날짜를 더하거나 뺄때 사용하는 함수로 이도 마찬가지로 마지막일을 구하려는 다음월을 인수로 하여 1일을 빼면 동일한 결과를

얻을 수 있습니다.

DateAdd("d", -1, "2012-03-01")    '결과는 2013-02-28 


폼에 Picture박스를 한개 가져다 놓고, 

아래와 같이 Visible속성을 적용하여 객체를 가시적으로 표현할 수 있습니다.


감출땐

Picture1.Visible = False    ' Hide


보이게할땐

Picture1.Visible = True     ' Show



이와 동일한 효과를 주기위해 ShowWindow 를 이용하여 폼이나 컨트롤 등의 핸들값을 가지는 객체를 Show/Hide 할 수 있습니다.


Private Declare Function ShowWindow Lib "user32" _

                        (ByVal hWnd As Long, _

                         ByVal nCmdShow As Long) As Long


Private Const SW_HIDE = 0

Private Const SW_SHOW = 5


감출땐 
ShowWindow Picture1.hWnd, SW_HIDE

보일게할땐
ShowWindow Picture1.hWnd, SW_SHOW



프로젝트 내에서 접근가능한 객체를 위와같이 Show/Hide하진 않지만 대상이 윈도우의 시작버튼이나 다른 프로그램의 경우라면

ShowWindow와 같은 API를 사용해야 합니다.

참고가 될만한 예로 바탕화면에 있는 아이콘을 말끔하게 지워버리는(?) 간단한 코드를 작성해봅니다.

폼에 Command버튼을 2개 만들고 각 버튼의 Caption 값을 Hide 와 Show로 합니다. 



Private Declare Function FindWindowEx Lib "user32" Alias _

                        "FindWindowExA" _

                        (ByVal hWnd1 As Long, _

                         ByVal hWnd2 As Long, _

                         ByVal lpsz1 As String, _

                         ByVal lpsz2 As String) As Long

                         

Private Declare Function ShowWindow Lib "user32" _

                        (ByVal hWnd As Long, _

                         ByVal nCmdShow As Long) As Long


Private Const SW_HIDE = 0

Private Const SW_SHOW = 5


'Hide 하는 버튼

Private Sub Command1_Click()

  Dim lHandle   As Long

  lHandle = FindWindowEx(0&, 0&, "Progman", vbNullString)

  ShowWindow lHandle, SW_HIDE

End Sub


'Show 하는 버튼

Private Sub Command2_Click()

  Dim lHandle As Long

  lHandle = FindWindowEx(0&, 0&, "Progman", vbNullString)

  ShowWindow lHandle, SW_SHOW

End Sub


lHandle 변수에 대상이 되는 객체에 핸들값을 얻어 ShowWindow 함수에 첫번째 인자값으로 넘겨주고 

SW_HIDE 또는 SW_SHOW 를 두번째 인자에 적용하기만 하면 되는 예입니다.


대상 객체의 핸들값을 구할 수 있는 방법은 여러가지 방법이 있겠지만 대체로 FindWindowEx, FindWindow 등을 이용하니 

검색을 통해 더 많은 정보를 찾으시길 바람니다.


Tip.

마우스 포인트가 위치하는 윈도우 핸들 구하기




'VB6 > Interface' 카테고리의 다른 글

폼에 보여줄 영역 만들기(구멍난 폼)  (0) 2013.03.28
폼 타이틀바 Show/Hide  (0) 2013.03.28
폼 위치, 크기 구하기  (0) 2013.03.27
폼 투명도 주기  (0) 2013.03.27
폼 타이틀바 이동효과  (0) 2013.03.26

마우스커서가 현재 위치하고 있는 윈도우 핸들을 알고 싶을때 아래 코드를 참고하자.

PointToHandle와 같이 함수형태로 만들어 놓으면 호출시 핸들값을 리턴한다.


GetCursorPos는 현재 마우스커서의 위치를 POINTAPI 구조체에 담아주고, WindowFromPoint 를 통해 x좌표, y좌표를 넘겨주면 해당 좌표에 핸들을 리턴한다.


Private Declare Function GetCursorPos Lib "user32" _

                        (lpPoint As POINTAPI) As Long

                        

Private Declare Function WindowFromPoint Lib "user32" _

                        (ByVal xPoint As Long, _

                         ByVal yPoint As Long) As Long

Private Type POINTAPI

        x As Long

        y As Long

End Type


Private Function PointToHandle() As Long

  Dim pt        As POINTAPI

  GetCursorPos pt

  PointToHandle = WindowFromPoint(pt.x, pt.y)

End Function


'VB6 > Function' 카테고리의 다른 글

Desktop 이름 구하기  (0) 2013.04.01
대기시간 함수  (0) 2013.03.27

텍스트나 이미지 등의 데이터를 포함하여 배포하고자 할때 리소스 편집기를 이용하여 리소스 파일을 생성할 수 있다.

아래 이미지는 도구>리소스 편집기 를 이용하여 문자열, 비트맵, 웨이브 파일을 포함하여 생성하였다.



이렇게 생성된 리소스를 코드에서 사용하는 방법에는


 함수

설명 

 LoadResString

텍스트 문자열을 가져옵니다. 

 LoadResPicture 

비트맵, 아이콘 또는 커서와 같은 Picture 개체를 가져옵니다. 

 LoadResData

Byte 배열을 가져옵니다. 이것은 .wav 파일 등에 사용됩니다. 



1. 문자열 테이블에 저장된 텍스트 문자열을 가져오는 예

Debug.Print LoadResString(101)


2. 비트맵 등의 이미지를 가져오는 예

Me.Picture = LoadResPicture("IMG1", vbResBitmap)


3. Custom으로 정의된 Byte 배열을 가져오는 예

Private Declare Function PlaySoundData Lib "winmm.dll" _

                  Alias "PlaySoundA" _

                        (lpData As Any, _

                         ByVal hModule As Long, _

                         ByVal dwFlags As Long) As Long


Private Const SND_ASYNC = &H1

Private Const SND_NODEFAULT = &H2

Private Const SND_MEMORY = &H4


  Dim arrData() As Byte

  arrData = LoadResData(301, "CUSTOM")

  PlaySoundData(arrData(0), ByVal 0&, SND_MEMORY Or SND_ASYNC Or SND_NODEFAULT)



Tip.

리소스 편집기 메뉴가 안보이는 경우에는 추가기능>추가기능관리자 에서 아래와 같이 VB 6 리소스 편집기를 선택한 후 로드 동작에 체크해주면 기능이 활성화 된다.


대기시간을 주고자 할때 아래 코드를 참고하자.

Delay 와 같이 함수형태로 만들어 놓고 1/1000초 단위로 인자값을 넘겨주면 된다.


Private Declare Function GetTickCount Lib "kernel32" () As Long

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)


Private Sub Delay (Optional ByVal lDelayTime As Long = 100)

  On Error Resume Next

  lDelayTime = GetTickCount + lDelayTime

  Do Until GetTickCount > lDelayTime

    Sleep 1

    DoEvents

  Loop

End Sub

'VB6 > Function' 카테고리의 다른 글

Desktop 이름 구하기  (0) 2013.04.01
마우스커서가 위치한 윈도우 핸들 구하기  (0) 2013.03.27

네이트온에 알림창과 같이 폼에 페이드효과가 필요할 때 아래 코드를 참고하자.

Alpha 와 같이 함수형태로 만들어 놓고 핸들값과 Degree값만 바이트 범위(0~255) 내에서 넘겨주면 된다.


Private Declare Function SetLayeredWindowAttributes Lib "user32" _

                        (ByVal hWnd As Long, _

                         ByVal crKey As Long, _

                         ByVal bAlpha As Byte, _

                         ByVal dwFlags As Long) As Long

                         

Private Declare Function SetWindowLong Lib "user32" _

                  Alias "SetWindowLongA" _

                        (ByVal hWnd As Long, _

                         ByVal nIndex As Long, _

                         ByVal dwNewLong As Long) As Long

                  

Private Declare Function GetWindowLong Lib "user32" _

                  Alias "GetWindowLongA" _

                        (ByVal hWnd As Long, _

                         ByVal nIndex As Long) As Long


Private Const GWL_EXSTYLE = (-20)


Private Const WS_EX_LAYERED = &H80000


Private Const LWA_COLORKEY = &H1

Private Const LWA_ALPHA = &H2



Private Sub Alpha(ByVal hHandle As Long, ByVal byDegree As Byte)

  SetWindowLong hHandle, GWL_EXSTYLE, GetWindowLong(hHandle, GWL_EXSTYLE) Or WS_EX_LAYERED

  SetLayeredWindowAttributes hHandle, 0&, byDegree, LWA_ALPHA

End Sub



아래는 호출하는 형태


Private Sub Form_Activate()

  Dim i         As Long

  For i = 0 To 255

    Alpha Me.hWnd, CByte(i)

    DoEvents

  Next i

End Sub




Tip.

LWA_COLORKEY를 적용하면 지정한 색상만 투명하게 만들 수 있다.

Private Sub Transparent(ByVal hHandle As Long, ByVal lColor As Long)

  SetWindowLong hHandle, GWL_EXSTYLE, GetWindowLong(hHandle, GWL_EXSTYLE) Or WS_EX_LAYERED

  SetLayeredWindowAttributes hHandle, lColor, 0&, LWA_COLORKEY

End Sub


호출하는 형태

Private Sub Form_Load()
  Me.BackColor = vbRed
  Transparent Me.hWnd, vbRed
End Sub


'VB6 > Interface' 카테고리의 다른 글

폼에 보여줄 영역 만들기(구멍난 폼)  (0) 2013.03.28
폼 타이틀바 Show/Hide  (0) 2013.03.28
바탕화면 아이콘 Show/Hide  (0) 2013.03.28
폼 위치, 크기 구하기  (0) 2013.03.27
폼 타이틀바 이동효과  (0) 2013.03.26

폼, 컨트롤의 위치이동이 필요할 때에는 아래 코드를 참고하자.

FormMove 와 같이 함수형태로 만들어 놓고 핸들값만 넘겨주면 되니 편하게 사용할 수 있다.


Private Declare Function SendMessage Lib "user32" _

                  Alias "SendMessageA" _

                        (ByVal hwnd As Long, _

                         ByVal wMsg As Long, _

                         ByVal wParam As Long, _

                         lParam As Any) As Long


Private Declare Function ReleaseCapture Lib "user32" () As Long


Private Const WM_NCLBUTTONDOWN = &HA1

Private Const HTCAPTION = 2



Private Sub FormMove(ByVal hHandle As Long)

  ReleaseCapture

  SendMessage hHandle, WM_NCLBUTTONDOWN, HTCAPTION, 0

End Sub



아래는 호출하는 형태(MouseDown 이벤트에 적용하도록 하자.)


Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

  FormMove Me.hwnd

End Sub



'VB6 > Interface' 카테고리의 다른 글

폼에 보여줄 영역 만들기(구멍난 폼)  (0) 2013.03.28
폼 타이틀바 Show/Hide  (0) 2013.03.28
바탕화면 아이콘 Show/Hide  (0) 2013.03.28
폼 위치, 크기 구하기  (0) 2013.03.27
폼 투명도 주기  (0) 2013.03.27

+ Recent posts