강좌,팁

[강좌:29] 타이틀바 없는 Panel을 마우스로 드래그하기

조회 수 16932 추천 수 0 2006.06.03 23:20:02
허창원 *.19.45.14

일에 쫓겨서 너무 오랫동안 CVI 강좌에 손을 놓고 있었습니다.
일을 지배하는 자가 되어야지, 일에 쫓기는 사람이 되지 않기를 바랍니다.
그러기 위해서는 뚜렷한 목표가 있어야겠지요...

---------------------------------------------------------------------------------------

[강좌:29] 타이틀바 없는 Panel을 마우스로 드래그하기

이용된 버전: LabWindows/CVI 7.1.1
강좌분류: 라이브러리 이용하기
활용수준: 중급
(활용수준은 난이도와는 별개의 개념으로 사용합니다)

차례
프롤로그
1. 이번 예제 프로그램의 개요
2. 작업준비
3. KDMovePanel.dll 이용
    3.1 Import Library를 프로젝트에 추가
    3.2 타이머 추가 및 콜백함수 생성
    3.3 기능이용을 위한 초기화
    3.4 Panel 콜백 구현
에필로그

 

프롤로그
제목을 보시고 많은 분들이 필요하였을 줄 압니다. 저도 필요하긴 했었는데, 그냥 불편한 대로 지내다가 질문게시판에서 질문을 받은 후에 생각을 해보니 의외로 간단하게 처리할 수 있겠더군요.
그때 답변을 드렸는데, 시간이 지나서 저도 그 기능을 이용할 때에 다시 뒤져보니까 좀 불편하더군요. 바쁠 때는 금방 그런 기능을 끌어다 쓸 수 있어야되는데 말이지요.
그래서 사용하기 좀더 쉽고 편하게 KDMovePanel.dll을 만들었습니다. 이 라이브러리를 어떻게 쉽게 사용하는지를 보이기 위한 강좌입니다.

1. 이번 예제 프로그램의 개요
예제 프로그램은 간단해야 이해하기 쉽죠? 꼭 필요한 것만 기본 프로그램에 추가해봅니다. 그림 1.1에 실행화면을 보였습니다. 화면의 모양이 중요한 게 아니고, 동작이 중요하지만요.

그림 1.1 MovePanel 프로그램의 실행화면

화면을 보면 무엇을 하겠다는 것인지 금방 이해될 겁니다. Panel(Window, 창)을 옮기려면 타이틀바가 있어야되는데, 여기서는 없앴습니다.

원리는 이렇습니다.
Panel을 마우스 왼쪽 버튼으로 누르면, 그 때의 Panel과 마우스 포인터의 위치를 저장해 두고,
누른채로 마우스를 옮기면 그때그때마다 마우스의 위치를 구하고, 옮겨진 거리만큼 Panel의 위치를 이동시킵니다.
마우스를 옮길 때마다 그 위치를 얻어내기 위해서 타이머를 추가적으로 이용할 것입니다.

이제 이 Panel을 마우스로 클릭하여 옮기는 작업을 해봅니다.

2. 작업준비
작업 준비 과정은 "[강좌:21] CVI 프로그래밍 시작단계 정의(2)" 강좌 글의
"2. LabWindows/CVI의 프로그래밍 작업 시작단계" 부분에 따라 아래와 같이 간단히 정리합니다.

프로젝트 파일명: MovePanel.prj

화면구성은 그림 2.1에 보였습니다.

그림 2.1 MovePanel 프로젝트의 화면구성

uir 파일 내의 각 컨트롤의 속성은 표 2.1과 같이 설정합니다.

표 2.1 컨트롤의 속성값

컨트롤 종류 Constant Name Callback Function Label 비고
Text Message TEXTMSG    

Default Value에
"Panel을 클릭하여 옮겨보세요."

Command Button cmdExit cmdExit Exit  

 

Panel의 속성은 표2.2와 같이 설정합니다.

표 2.2 Panel의 속성설정

Panel 속성설정

Constant Name

PANEL

Callback Function

PanelCB

Panel Title

MovePanel

Other Attr...-Title Bar Visible

unchecked

Other Attr...-Sizable

unchecked

Other Attr...-Can Maximize

unchecked

Panel 속성설정에서 Other Attributes의 "Sizable"과 "Can Maximize"를 uncheck 해두는 것은 안하셔도 상관없습니다.

그리고, 기본 소스를 생성합니다. 여기까지는 대체로 일반적인 프로그램 시작과정입니다.

3. KDMovePanel.dll 이용
지금부터 이용할 라이브러리는 KDMovePanel.dll 이고, 자료실(CVI정보나눔 자료실)에 업로드되어 있습니다. 아래의 이름으로 검색해보세요.

[라이브러리] KDMovePanel.dll (2006.6.3버전)

그림 3.1에 다운로드받은 KDMovePanel.dll 관련 파일들을 보였습니다. 실행시에는 dll 파일만 있으면 되지만, 프로그래밍할 때에는 헤더파일과 Import library가 모두 필요합니다.

그림 3.1 KDMovePanel.dll 관련 파일

3.1 Import Library를 프로젝트에 추가
이제 KDMovePanel.lib 파일을 프로젝트에 포함시킵니다. 헤더파일인 KDMovePanel.h 파일도 프로젝트에 포함시켜두면 열어보기가 편리합니다. 그림 3.2에 추가된 프로젝트 창을 보였습니다.

그림 3.2 프로젝트에 추가된 KDMovePanel.lib Import Library

이것 역시, DLL을 사용할 때의 일반적인 과정입니다.

3.2 타이머 추가 및 콜백함수 생성
MovePanel의 기능을 구현하기 위해서 전용 타이머 컨트롤을 하나 추가합니다. 다른 프로그램 작업시에 MovePanel 기능을 이용하려고 할 때에도 타이머를 이용하는 다른 기능과 충돌되지 않도록 별도의 타이머 컨트롤을 추가하는 것이 좋습니다. 타이머의 속성은 그림 3.3과 같이 Constant Name, Callback Function, Control Settings를 지정합니다.

그림 3.3 MovePanel을 위한 타이머의 속성

그리고, 콜백함수를 Generate 합니다. (UIR 창에서 Timer 컨트롤을 선택한 후, Ctrl+G 단축키나 Code - Generate - Control Callbacks 메뉴를 선택합니다.)
그리고, KDMovePanel.dll의 함수를 그림 3.4와 같이 미리 적어줍시다.

그림 3.4 Timer 콜백함수

3.3 기능이용을 위한 초기화
순서가 조금 바뀌었지만, 이제 KDMovePanel.h 헤더파일을 포함시키고, 초기화함수를 프로그램이 시작되는 부분에 추가합니다. 그림 3.5와 같이 하면 되겠습니다.

그림 3.5 헤더파일과 초기화 함수 라인 추가

초기화 함수의 인자로 들어가는 두가지 중 처음 것은 DLL 내에 선언된 전역변수 kdmovepanel 구조체 변수의 포인터이고, 두 번째는 위에서 추가한 타이머 컨트롤의 ID 입니다.

3.4 Panel 콜백 구현
이제 마지막 코딩 과정으로서 Panel 콜백함수에 마우스 왼쪽 버튼을 클릭했을 때의 처리부분을 그림 3.6과 같이 넣어줍니다.

그림 3.6 Panel 콜백에서 마우스 왼쪽 버튼 클릭에 따른 이벤트 처리 추가

함수의 사용이 C++ 의 클래스의 멤버함수 사용하는 것처럼 보이지요? 오래도록 프로그래밍을 하다보니 객체지향적인 스타일의 함수 사용이 여러모로 편리하다는 사실을 느꼈습니다. C++에서는 위의 함수의 첫 번째 인자부분은 this 인자로 넘어가기 때문에 생략하지만, C에서는 그럴 방법이 잘 안떠오르더군요. 포인터를 넘겨주구요, 두 번째 인자는 현재 panel의 핸들값을 넣어줍니다.

이 StartPanelMove() 멤버함수에서 처리하는 것은 Panel 상에서 마우스의 위치를 저장하고, 타이머를 0.01초 간격으로 세트한 후, Enable 시킵니다. 즉, Panel을 마우스 왼쪽 버튼으로 클릭했을 경우에만 타이머가 동작합니다.

그리고, Timer 콜백함수의 MovePanel() 멤버함수에서는 마우스 왼쪽 버튼이 떨어질 때까지 이동된 거리를 구하여 Panel을 그만큼 이동된 위치에 Set하게 됩니다.

프로그램을 빌드하여 실행해보세요. Panel 바탕을 클릭하여 옮겨보세요. 잘 옮겨지지요?
저는 잘되네요...

그림 3.7 Panel을 마우스로 클릭하여 옮김

에필로그
KDMovePanel.dll 라이브러리는 조금전에 만든 따끈따끈한 라이브러리입니다. 마우스로 Panel 바탕을 드래그하여 옮기고자 할 때, 쉽게 이용할 수 있도록 만들었습니다.
이렇게 이용하기 쉽게 만드는 이유는 첫째는 시간이 지날수록 소스코드에 대한 기억이 희미해지는 것 때문이고, 둘째는 이런 기능을 필요로 할 때에는 대체로 바쁜 와중일 테니까요....

아무 것도 염려하지 말고 다만 모든 일에 기도와 간구로, 너희 구할 것을 감사함으로 하나님께 아뢰라
그리하면 모든 지각에 뛰어난 하나님의 평강이 그리스도 예수 안에서 너희 마음과 생각을 지키시리라
(빌립보서 4장 6~7절)

극동테크(www.kdtechno.com) 허창원 드림


oO스누피Oo

2006.06.20 15:58:03
*.44.41.63

앗! 내가 예전에 올렸던 질문인데... 정말정말 수고하시네요. ^^

송성희

2007.01.02 19:51:55
*.105.124.86

라이브러리를 사용하니깐 간편하지만? 강좌의 취지와는 맞지 않는다고 생각이 드는군요? 라이브러리의 소스 내용을 알수 없을까요?
List of Articles
번호 제목 글쓴이 날짜 조회 수
96 [강좌:37] 테이블 셀로 파일을 드래그앤드롭하기 file [1] 허창원 2007-09-01 29829
95 [강좌:36] 테이블 셀에서 체크박스 기능 이용하기 file 허창원 2007-09-01 21092
94 [팁:17] 사용가능한 Com Port 찾기 file 허창원 2007-08-18 30816
93 [강좌:35] 엑셀(Excel) 파일에 출력하기(양식 유지한채로) [6] 허창원 2007-04-08 52099
92 [팁:16] 엑셀파일(xls)로 저장하기 [4] 허창원 2007-03-29 34519
91 [에러 최소화 습관 팁] 아직 나타내지 않은 Panel의 Control 값을 Set할 때 [1] 허창원 2006-11-25 26761
90 [팁:15] 엑셀에서 지원하는 파일(csv) 생성하기 [1] 허창원 2006-11-23 28922
89 [강좌:34] CVI의 최소화 기능 개선 [3] 허창원 2006-11-18 24287
88 [요약] [강좌:34] CVI의 최소화 기능 개선 허창원 2006-11-18 25896
87 [강좌:33] 컨트롤 배열 처리하기 [5] 허창원 2006-09-28 37563
86 [강좌:32] 시리얼포트의 콜백함수를 만들어 이용하기 [2] 허창원 2006-08-25 33894
85 [강좌:31] 한글 IME, 위치로~~(강력추천) 허창원 2006-06-30 17792
84 [요약] [강좌:31] 한글 IME, 위치로~~(강력추천) [2] 허창원 2006-06-30 19811
83 [강좌:30] Panel을 마우스로 드래그하기(강좌29 업그레이드 버전) file 허창원 2006-06-29 12896
82 [요약] [강좌:30] Panel을 마우스로 드래그하기(강좌29 업그레이드 버전) 허창원 2006-06-29 15022
» [강좌:29] 타이틀바 없는 Panel을 마우스로 드래그하기 [2] 허창원 2006-06-03 16932
80 [요약] [강좌:29] 타이틀바 없는 Panel을 마우스로 드래그하기 허창원 2006-06-03 15992
79 [팁:14] 프로그램 제거 단축아이콘 넣기(1차수정) [4] 허창원 2006-04-26 15297
78 [메모] 강좌의 종류를 분류해봅니다 [5] 허창원 2006-03-30 21274
77 [팁:13] 디버그 종료시에 뜨는 메시지 A non-debuggable thread... 방지 file [2] 허창원 2005-12-21 26576