강좌,팁

다시 강좌를 올리기 시작하니 마음이 뿌듯하고 새로운 에너지가 샘솟는 것 같습니다. 이 강좌는 [강좌:42]의 내용과 거의 같지만, CISManip.dll 내에 포함한 CIS_RearrangeControl() 함수를 호출하는 것과 프로젝트 파일명만 다릅니다. 하지만, 이 강좌만 따로 보시는 분들을 위해 강좌 내용을 그대로 옮겨오되 다른 부분만 수정하였습니다.

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

[강좌:43] Panel 크기 변경시에 컨트롤의 위치나 크기 조절하기(CISManip.dll 활용)

 

테스트해본 버전: LabWindows/CVI 9.0.1, 2010 SP1, 2012
강좌분류: 따라하기, 팁 소개
등급: 초급

 

차례
서론
1. 이번 예제 프로그램의 최종 실행화면
2. 작업준비
3. 코딩하기
4. 실행하기
마무리

 

서론
LabWindows/CVI로 프로그램을 개발하시는 분들은 대부분 Dialog Based Window를 구성하게 됩니다. 즉, Panel(패널, 창)을 만들고, 그 위에 컨트롤들을 배치하는 방식이죠!
이런 경우에 Panel의 크기를 조절하게 되면, 컨트롤의 크기가 고정되어 있어 빈 화면만 늘어나게 됩니다. 그래서 Panel의 상세 속성 중에서 "Scale Contents On Resize"를 활성화시켜서 Panel의 크기에 따라 컨트롤들의 크기도 연동되도록 해보기도 하지만, 폰트의 크기가 자연스럽게 연동되지 못하는 것 같고, 모든 컨트롤들이 일괄적으로 크기가 조정되는 것도 별로 마음에 들지 않는 경우가 많을 것입니다. 저도 그래서 일괄적으로 크기조절하는 그런 기능은 실제 프로젝트에서 거의 사용해본 적이 없습니다.

 

이번 강좌에서는 Splitter 컨트롤을 이용해서 Panel의 크기에 따라 컨트롤들의 크기나 위치를 원할하게 조정하는 방법에 대해 간단히 살펴보겠습니다. 핵심이 되는 기능은 함수로 만들어 다른 프로젝트에 적용하는 것이 수월하도록 보이겠습니다.

 

1. 이번 예제 프로그램의 최종 실행화면
이번 따라하기 예제의 최종 실행화면을 그림 1.1에 보였습니다. 하나의 프로그램이지만, 크기에 따라 다양한 크기와 위치로 조절된 컨트롤들을 보여주고 있습니다.

 

    

그림 1.1 프로그램의 최종 실행화면

 

2. 작업준비
작업 준비 과정은 "[강좌:21] CVI 프로그래밍 시작단계 정의(2)" 강좌 글의
"2. LabWindows/CVI의 프로그래밍 작업 시작단계" 부분에 따라 아래와 같이 간단히 정리합니다.
즉, 프로젝트 파일 저장, 화면구성, 속성설정, 기본 소스코드 생성의 과정을 요약합니다.

 

프로젝트 파일명: CISTestSplitter.prj

 

화면구성은 그림 2.1에 보였습니다. 체크박스, 텍스트 박스, 명령버튼, 그리고 수직 Splitter, 수평 Splitter 컨트롤이 있습니다. 콜백함수는 Panel 콜백함수만 이용할 것입니다.

 

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

 

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

 

표 2.1 컨트롤의 속성값

컨트롤 종류 Constant Name Callback Function Label Default
Value
비고
Check BOx

CHECKBOX

 

Enable Log

 

 

Command Button

COMMANDBUTTON

 

Reset

 

 

Text Box

TEXTBOX

 

 

 

- Both Scroll Bars

Splitter

VSPLITTER

 

 

 

오른쪽에 세로로 길게 배치

Splitter

HSPLITTER

 

 

 

아래쪽에 가로로 길게 배치

 

여기서 Splitter 설정은 설명이 좀 필요하겠습니다. 오른쪽의 수직으로 배치한 Splitter의 속성을 그림 2.2에 보였습니다.

 

그림 2.2 Vertical Splitter 속성

 

그림 2.2에서 "Attach/Detach Controls..." 버튼을 클릭하여 그림 2.3 화면으로 이동합니다. 표시된 번호순대로 설정을 합니다. 여기서는 Text Box의 왼쪽을 기준(고정)으로 삼아서 Splitter 컨트롤의 위치에 따라 Text Box의 폭 크기가 조절되도록 설정합니다.

 

그림 2.3 Vertical Splitter의 "Attach/Detach 컨트롤" 설정 순서(Text Box에 대해)

 

그림 2.4에는 위쪽의 "Reset" 명령버튼에 대해 설정합니다.  Panel의 크기에 따라 명령버튼 크기가 늘어나면 우습게 보이겠죠? 이 "Reset" 명령버튼은 수직 Splitter의 위치에 따라 위치가 연동되도록 설정합니다.

 

그림 2.4 Vertical Splitter의 "Attach/Detach 컨트롤" 설정 순서(Reset 명령버튼에 대해)

 

그리고, OK 버튼을 누르고, 수직 Splitter 컨트롤에 대한 설정을 마칩니다.

그림 2.5에는 화면의 아래쪽에 위치한 수평(Horizontal) Splitter에 대한 설정 화면을 보였습니다.

 

그림 2.5 Horizontal Splitter 속성

 

그림 2.6에는 수평 Splitter에 대한 상세 설정화면을 보였습니다. 수평 Splitter의 위치가 변함에 따라 Text Box의 위쪽을 기준으로 삼아 아래쪽 경계의 크기(높이)가 연동되어 변경되도록 설정하였습니다.

 

그림 2.6 Horizontal Splitter의 "Attach/Detach 컨트롤" 설정 순서(Text Box에 대해)

 

그리고, OK 버튼을 누르고, 수직 Splitter 컨트롤에 대한 설정을 마칩니다.

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

 

표 2.2 Panel의 속성설정

Panel 속성설정

Constant Name

PANEL

Callback Function

PanelCB

Panel Title

Test Splitter

Other Attributes

 

 

그리고, 기본 소스를 생성합니다. Generate All Code 창에서 Program Termination 난의 Select QuitUserInterface Callbacks에는 PanelCB를 체크하도록 합니다. 프로그램 종료시에 창의 닫기 버튼으로 종료되도록 할 것이니까 말입니다.
기본으로 생성된 함수는 main() 함수와 PanelCB() 콜백함수들입니다. 그림 2.7에 프로젝트 창을 보였습니다.

 

그림 2.7 TestSplitter의 프로젝트 창

 

그림 2.8에는 자동으로 생성된 CISTestSplitter.c 파일을 보였습니다.

 

그림 2.8 자동으로 코드 생성된 CISTestSplitter.c 파일
(소스코드 이미지를 클릭하면 소스 텍스트 창이 나타난다는 거 아시죠?)

 

여기서 CISManip.dll 라이브러리를 사용하기 위해 CVI 정보나눔 자료실에서 CISManip.dll (v1.0.003 버전 이상)을 다운로드 받으십시오. 이 글을 쓰는 현재, CISManip.dll v1.0.003을 자료실에 업로드하여 두었습니다. (첨부된 파일 중 CISManip_v1.0.003.zip 파일을 다운로드 받아 현재 프로젝트 폴더에 압축해제하십시오.)

 

그림 2.9에는 CISManip_v1.0.003.zip 파일과 압축해제한 파일들을 보였습니다. 여기서 CISTestSplitter.prj 프로젝트에 포함시킬 파일은 CISManip.h 와 CISManip.lib 파일입니다. CISManip.dll 파일은 실행시에만 CISTestSplitter.exe 파일과 함께 있으면 됩니다.

 

그림 2.9 CISManip.dll 관련 파일들

 

그림 2.10에는 CISManip.dll 관련 파일을 CISTestSplitter.prj 프로젝트에 포함한 화면입니다.

 

그림 2.10 CISTestSplitter.prj 프로젝트 파일들

 

3. 코딩
이제 코딩 작업으로 들어갑니다. CISManip.dll 파일 내의 CIS_RearrangeControl() 함수를 이용할 것이므로, CISManip.h 헤더파일을 포함하는 문장과 Panel 콜백 함수 내에서 그 함수를 호출하는 데에 필요한 부분만 작성하면 됩니다. 그림 3.1에 수정된 소스 파일을 보였습니다.

 

그림 3.1 CISTestSplitter.c 소스 파일에서 수정하는 부분
(소스코드 이미지를 클릭하면 소스 텍스트 창이 나타납니다.)

 

이게 다입니다. CIS_RearrangeControl() 함수만 호출하는 방식으로 하니 간단합니다.

 

4. 실행하기
이제 프로그램을 빌드하여 실행해보도록 합시다. 그림 1.1에 보인 것처럼 창의 크기가 변경됨에 따라 Text Box의 크기가 함께 변경되고, Reset 명령버튼은 그 위치가 좌우로 함께 변경되지요? "Enable Log"라는 체크 박스는 Splitter 컨트롤 속성에서 포함시키지 않았으므로 아무 변화가 없습니다. Log 기능을 활성화할 것인지를 선택하는 기능인데, 저는 실제 프로젝트에서 사용하는 기능이라 실감있는 예제를 위해 포함시켰습니다.

 

그림 4.1에 다시 실행된 화면을 보였습니다.

 

그림 4.1 창의 크기에 따라 연동되는 Text Box와 Reset 명령버튼

 

마무리
이번 강좌에서는 Log 창을 예로 들어 Splitter 컨트롤을 이용하여 Panel(패널, 창)의 크기에 컨트롤들이 연동되어 조절되도록 해보았습니다.

창의 크기와 연동될 컨트롤을 지정하는 것과 Panel(패널, 창)의 최소 크기를 소스 내에 지정해 둔다고 기억하면, 다른 Panel에도 쉽게 적용할 수 있을 것입니다.

감사합니다.

 

2013-03-12 (월) 12:17

극동테크(www.kdtechno.com), CVI 정보나눔(www.cvi.kr) 허창원 드림

List of Articles
번호 제목 글쓴이 날짜 조회 수
116 [팁] 컨트롤의 tooltips 지정하기 file 허창원 2020-05-08 404
115 멀티쓰레드 사용 시, 메모리 관련 참고사항입니다. [1] 요돌이 2017-10-24 1112
114 [팁]타이머 사용시 주의할점. file 이현화 2014-02-13 2551
113 Lable 세로쓰기 [1] 초보 2013-12-21 2704
112 [강좌:45] ini 파일 이용하기(CISManip.dll 활용) [2] 허창원 2013-05-29 3895
111 [강좌:44] ini 파일 이용하기(기본 활용) [1] 허창원 2013-05-29 5177
» [강좌:43] Panel 크기 변경시에 컨트롤의 위치나 크기 조절하기(CISManip.dll 활용) 허창원 2013-03-12 6495
109 [강좌:42] Panel 크기 변경시에 컨트롤의 위치나 크기 조절하기(기본 활용) 허창원 2013-03-12 7096
108 [팁21] 그래프를 지우고 그릴때의 plotHandle을 구하는 방법 [1] 야리싸내 2012-05-25 7474
107 [강좌:41] Prototype 프로그램 CISDEFPROG 소개 [1] [1] 허창원 2012-01-03 8686
106 [강좌:40] CIS Project를 시작하며... [4] 허창원 2011-12-29 8444
105 ------------- 이제 새로운 지평이 열립니다 ------------- 허창원 2011-12-29 8843
104 [팁]그룹명령(고수님들은 패스~ ^^;) file [2] 이현화 2009-06-15 23127
103 [KD스타일규칙] Panel, Control, Function 에 대한 이름부여규칙 file 허창원 2008-10-15 20978
102 [팁]Elaped Time [1] 이현화 2008-10-15 26416
101 [팁:19] 시리얼 포트 모니터링(Serial Port Monitoring) 유틸리티 소개 [9] [1] 허창원 2008-05-12 96254
100 [팁:18] CVI에서 ActiveX 컨트롤 사용하는 절차 file [2] 허창원 2008-04-07 30974
99 [강좌:39] 입맛대로 좀더 편리하게 배포용 설치 프로그램 만들기(CVI 8.5 이용) [1] [1] 허창원 2008-03-14 23012
98 [강좌:38] 배포용 설치 프로그램 만들기(CVI 8.5 이용) 허창원 2008-03-14 22927
97 [팁]간단한 최소화 기능개선입니다. 김민수 2007-10-05 24121