'VB6 > Basic' 카테고리의 다른 글
[내장함수] ParamArray 키워드 (0) | 2013.04.09 |
---|---|
[내장함수] 그림판 선그리기 (0) | 2013.04.09 |
[내장함수] DDE 기능 활용하기 (1) | 2013.04.09 |
[내장함수] AsyncRead를 이용한 웹이미지 가져오기 (0) | 2013.04.01 |
[내장함수] 해당월에 마지막 날짜 구하기 (1) | 2013.03.29 |
[내장함수] ParamArray 키워드 (0) | 2013.04.09 |
---|---|
[내장함수] 그림판 선그리기 (0) | 2013.04.09 |
[내장함수] DDE 기능 활용하기 (1) | 2013.04.09 |
[내장함수] AsyncRead를 이용한 웹이미지 가져오기 (0) | 2013.04.01 |
[내장함수] 해당월에 마지막 날짜 구하기 (1) | 2013.03.29 |
[내장함수] 날짜함수 정리 (0) | 2013.04.12 |
---|---|
[내장함수] 그림판 선그리기 (0) | 2013.04.09 |
[내장함수] DDE 기능 활용하기 (1) | 2013.04.09 |
[내장함수] AsyncRead를 이용한 웹이미지 가져오기 (0) | 2013.04.01 |
[내장함수] 해당월에 마지막 날짜 구하기 (1) | 2013.03.29 |
Line함수를 이용하여 아래와 그림판과 같이 선그리기를 해보겠습니다.
프로젝트를 한개 열고 아래 그림과 같이 컨트롤을 배치합니다.
그림을 그릴 PictureBox 1개, 그린 그림을 저장할 수 있게 CommandBox 1개, 저장경로를 표시할 TextBox 1개
폼에 다음과 같이 입력합니다.
Private Sub Form_Load()
Command1.Caption = "Save"
Text1.Text = "c:\그림.bmp"
Picture1.AutoRedraw = True
Picture1.ForeColor = vbBlack
Picture1.BackColor = vbWhite
End Sub
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = vbLeftButton Then
Picture1.CurrentX = X: Picture1.CurrentY = Y
End If
End Sub
Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = vbLeftButton Then Picture1.Line -(X, Y)
End Sub
Private Sub Command1_Click()
SavePicture Picture1.Image, Text1.Text
End Sub
작성된 내용이 너무 하네요.. 죄송합니다.
Tip.
MouseMove 이벤트에 마우스 왼쪽 버튼을 눌렀을때 라인을 그리는 Picture1.Line -(X, Y)을
Picture1.Line -(X, Y), , B 또는 Picture1.Line -(X, Y), , BF 로 바꾸어 보면 더욱 재밌는 모양이 만들어집니다.
MSDN을 참고하여 각 인수의 설명을 참고하시기 바랍니다.
[내장함수] 날짜함수 정리 (0) | 2013.04.12 |
---|---|
[내장함수] ParamArray 키워드 (0) | 2013.04.09 |
[내장함수] DDE 기능 활용하기 (1) | 2013.04.09 |
[내장함수] AsyncRead를 이용한 웹이미지 가져오기 (0) | 2013.04.01 |
[내장함수] 해당월에 마지막 날짜 구하기 (1) | 2013.03.29 |
Private Sub Form_Load()
Text1.LinkItem = "Text1"
Text1.LinkTopic = "DDEHost|Form1"
Text1.LinkTimeout = 50
Timer1.Interval = 100
Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
On Error GoTo errHandler
Text1.LinkMode = vbLinkAutomatic
Me.Caption = "Connected"
Exit Sub
errHandler:
Me.Caption = "Wait"
End Sub
상수 |
설정 |
설명 |
VbLinkNone | 0 | (기본값) 없음 — DDE 대화가 없습니다. |
VbLinkAutomatic | 1 |
자동 — 연결된 데이터가 변할 때마다 대상 컨트롤이 업데이트됩니다. |
VbLinkManual | 2 | 수동—LinkRequest가 호출될 때만 대상 컨트롤이 업데이트됩니다. |
VbLinkNotify | 3 | 통보— LinkNotify 이벤트는 연결된 데이터가 변할 때마다 일어납니다. 그러나 대상 컨트롤은 LinkRequest메서드가 호출될 때만 업데이트됩니다. |
[내장함수] ParamArray 키워드 (0) | 2013.04.09 |
---|---|
[내장함수] 그림판 선그리기 (0) | 2013.04.09 |
[내장함수] AsyncRead를 이용한 웹이미지 가져오기 (0) | 2013.04.01 |
[내장함수] 해당월에 마지막 날짜 구하기 (1) | 2013.03.29 |
리소스 활용하기 (0) | 2013.03.27 |
현재 Desktop 이름을 알고 싶을때 아래 코드를 참고하자.
GetDesktopName와 같이 함수형태로 만들어 놓으면 호출시 문자열값을 리턴한다.
Private Declare Function GetUserObjectInformation Lib "user32" _
Alias "GetUserObjectInformationA" _
(ByVal hObj As Long, _
ByVal nIndex As Long, _
pvInfo As Any, _
ByVal nLength As Long, _
lpnLengthNeeded As Long) As Long
Private Declare Function GetThreadDesktop Lib "user32" _
(ByVal dwThread As Long) As Long
Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long
Private Const UOI_FLAGS As Long = 1
Private Const UOI_NAME As Long = 2
Private Const UOI_TYPE As Long = 3
Private Const UOI_USER_SID As Long = 4
Private Function GetDesktopName() As String
Dim hDesktop As Long
Dim sBuffer As String
Dim lLength As Long
hDesktop = GetThreadDesktop(GetCurrentThreadId)
If hDesktop = 0 Then Exit Function
GetUserObjectInformation hDesktop, UOI_NAME, ByVal vbNullString, 0&, lLength
sBuffer = Space(lLength)
GetUserObjectInformation hDesktop, UOI_NAME, ByVal sBuffer, lLength, lLength
If InStr(sBuffer, Chr(0)) Then
GetDesktopName = Left(sBuffer, InStr(sBuffer, Chr(0)) - 1)
End If
End Function
마우스커서가 위치한 윈도우 핸들 구하기 (0) | 2013.03.27 |
---|---|
대기시간 함수 (0) | 2013.03.27 |
[내장함수] ParamArray 키워드 (0) | 2013.04.09 |
---|---|
[내장함수] 그림판 선그리기 (0) | 2013.04.09 |
[내장함수] DDE 기능 활용하기 (1) | 2013.04.09 |
[내장함수] 해당월에 마지막 날짜 구하기 (1) | 2013.03.29 |
리소스 활용하기 (0) | 2013.03.27 |
날짜함수중 DateSerial과 DateAdd 함수를 이용하여 해당월에 마지막 날짜을 알아오는 방법을 알아보겠습니다.
MSDN 자료를 보면
지정된 년, 월, 일의 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 범위를 넘는 인수이거나 세 인수를 사용하여 지정된 날짜가 허용 범위를 넘을 경우 오류가 발생합니다.
특정 시간 간격을 포함한 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
[내장함수] ParamArray 키워드 (0) | 2013.04.09 |
---|---|
[내장함수] 그림판 선그리기 (0) | 2013.04.09 |
[내장함수] DDE 기능 활용하기 (1) | 2013.04.09 |
[내장함수] AsyncRead를 이용한 웹이미지 가져오기 (0) | 2013.04.01 |
리소스 활용하기 (0) | 2013.03.27 |
폼이 움이직다가 화면 가장자리에 닿으면 다른 방향으로 튀게 하여 화면 안에서 움직이는 폼을 만들어 보겠습니다.
폼에 타이머를 한개 가져다 두고 아래 코드를 작성하면 됩니다.
화면 가장자리에 닿았는지에 따라 mMoveX와 mMoveY가 다음 이동방향을 결정하는 부분이 중요합니다.
Private mMoveX As Long
Private mMoveY As Long
Private Sub Form_Click()
Unload Me
End Sub
Private Sub Form_Load()
mMoveX = 1
mMoveY = 1
Timer1.Enabled = True
Timer1.Interval = 1
End Sub
Private Sub Timer1_Timer()
Const MoveInterval As Long = 10
Dim lLeft As Long
Dim lTop As Long
Dim lRight As Long
Dim lBottom As Long
lLeft = Me.Left
lTop = Me.Top
lRight = Me.Left + Me.Width
lBottom = Me.Top + Me.Height
If lLeft <= 0 Or lRight >= Screen.Width Then
mMoveX = mMoveX * -1
End If
If lTop <= 0 Or lBottom >= Screen.Height Then
mMoveY = mMoveY * -1
End If
Me.Move Me.Left + (MoveInterval * mMoveX * 15), Me.Top + (MoveInterval * mMoveY * 15)
End Sub
다음은 동일한 기능을 수행하도록 API로 작성해보았습니다.
Private Declare Function GetWindowRect Lib "user32" _
(ByVal hwnd As Long, _
lpRect As RECT) As Long
Private Declare Function GetClientRect Lib "user32" _
(ByVal hwnd As Long, _
lpRect As RECT) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function SetWindowPos Lib "user32" _
(ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal cx As Long, _
ByVal cy As Long, _
ByVal wFlags As Long) As Long
Private Const SWP_NOSIZE = &H1
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private mMoveX As Long
Private mMoveY As Long
Private Sub Form_Click()
Unload Me
End Sub
Private Sub Form_Load()
mMoveX = 1
mMoveY = 1
Timer1.Enabled = True
Timer1.Interval = 1
End Sub
Private Sub Timer1_Timer()
Const MoveInterval As Long = 10
Dim ClientRect As RECT
Dim WindowRect As RECT
GetClientRect GetDesktopWindow, ClientRect
GetWindowRect Me.hwnd, WindowRect
If WindowRect.Left <= 0 Or WindowRect.Right >= ClientRect.Right Then
mMoveX = mMoveX * -1
End If
If WindowRect.Top <= 0 Or WindowRect.Bottom >= ClientRect.Bottom Then
mMoveY = mMoveY * -1
End If
SetWindowPos Me.hwnd, 0&, WindowRect.Left + (MoveInterval * mMoveX), _
WindowRect.Top + (MoveInterval * mMoveY), 0, 0, SWP_NOSIZE
End Sub
폼에 위치나 크기정보를 가져오기 위해 GetClientRect와 GetWindowRect를 사용하였네요.
구멍뚫린 폼을 만들어 볼까 합니다.
예를들어 캡순이 프로그램 처럼 지정된 영역안에 있는 화면만 캡춰하여 이미지로 저장할 수 있는 기능을 만들고자 할때 가운데가 비어있는 사각틀을 만들어야 되겠죠? 그래서 그 사각틀을 만들어 볼까 합니다.
사각틀을 만드는 다른방법으로 SetLayeredWindowAttributes 를 사용하여 해당 색상을 투명하게 만들어 작업할 수도 있습니다.
아래 그림과 같이 윈도우 폼은 일반적으로 타이틀이나 테두리 부분이 있는 비클라이언트 영역과 컨트롤 등을 배치하여 작업을
하는 클라이언트 영역으로 나뉩니다.
여기에서는 폼사이즈에 변경에 관계없이 클라이언트 영역만 안보이게 하여 아래 그림과 같이 만들어 보겠습니다.
Private Declare Function GetWindowRect Lib "user32" _
(ByVal hwnd As Long, _
lpRect As RECT) As Long
Private Declare Function GetClientRect Lib "user32" _
(ByVal hwnd As Long, _
lpRect As RECT) As Long
Private Declare Function CreateRectRgn Lib "gdi32" _
(ByVal X1 As Long, _
ByVal Y1 As Long, _
ByVal X2 As Long, _
ByVal Y2 As Long) As Long
Private Declare Function OffsetRgn Lib "gdi32" _
(ByVal hRgn As Long, _
ByVal x As Long, _
ByVal y As Long) As Long
Private Declare Function CombineRgn Lib "gdi32" _
(ByVal hDestRgn As Long, _
ByVal hSrcRgn1 As Long, _
ByVal hSrcRgn2 As Long, _
ByVal nCombineMode As Long) As Long
Private Declare Function SetWindowRgn Lib "user32" _
(ByVal hwnd As Long, _
ByVal hRgn As Long, _
ByVal bRedraw As Boolean) As Long
Private Declare Function DeleteObject Lib "gdi32" _
(ByVal hObject As Long) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Const RGN_AND = 1
Private Const RGN_OR = 2
Private Const RGN_XOR = 3
Private Const RGN_DIFF = 4
Private Const RGN_COPY = 5
Private Sub Form_Resize()
Const Degree As Long = 0
Dim WindowRect As RECT
Dim ClientRect As RECT
Dim hRgn1 As Long
Dim hRgn2 As Long
Dim lMoveX As Long
Dim lMoveY As Long
GetWindowRect Me.hwnd, WindowRect
GetClientRect Me.hwnd, ClientRect
lMoveX = ((WindowRect.Right - WindowRect.Left) - ClientRect.Right) \ 2
lMoveY = ((WindowRect.Bottom - WindowRect.Top) - ClientRect.Bottom) - lMoveX
hRgn1 = CreateRectRgn(0, 0, WindowRect.Right - WindowRect.Left, WindowRect.Bottom - WindowRect.Top)
hRgn2 = CreateRectRgn(0, 0, ClientRect.Right - Degree * 2, ClientRect.Bottom - Degree * 2)
OffsetRgn hRgn2, lMoveX + Degree, lMoveY + Degree
CombineRgn hRgn1, hRgn1, hRgn2, RGN_XOR
SetWindowRgn Me.hwnd, hRgn1, True
DeleteObject hRgn1
DeleteObject hRgn2
End Sub
폼의 비 클라이언트 영역을 포함한 크기로 Region을 만들고(hRgn1), 구멍의 크기를 클라이언트 영역으로 잡고(hRgn2),
OffsetRgn을 이용하여 hRgn2의 위치를 타이틀과 테두리의 크기를 뺀 위치만큼 이동시키고 이를 CombineRgn으로 XOR하여
겹치지 않는 영역만 남게하여 폼에 적용하고 생성한 Region을 지우는 겁니다.
GetWindowRect, GetClientRect의 설명은 아래 링크를 참고하세요.
Tip.
Form_Resize 안에 Degree 값을 증가시키면 사각틀 안쪽이 좁아지게 됩니다.
폼 타이틀바 Show/Hide (0) | 2013.03.28 |
---|---|
바탕화면 아이콘 Show/Hide (0) | 2013.03.28 |
폼 위치, 크기 구하기 (0) | 2013.03.27 |
폼 투명도 주기 (0) | 2013.03.27 |
폼 타이틀바 이동효과 (0) | 2013.03.26 |
키오스크 등의 프로그램을 위해 윈도우 타이틀바를 필요치 않으면 Form 속성중 BorderStyle을 0으로 설정하는데
런타임시에 Show/Hide를 하고 싶을때 아래 코드를 참고하자.
Private Declare Function GetWindowLong Lib "user32" _
Alias "GetWindowLongA" _
(ByVal hwnd As Long, _
ByVal nIndex 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 GetWindowRect Lib "user32" _
(ByVal hwnd As Long, _
lpRect As RECT) As Long
Private Declare Function SetWindowPos Lib "user32" _
(ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal cx As Long, _
ByVal cy As Long, _
ByVal wFlags As Long) As Long
Private Const GWL_STYLE = (-16)
Private Const WS_CAPTION = &HC00000 ' WS_BORDER Or WS_DLGFRAME
Private Const WS_MAXIMIZEBOX = &H10000
Private Const WS_MINIMIZEBOX = &H20000
Private Const WS_THICKFRAME = &H40000
Private Const WS_SYSMENU = &H80000
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOZORDER = &H4
Private Const SWP_FRAMECHANGED = &H20
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Sub Command1_Click()
SetWindowLong Me.hwnd, GWL_STYLE, _
GetWindowLong(Me.hwnd, GWL_STYLE) And Not (WS_CAPTION)
SetWindowPos Me.hwnd, 0, 0, 0, 0, 0, _
SWP_NOSIZE Or SWP_NOMOVE Or SWP_NOZORDER Or SWP_FRAMECHANGED
End Sub
Private Sub Command2_Click()
SetWindowLong Me.hwnd, GWL_STYLE, _
GetWindowLong(Me.hwnd, GWL_STYLE) Or (WS_CAPTION)
SetWindowPos Me.hwnd, 0, 0, 0, 0, 0, _
SWP_NOSIZE Or SWP_NOMOVE Or SWP_NOZORDER Or SWP_FRAMECHANGED
End Sub
Private Sub Form_Load()
Command1.Caption = "Hide"
Command2.Caption = "Show"
End Sub
폼에 보여줄 영역 만들기(구멍난 폼) (0) | 2013.03.28 |
---|---|
바탕화면 아이콘 Show/Hide (0) | 2013.03.28 |
폼 위치, 크기 구하기 (0) | 2013.03.27 |
폼 투명도 주기 (0) | 2013.03.27 |
폼 타이틀바 이동효과 (0) | 2013.03.26 |