강좌,팁

[강좌:34] CVI의 최소화 기능 개선

조회 수 24287 추천 수 0 2006.11.18 13:24:52
허창원 *.19.45.37

한동안 뜸했었죠~~
"자겸"님의 질문을 해결하다보니 좋은 팁이 되어서 소개합니다.

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

[강좌: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:
본 Panel(윈도)의 최소화 버튼도아래의 명령버튼과 같이 동작합니다.

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일 이후 버전이라야 됩니다.)

[라이브러리] KDManip.dll v1.1.001 (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분(프로그램 테스트, 화면 캡쳐, 웹문서 작성)


구철회

2006.11.20 22:07:48
*.145.91.78

좋은 강좌이네요. 한국 NI.com 에서도 이런 부분에 대해서 속히 수정을 해주었으면 합니다.

자겸

2006.11.28 20:48:46
*.247.184.234

정말 많은 도움 되었습니다. 감사합니다~~

이현화

2008.09.29 17:38:10
*.45.14.10

강좌 잘 보고 있습니다 .
처음으로 리플을 다는데요.

현재 제가 쓰고 있는 8.5버전에서는 최소화문제가 없네요.

해결되어서 나온거 같습니다.^^
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
» [강좌: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
81 [강좌: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