A utocad AutoCAD VBA 중급활용강좌 캐드의윈도우창제어하기 이번달부터 AutoCAD VBA 중급활용강좌를소개하고자한다. <AutoCAD Office> 의저자인이혁진씨의강좌로이번호에서는캐드의윈도우창제어하기에대해알아보도록하자. 연재순서 제1회캐드의윈도우창제어하기제2회꼭알아야할 PLOT 관련 VBA 명령제3회 TEXT 편집기법 (1) 제4회 TEXT 편집기법 (2) 제5회객체 (Line, Circle 등 ) 의조작제6회레이어와객체선택필터링기법 VBA가캐드 2002부터본격적으로탑재되어유저층을형성한지도 4년정도흘러간다. 짧은시간은아니었지만, 그간 VBA 유저의형성이좀처럼쉽지않았다. 그러나점차적으로 LISP 개발자들이 VBA로차츰차츰변환하기시작하였고, 신생개발자들도 LISP보다 VBA를선택하는경향이많아졌다. Autodesk에서는 아직도 LISP을사용하십니까? 라고유저들에게질문을던지곤한다. 향후타프로그램과의연동및개발흐름에발맞추기위해서라도 VBA 고급유저로서의길을조속히선택하고, 향상시켜나간다면, 개인능력배양및업무개선에도큰역할을할수있을것이다. 이에따라이번호부터 VBA를가지고중급정도의활용명령및기법에대해서기술하고, 간단한예제를통해서초급및중급 VBA 사용자들도쉽게따라할수있도록작성해보았다. 예제코드는고급스럽게작성하기보다는간결하면서도이해하기쉽게펼쳐놓았다. 이혁진 한국철도기술공사구조설계부과장으로근무하고있으며, 신구대학외래강사로도활동하고있다. 저서로는 <AutoCAD Office> 가있다. E-Mail master@vbcad.co.kr 홈페이지 http://www.vbcad.co.kr 캐드의활성화상태알아내기현재실행되어진캐드의활성화 (Active) 상태를알아보도록하자. 아래의코드는캐드 2002~2006에서작동되며, 현재의캐드창의활성화 (Active) 상태를메시지박스를통해알려준후에, 현재열려있는캐드를최소화 (Minimize) 시키는코드예제이다. 114 C 2006/2
AutoCAD VBA 중급활용강좌 Sub 캐드의활성화상태 () 충분하지못한캐드 14버전도제어할수있다. 아래의코드는 'Application.hwnd' 속성을지원해주는캐드 2005 이상에서만실행된다. Dim 캐드상태 As Integer ' 현재의상태를나타냄캐드상태 = Application.WindowState Select Case 캐드상태 Case 1: MsgBox " 활성화 " Case 2: MsgBox " 최소화 " Case 3: MsgBox " 최대화 " End Select ' 캐드를최소화상태로바꿈 Application.WindowState = acmin 'acmin : 최소화, acmax : 최대화, acnorm : 활성화 ( 일반 ) 캐드 (Application) 최소화상태로작업표시줄에만표시된모습위의코드중에서창을최대화시키려면 acmax를, 창을일반활성화시키려면 acnorm을입력하면된다. Application.WindowState = acmax 또는 Application.WindowState = acnorm 또한, Application 대신에 Thisdrawing로변경하면현재도면의상태를변화시켜준다. Private Declare Function GetWindowPlacement Lib "user32" (ByVal Private Type POINTAPI x As Long y As Long Private Type RECT Left As Long Top As Long Right As Long Bottom As Long Private Type WINDOWPLACEMENT Length As Long flags As Long showcmd As Long ptminposition As POINTAPI ptmaxposition As POINTAPI rcnormalposition As RECT Sub 캐드활성화상태2() Dim x As Long Dim kname As String * 250 Dim kclass As WINDOWPLACEMENT Dim 캐드활성화상태 As Integer '2005 버전에서사용되는속성 도면 (thisdrawing) 최소화상태 x = GetWindowPlacement(hwnd, kclass) 캐드활성화상태 = kclass.showcmd Thisdrawing.WindowState = acmax 또는 Thisdrawing.WindowState = acnorm 아래의코드는 API 함수를이용하여위에서소개한 창의활성화상태기능 을구현해본예제이다. 아래의코드를잘이용하면, VBA의매서드 (methode) 및속성 (property) 기능이 Select Case 캐드활성화상태 Case 1: MsgBox " 캐드창활성상태 " Case 2: MsgBox " 캐드창최소화상태 " Case 3: MsgBox " 캐드창최대화상태 " End Select 2006/2 C 115
A utocad 위의코드중에서 Application.hwnd 부분을 '2005버전에서사용되는속성 Thisdrawing.hwnd로고치면현재도면의최소화, 최대화, 활성화여부를알수있다. hwnd = Thisdrawing.hwnd '2002 이상버전에서모두사용됨 캐드창의위치조정현재실행되어진캐드가바탕화면에서어디에위치하고있는지그좌표값을알아보고, 캐드의폭과넓이도알아내어보자. 아래의코드는캐드 2005에서작성된코드로 API 함수를이용하여캐드창의왼쪽, 오른쪽, 위, 아래와폭, 높이를구하는예제이다. API 함수를이용하면캐드뿐만아니라, 현재실행되어진모든프로그램의위치를알아낼수있다. Private Declare Function GetWindowPlacement Lib "user32" (ByVal Private Type POINTAPI x As Long y As Long Private Type RECT Left As Long Top As Long Right As Long Bottom As Long 캐드화면의위치 아래는캐드 2002 2006에모두해당되는코드이다. Sub 캐드위치 () With Application MsgBox " 캐드창의왼쪽위치 : " &.WindowLeft MsgBox " 캐드창의위쪽위치 : " &.WindowTop MsgBox " 캐드창의폭 : " &.Width MsgBox " 캐드창의높이 : " &.Height End With Private Type WINDOWPLACEMENT Length As Long flags As Long showcmd As Long ptminposition As POINTAPI ptmaxposition As POINTAPI rcnormalposition As RECT Sub 캐드위치2_API() Dim x As Long Dim kclass As WINDOWPLACEMENT Dim 캐드Left As Long Dim 캐드Right As Long Dim 캐드Top As Long Dim 캐드Bottom As Long 캐드창의위치와크기를조절하려면속성 (Property) 에값을주면된다. 위의코드를아래와같이수정하면왼쪽 100, 위쪽 150, 폭 800, 높이 600의캐드창으로변경할수있다. kclass.length = 44 '2005 버전에서사용되는속성 With Application.WindowLeft=100 :.WindowTop=150.Width=800 :.Height=600 End With x = GetWindowPlacement(hwnd, kclass) 캐드Left = kclass.rcnormalposition.left 캐드Top = kclass.rcnormalposition.top 캐드Right = kclass.rcnormalposition.right 116 C 2006/2
AutoCAD VBA 중급활용강좌 캐드Bottom = kclass.rcnormalposition.bottom MsgBox " 캐드창의왼쪽위치 : " & 캐드Left MsgBox " 캐드창의위쪽위치 : " & 캐드Top MsgBox " 캐드창의오른쪽위치 : " & 캐드Right MsgBox " 캐드창의아래위치 : " & 캐드Bottom MsgBox " 캐드창의폭 : " & ( 캐드Right - 캐드Left) MsgBox " 캐드창의높이 : " & ( 캐드Bottom - 캐드Top) pos = InStr(sTitle, Chr(0)) If pos Then stitle = Left(sTitle, pos - 1) Else stitle = "" End If ' 창제목은 stitle이며메시지박스로보여짐 MsgBox stitle 실행되어진캐드의창제목알아내기현재실행되어진캐드의창제목을알아내기위해서는기본적인 API 함수들을알아야하는데, API 함수를잘모른다하더라도아래코드를입력하고실행시키면원하는값을얻을수있다. API 함수는입력하는과정중에자연스럽게하나씩익혀질것이다. 도면의이름을알아내는방법은아래와같이간단한속성을이용하여볼수있다. 단읽기전용속성이어서타이틀을수정할수는없다.(AutoCAD 2002 2006 버전에서사용 ) thisdrawing.windowtitle 캐드의창이름 실행결과 도면 (Thisdrawing) 의타이틀 아래의코드는 Application.hwnd 속성을지원해주는캐드 2005 이상에서만실행된다. Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _ (ByVal hwnd As Long, ByVal lpstring As String, _ ByVal cch As Long) As Long Const MAX_PATH = 255 Sub 창제목알아내기 () 창제목변경하기현재실행되어진캐드의창제목을변경하여, 자신만의캐드이름을만들수있다. 여기에서는 'AutoCAD 2005 - [Drawing1.dwg]' 라는글자를 'VBCad AddTools 2005 - [Drawing1.dwg]' 로바꾸는예제이다. 앞에서살펴본 창제목알아내기 코드를변형하여 AutoCAD의창제목을변경하고현재열려있는파일이름도창제목과함께표시하는코드를만들어보자. ' 변수지정 Dim stitle As String Dim pos As Integer ' 제목이저장될변수 stitle = Space(MAX_PATH) 기본설정값 ( 변경전 ) ' 윈도우의창제목을알아내는 API 함수 Call GetWindowText(hwnd, stitle, MAX_PATH) ' 특수문자가있을경우의처리 창제목의이름변경 ( 변경후 ) 2006/2 C 117
A utocad 아래의코드는 AutoCAD 2005에서테스트한코드이다. Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _ (ByVal hwnd As Long, ByVal lpstring As String, _ ByVal cch As Long) As Long Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" _ (ByVal hwnd As Long, ByVal lpstring As String) As Long Const MAX_PATH = 255 Sub 창제목변경 () Dim stitle As String Dim pos As Integer Dim 화일이름 As String Dim 제목명 As String stitle = Space(MAX_PATH) Call GetWindowText(hwnd, stitle, MAX_PATH) pos = InStr(sTitle, Chr(0)) If pos Then stitle = Left(sTitle, pos - 1) Else stitle = "" End If ' 현재열려있는화일이름을저장해놓음화일이름 = Right(sTitle, Len(sTitle) - 7) ' "VBCad AddTools" 이란글자와현재화일이름을결합시킴제목명 = "VBCad AddTools" + 화일이름 ' 타이틀변경 SetWindowText hwnd, 제목명 윈도우창을제어할수있는유용한 API 함수들외부프로그램실행시키기 Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpoperation As String, ByVal lpfile As String, ByVal lpparameters As String, ByVal lpdirectory As String, ByVal nshowcmd As Long) As Long 클래스이름가져오기 Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpclassname As String, ByVal nmaxcount As Long) As Long 윈도우찾기 Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpclassname As String, ByVal lpwindowname As String) As Long 실행된윈도우찾기 Public 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 현재실행중인윈도우핸들가져오기 Public Declare Function GetForegroundWindow Lib "user32" () As Long 윈도우의창글자 (Title) 가져오기 Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _ (ByVal hwnd As Long, ByVal lpstring As String, ByVal cch As Long) As Long 윈도우의창글자 (Title) 를변경 Public Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpstring As String) As Long 키보드눌림감지 Public Declare Function GetKeyState Lib "user32" (ByVal nvirtkey As Long) As Integer 윈도우를전경으로보냄 Public Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long 118 C 2006/2
AutoCAD VBA 중급활용강좌 윈도우의위치를가져옴 Public Declare Function GetWindowPlacement Lib "user32" (ByVal 윈도우의위치를설정함 Public Declare Function SetWindowPlacement Lib "user32" (ByVal 현재마우스의위치 Public Declare Function GetCursorPos Lib "user32" (lppoint As POINTAPI) As Long 자식의핸들모두알아내기 ( 콜백함수 ) Public Declare Function EnumChildWindows Lib "user32" (ByVal hwndparent As Long, ByVal lpenumfunc As Long, ByVal lparam As Long) As Long 윈도우밑의핸들모두알아내기 ( 콜백함수 ) Public Declare Function EnumWindows Lib "user32" (ByVal lpenumfunc As Long, ByVal lparam As Long) As Long Type 정의 잠깐! 멀쩡한카트리지를왜버리세요? 다써버린레이저프린터의카트리지 -. 레이저테크가보기에는아직멀쩡합니다. 한번쓰고버리기엔너무아까운레이저빔프린터의일회용카트리지. 이제레이저빔프린터의카트리지는더이상일회용이아닙니다. 레이저테크가국내최초로개발해낸리어셈블림방식으로여러번사용할수있습니다. 물론출력상태는일반카트리지와똑같습니다. 더이상카트리지를버리지마십시오. 대신레이저테크를부르십시오. Public Type POINTAPI x As Long y As Long Public Type RECT Left As Long Top As Long Right As Long Bottom As Long Public Type WINDOWPLACEMENT Length As Long flags As Long showcmd As Long ptminposition As POINTAPI ptmaxposition As POINTAPI rcnormalposition As RECT 레이저테크가이룩한 3대혁신레이저테크에서자체개발한리어셈가격블링방식으로기존카트리지의 50% 가격을실현했습니다. 2년에걸친연구결과기존카트리지기술와출력상태가동일한카트리지리어셈블링방식을개발했습니다. 정기적으로레이저테크맨이방서비스문하여카트리지를교환해드리므로훨씬편리합니다. 우편번호 138-240 서울특별시송파구신천동 11-9 한신코아오피스텔 1108 호 TEL : (02)419-2839, FAX : (02)419-6510 이미사용하신카트리지를레이저테크에주시면보상해드립니다. 2006/2 C 119