강좌,팁

앞 강좌를 올린지 1년하고도 2개월이 지났네요. 프로그래머들이 대부분 느끼는 다양한 압박에 대해 그것을 초월하는 방법을 터득해 나가고 있습니다. 여러분도 부디 안녕하십시오.

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

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

 

테스트해본 버전: 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의 프로그래밍 작업 시작단계" 부분에 따라 아래와 같이 간단히 정리합니다.
즉, 프로젝트 파일 저장, 화면구성, 속성설정, 기본 소스코드 생성의 과정을 요약합니다.

 

프로젝트 파일명: TestSplitter.prj

 

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

 

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

 

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에는 자동으로 생성된 TestSplitter.c 파일을 보였습니다.

 

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

 

3. 코딩
이제 코딩 작업으로 들어갑니다. 제가 먼저 테스트를 해보며 관련 소스를 다듬었고, 주요 처리부분을 함수로 만들었습니다. 아래의 함수를 보시기 바랍니다.

 

함수명이 CIS 로 시작되는 것은 CVI Infomation Sharing(CVI 정보나눔) 함수에 포함시키기 위함이고, 바로 뒤에 Tmp 라고 붙은 것은 임시로 본 프로그램에서 소스 형태로 직접 사용되기 위함입니다. 정식으로 CIS 라이브러리에 포함되면, CIS_RearrangeControl() 이라는 함수명으로 사용할 수 있게 될 것입니다.

 

그림 3.1 CISTmp_RearrangeControl() 함수(TestSplitter.c)
(소스코드 이미지를 클릭하면 소스 텍스트 창이 나타납니다.)

 

그림 3.1의 CISTmp_RearrangeControl() 함수를 Panel 콜백함수 내에서 사용하는 방법은 그림 3.2에 보였습니다.

 

그림 3.2 PanelCB() 콜백함수에서 CISTmp_RearrangeControl() 함수가 호출된 예(TestSplitter.c)
(소스코드 이미지를 클릭하면 소스 텍스트 창이 나타납니다.)

 

이게 다입니다. CISTmp_RearrangeControl() 함수만 호출하는 방식으로 하니 간단합니다. 이 함수도 CISManip.dll 라이브러리에 포함시켜 둔다면, 함수 정의 부분도 필요없게 되겠죠?

 

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

 

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

 

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

 

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

 

특히, 현재 나와있는 최신 버전인 LabWindows/CVI 2012 버전을 이용하여 설명을 하였습니다. 시간이 지날수록 개발툴의 버전이 계속 올라가므로 최대한 신선한 강좌 내용이기를 바라는 마음에서 이렇게 하였습니다. 이 글을 쓰는 지금 현재, 아직도 저는 CVI 9.0.1을 주로 사용하고 있고, CVI 2010 SP1 버전을 사용하는 경우도 많습니다. 이미 개발된 프로젝트의 사용환경에 따라가야하는 경우가 많아 쉽게 최신 개발툴을 실제 프로젝트에 적용하지는 않는 경우가 많지만, 이런 강좌에서는 최신 버전을 사용하는 것이 적절하다고 생각됩니다.

 

감사합니다.

 

2013-03-12 (월)

극동테크(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
110 [강좌:43] Panel 크기 변경시에 컨트롤의 위치나 크기 조절하기(CISManip.dll 활용) 허창원 2013-03-12 6495
» [강좌: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 96259
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