- CVI 정보나눔(www.cvi.kr)
- 스터디
- 강좌,팁,유용한것
강좌,팁
한동안 뜸했었죠~~
"자겸"님의 질문을 해결하다보니 좋은 팁이 되어서 소개합니다.
---------------------------------------------------------------------------------------
[강좌:34] CVI의 최소화 기능 개선
이용된 버전: LabWindows/CVI 7.1.1
차례
프롤로그
1. 이번 예제 프로그램의 개요
2. 작업준비
3. KDManip.dll의 최소화 기능 개선함수 이용
3.1 Import Library를 프로젝트에 추가
3.2 최소화된 창이 없는 최소화 과정
3.3 윈도의 최소화 아이콘 클릭시의 메시지 가로채어 처리하기
4. KDManip.dll에 포함된 함수의 소스
에필로그
프롤로그
LabWindows/CVI가 많은 장점이 있음에도 불구하고, 늘 마음에 걸리던 문제가 좀 있었는데, 가장 큰 것이 한글 IME 창이 바탕화면의 왼쪽 상단에 고정되어 나타난다는 것이었고, 이것은 오랫동안의 시도끝에 결국 해결했었습니다.([강좌:31] 한글 IME, 위치로~~(강력추천) )
그리고, 최소화 버튼을 클릭했을 때, 보통 윈도의 작업표시줄에만 나타나는 게 일반적인데, CVI로 개발한 프로그램은 별도의 조그만 제목표시줄이 생기곤 했었습니다. 좀 신경쓰이긴 해도 그런대로 참고 지나왔지만, 질문을 받고 보니 이번에 해결해야겠다는 생각이 들었습니다.
증상을 보면 그림 0.1과 같습니다.
그림 0.1 CVI로 개발한 프로그램의 최소화된 모양
저걸 뭐라고 그러나요? 최소화된 창(Minimized Window)이라고 불렀던 것 같습니다.
사실 이것은 Windows 3.1에서는 최소화된 창의 일반적인 형태였던 것 같습니다. 하지만, 이미 그 시대는 지나고 Windows 95/98 이후부터는 최소화했을 때, 작업표시줄(Taskbar)에만 표시되고 있습니다.
LabWindows/CVI 8 버전이 나와 있지만, 한글 IME 문제와 더불어 이 최소화된 창의 존재도 아직은 해결되지 않고 있습니다.
이번 팁은 극동테크(www.kdtechno.com)의 KDManip.dll (v1.1.001, CVI 7.1.1이후에서 이용가능)에 추가된 함수들을 이용하여 간단히 최소화 창의 문제를 해결해보겠습니다.
1. 이번 예제 프로그램의 개요
이번 예제에서는 그림 1.1과 같이 최소화되도록 만들어볼 것입니다. 명령버튼을 통해서는 간단히 구현될 수 있고, 윈도의 최소화 버튼은 윈도의 시스템 메시지를 가로채어 구현할 수 있습니다. 실전에서 빠르게 이용하기 위해 KDManip.dll에 포함된 함수를 이용해보고, 이해를 돕기 위해 소스를 마지막에 참고용으로 소개하겠습니다.
그림 1.1 이번 강좌에서 목표로 하는 최소화 화면
간단한 화면 구성이지만, 초보자도 쉽게 따라할 수 있도록 프로젝트부터 구성하여 설명합니다.
2. 작업준비
작업 준비 과정은 "[강좌:21] CVI 프로그래밍 시작단계 정의(2)" 강좌 글의
"2. LabWindows/CVI의 프로그래밍 작업 시작단계" 부분에 따라 아래와 같이 간단히 정리합니다.
프로젝트 파일명: MinimizeAdv.prj
화면구성은 그림 2.1에 보였습니다.
그림 2.1 MinimizeAdv 프로젝트의 화면구성
uir 파일 내의 각 컨트롤의 속성은 표 2.1과 같이 설정합니다.
표 2.1 컨트롤의 속성값
컨트롤 종류 | Constant Name | Callback Function | Label | 비고 |
Text Message |
TEXTMSG |
|
String 컨트롤 |
Default Value: |
Command Button |
cmdMinimize |
cmdMinimize |
Minimize |
Panel의 속성은 표2.2와 같이 설정합니다.
표 2.2 Panel의 속성설정
Panel 속성설정 |
|
Constant Name |
PANEL |
Callback Function |
PanelCB |
Panel Title |
MinimizeAdv |
그리고, 기본 소스를 생성합니다.
3. KDManip.dll의 최소화 기능 개선함수 이용
지금부터 이용할 라이브러리는 KDManip.dll 이고, 자료실(CVI정보나눔 자료실)에 업로드되어 있습니다. 아래의 이름으로 검색해보세요. (2006.11.17일 이후 버전이라야 됩니다.)
그림 3.1에 다운로드받은 KDManip.dll 관련 파일들을 보였습니다. 실행시에는 dll 파일만 있으면 되지만, 프로그래밍할 때에는 헤더파일과 Import library가 모두 필요합니다.
그림 3.1 KDManip.dll 관련 파일
3.1 Import Library를 프로젝트에 추가
이제 KDManip.lib 파일을 프로젝트에 포함시킵니다. 헤더파일인 KDManip.h 파일도 프로젝트에 포함시켜두면 열어보기가 편리합니다. 그림 3.2에 추가된 프로젝트 창을 보였습니다.
그림 3.2 프로젝트에 추가된 KDManip.lib Import Library
여기까지는, DLL을 사용할 때의 일반적인 과정입니다.
3.2 최소화된 창이 없는 최소화 과정
우선, 명령버튼(Command Button)을 사용하여 최소화된 창이 없는 최소화를 하려면, 다음과 같이 간단히 할 수 있습니다.
그림 3.3 Minimize 명령버튼으로 최소화하기(MinimizeAdv.c 파일)
(소스코드 이미지를 클릭하면 소스 텍스트 창이 나타난다는 거 아시죠?)
코멘트 처리된 SetPanelAttribute() 함수 문장이 원래의 최소화 처리 함수입니다. 이렇게 하면, 그림 0.1과 같은 최소화된 창이 화면 왼쪽 하단에 표시됩니다.
그리고, MinimizeAllWindows() 함수를 실행하면, 우리가 구현하고자하는 최소화입니다. 즉, 화면 왼쪽 하단의 최소화된 창이 나타나지 않고, 작업표시줄(Taskbar)에만 작업 버튼이 보이게 됩니다.
하지만, 최소화를 위해 별도의 명령버튼을 만든다는 것은 불편한 일입니다. 그래서, Window(Panel)의 최소화 아이콘을 이용해야합니다.
3.3 윈도우의 최소화 아이콘 클릭시의 메시지 가로채어 처리하기
윈도우(혹은 Panel)의 최소화 아이콘은 윈도 시스템 메시지에 의해 처리되고, 기본적으로 CVI 런타임엔진에서만 그 메시지가 처리됩니다. CVI 프로그램 내에서 이용하고자 하려면, 윈도의 WM_SYSCOMMAND 메시지를 붙잡아서 그에 따른 처리를 해주어야합니다. 좀더 자세한 설명은 마지막에 나오게 될 소스를 참고하시고, 여기서는 이러한 과정을 쉽게 이용하기 위한 방법부터 소개합니다.
먼저, 그림 3.4와 같이 KDManip.h 헤더파일을 include 합니다.
그리고, 최소화 아이콘을 이용할 Top-Level의 Panel의 Handle을 등록합니다. 여기서 등록한다는 것은 그 Panel에서 발생되는 WM_SYSCOMMAND는 그 Panel의 콜백함수로 그대로 전달하도록 등록해 두는 것입니다. 이 기능은 KD_RegisterMinimizablePanel() 함수에 의해 수행됩니다.
그리고 나서, 그 Panel의 콜백 함수 시작 부분에 WM_SYSCOMMAND의 메시지와 그때의 wParam 파라미터 값을 조사하여 최소화 기능의 메시지라면 우리가 원하는 최소화 기능을 수행하도록 하고, CVI에서 기본처리는 생략하도록 합니다. 이 기능은 KD_MinimizePanel() 함수와 if 문에 의해 수행됩니다.
그림 3.4 윈도의 최소화 아이콘 클릭시의 메시지 가로채어 처리하기(MinimizeAdv.c 파일)
이제, 프로그램을 빌드한 후에 실행해 보면, 그림 1.1의 우측과 같이 최소화가 될 것입니다.
4. KDManip.dll에 포함된 함수의 소스
윈도의 시스템 메시지를 가로채어야 한다는 사실과 이를 처리하기 위한 방법을 찾고 구현하느라 저는 6시간이 걸렸습니다. 하지만, 이 글을 읽으시는 분들은 이제 곧바로 이용할 수 있게 되었습니다.
서로의 노력을 공유하면 우리는 엄청난 시간과 노력을 절약하게 됩니다.
지금 보여드리는 소스는 여러분의 이해를 돕기 위한 것이며, 여기에 나온 방법을 이용하면, 더많은 응용이 가능하리라 생각되어 소스를 공개합니다. 이것은 제가 극동테크라는 제 개인업체의 사장이기에 마음대로 결정할 수 있는 일이었습니다.(개인업체 사장은 별거 아닙니다. 자신의 명의로 개인 사업자등록을 하면 바로 사장입니다.ㅎㅎ... 오래전부터 마음 속에 늘 갖고 있는 바램이 "프로그래머가 창업할 때 알아야할 것들"을 소개하는 것입니다. 때가 되면 반드시... 기필코... 하지만 그때가 언제인지는???)
얘기가 딴데로 잠시 흘렀습니다. 이제 다시 되돌아옵니다. 그림 4.1에 소스를 보였습니다. 너무 허무할 정도로 간단한가요?
그림 4.1 윈도의 최소화 아이콘 클릭시의 메시지 가로채어 처리하는 함수(KDManip.dll에 포함된 소스)
에필로그
LabWindows/CVI를 사용하면서 최소화 기능과 관련하여,
불편한 정도는 아니었지만 거슬렸던 그동안의 체증을 날려 버렸습니다.
질문을 주셔서 그동안의 불편을 다시금 느끼게 해주신 "자겸"님께 감사드리고,
이런 지식을 함께 나눌 수 있도록 지혜와 열린 마음, 겸손한 마음을 주신 하나님께 감사를 드립니다.
극동테크(www.kdtechno.com) 허창원 드림
CVI에서 최소화 문제 해결방법 모색 및 구현: 하루동안 7시간 15분
강좌 작성 소요시간: 이틀동안 총 3시간 10분(프로그램 테스트, 화면 캡쳐, 웹문서 작성)