'CVI'에 해당되는 글 8건
- 2008.04.11 CVI Ring control의 간단한 예
- 2008.02.01 CVI에서 Static Library 만들기
- 2008.01.24 CVI에서 컨트롤을 동적으로 생성하기
- 2008.01.24 GetActiveCtrl() 함수
- 2008.01.24 GetCtrlVal() 함수
- 2008.01.18 LabWindows/CVI에서 Win32 API를 사용하는 방법
- 2008.01.15 CVI 첫번 째 프로그램 - Hello world
- 2008.01.15 CVI 설치
CVI Ring control의 간단한 예
CVI 프로그래밍을 하면 일반적인 GUI프로그래밍을 하는것과 거의 유사하다.
수많은 컨트롤들이 있고, 그에 따른 속성들과 함수들이 제공된다. 이를 모르면 그야말로 캐삽질!!!
작업량이 많아 간간히 CVI를 하는 실정이다. 뭐 이리저리 문서를 찾아는 보지만 적당히 볼만큼의 문서는 눈을 씻고 찾아볼래야 찾아볼 수가 없다. 그래도 어쩌겠는가... 일단 하기는 해야하는데.. -_-
하는 작업들은 거의 대부분이 CVI에서 제공하는 예제들과 NI LabWindows/CVI Help를 참고하고 있다.
뭐 다른 사람들도 다 마찬가지겠지만.. ^^;
"RING"라는 컨트롤이 있다.
그 중에서 빨간 밑줄을 그은 녀석.. 일반적으로 다른 GUI에서 "콤보박스"라고 부르는 녀석에 대해서 알아보려한다.
CVI에서는 "Recessed Menu Ring"라고 부르는 듯하다. 뭐 그리 적혀있으니...
기능을 대충 보아하니 완전 콤보박스다. 괜히 이름만 다르게 불러 사람을 헷갈리게 하고 있다.
하는 일은 여러 메뉴(?)를 가지고 있으면서 공간이 모자라는 듯한 곳에 위치해 컨트롤을 한 번 클릭하게 되면 리스트가 펴지면서 원하는 메뉴를 선택할 수 있게 하는 것이다.
여기서 보일 예제는 RING에서 어떤 항목을 선택하게 되면 옆에 리스트박스(ListBox)라는 녀석에 해당하는 하위 리스트를 보여주는 것이다.
왠지 꽤 사용성이 짙어보이긴 하는데... -_-;
간단하게 위의 그림과 같이 UI를 작성하자.
그리고 RING의 속성을 대충 채워 넣는다.
*.uir파일에서 Ring 컨트롤을 더블클릭하면 아래와 같은 에디트 창이 뜬다
Ring에 들어갈 세부 항목을 선택하기 위해서 "Label/Value Pairs..."를 클릭한다.
사용하려 하는 항목과 값을 대충 넣는다.
이로서 일단 RING에대한 준비작업은 끝났다.
여기서 중요한 것은 Data Type이다. Value의 값이 Data Type의 값과 일치해야한다. 만일 Data Type를 char나 다른 값으로 바꾸어보며 작업을 해보면... 대충 감을 잡을 것이다.
List Box의 경우도 동일하게 작업을 해준다. List Box의 Label/Value Pairs..는 일단 Data Type만 정의해주고 나머지는 비워둔다. RING에서 선택된 값을 나중에 넣어줄 것이므로..
이제 만들어진 uir를 이용하여 소스 프레임을 생성한다.
메뉴에서 Code > Generate > All Code...
음.. 이제 소스부분으로 슬슬 넘어가 보겠다.
일단 List Box에 들어갈 데이터를 정의해야겠다.
List Box는 Label과 Value로 이루어져있다. 그래서 데이터도 Label과 Value의 쌍으로 된 녀석을 만들어준다.
typedef struct {간단하게 위와 같이 만들었다.
char name[20];
int id;
}datatype;
datatype fluit[4] = {{"사과", 0},
{"딸기", 2},
{"바나나", 3},
{"오렌쥐", 5}};
datatype vegetable[2] = {{"오이", 0},
{"당근~당근!!", 1}};
RING에서는 과일과 채소라는 항목을 만들었고, 과일이라는 항목을 선택했을 때 List Box에 fluit라는 녀석을 보여줄 것이다. 음.. 채소를 선택했다면... vegetable라는 녀석을 보여줄것이고..
다음은 RING 컨트롤을 생성할 때 같이 생성한 cmdRING라는 함수의 내용을 채워넣어야 한다.
cmdRING는 위쪽에 RING의 속성을 채워넣는 부분에서 CallBack Function이라는 항목에 넣었던 부분이다.
CallBack Function이라는 부분에 cmdRING라는 녀석을 넣어주면 자동으로 아래와 같은 부분이 생성된다.
int CVICALLBACK cmdRing (int panel, int control, int event,이 내부에 원하는 부분을 채워 넣기만 하면 된다.
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
break;
}
return 0;
}
본인의 경우 아래와 같이 채워 넣었다.
흠.. 흠.. 타이핑하기 귀찮아서... -_-
RING에서 선택된 항목은 Value값에 의해서 switch-case의 해당하는 부분으로 점프한다.
과일을 선택하면 case 0:에 걸리고, 채소를 선택하면 case 1:에걸리고.. 이건... C에 나오는 부분이니 대충 패스!!
각 선택되었을 때 미리 생성해 놓은 데이터의 크기(리스트의 개수)만큼 루프를 돌면서 List Box에 추가시켜주는 간단한 예이다.
List Box에 새로운 아이템을 추가할 때에는 InsertListItem()이라는 함수를 사용하게 된다.
더 자세한 사항은 NI LabWindows/CVI Help를 참조하면 될 듯 하다.InsertListItem
int InsertListItem (int panelHandle, int controlID, int itemIndex, char itemLabel[], ...);
Purpose
Inserts a label/value pair into a list or ring control at a specific zero-based index.
Inserting the new pair causes the indices of existing label/value pairs at and beyond the insertion point to increase by one.
You can create columns in a list box control by embedding escape codes in the itemLabel parameter.
......
'Programmings > CVI' 카테고리의 다른 글
CVI Serial통신 관련 함수 (0) | 2008.04.21 |
---|---|
CVI 시리얼 통신 예제 (0) | 2008.04.16 |
CVI에서 Dynamic Link Library(DLL) 만들기 (0) | 2008.02.01 |
CVI에서 Static Library 만들기 (0) | 2008.02.01 |
CVI에서 컨트롤을 동적으로 생성하기 (0) | 2008.01.24 |
CVI에서 Static Library 만들기
LabWindows/CVI에서 Static Library를 생성하는 방법에 대해서 알아보고자 한다.
이 글은 'CVI 정보나눔'이라는 홈페이지의 강좌를 보고 직접 실습을 해가며 작성하는 것으로.. 이 문서를 보는 사람들도 각자 따라해보기 식으로 하면 도움이 될 듯 하다.
먼저 이 예제에서 필요로해서 제공되는 소스코드가 들어있는 파일이 있다.
일단 위의 파일을 다운로드받고, 압축해제를 한다.
프로젝트를 하나 생성하고, 다운받은 파일 중 .c, .h파일을 프로젝트에 추가시킨다.
예제와 같이 프로젝트 이름은 'KD_MCI_sl.prj'라는 이름으로 만든다.
다음은 project 파일속성을 설정하는 단계이다.
예제에서는 Build > Configuration > Release 모드로 작성을 했다.
처음 테스트 하는 단계에서는 Debug모드로 작성을 하고 테스트 한 후, 검증된 단계에서 Library로 만들 때에는 Release모드로 작성을 하는게 맞는 듯 하다.
Build > Target Type을 Static Library로 변경한다.
Build > Target Settings... 메뉴를 선택하고 Target Settings창에서 "Library Generation Choises..."버튼을 클릭한다.
어떤 컴파일러용의 라이브러리를 생성할 것인가를 선택하는 것인데, 'Generate static libraries for both compilers'를 선택하게 되면 'Visual C++'와 'Borland C++'계열의 라이브러리도 함께 생성된다.
마지막 단계로 Build > Create Static Library메뉴를 클릭하자!!!
다음과 같은 메시지 창이 나타나게 되면 정상적으로 'Static Library'를 생성한 것이다.
프로젝트를 생성한 디렉토리에 들어가서 Static Library가 정상적으로 생성 되었는지 확인해 보자
위의 그림에서 보는것처럼 KD_MCI_sl.lib라는 라이브러리 파일이 있고, borland, msvc라는 디렉토리가 있는것을 확인할 수 있다.
KD_MCI_sl.lib는 CVI용 Static Library이고, borland, msvc는 각각 Borland용, MS Visual C++용 Static Library이다.
차후에 이렇게 만들어진 라이브러리 유용하게 사용할 수 있을 것 같다.
출처 : CVI 정보나눔
'Programmings > CVI' 카테고리의 다른 글
CVI Ring control의 간단한 예 (0) | 2008.04.11 |
---|---|
CVI에서 Dynamic Link Library(DLL) 만들기 (0) | 2008.02.01 |
CVI에서 컨트롤을 동적으로 생성하기 (0) | 2008.01.24 |
GetActiveCtrl() 함수 (0) | 2008.01.24 |
GetCtrlVal() 함수 (0) | 2008.01.24 |
CVI에서 컨트롤을 동적으로 생성하기
CVI에서 동적으로 컨트롤을 생성하는 방법이다.
일반적인GUI프로그램에서 사용하고자 하는 컨트롤을 Panel에 미리 배치해놓고 작업을 하게 된다.
하지만 경우에 따라 버튼을 클릭한다거나 했을 때 동적으로 panel에 생성할 필요가 있을 때가 있다.
이 때 LabWindows/CVI에서 사용할 수 있는 함수가 NewCtrl()함수이다.
인자로 panel핸들, 컨트롤의 스타일, 컨트롤의 label, 위치(상, 좌)가 있고, int형의 컨트롤 ID를 반환한다.
NewCtrl
int NewCtrl (int panelHandle, int controlStyle, char controlLabel[], int controlTop, int controlLeft);
Purpose
Creates a new control and returns a control ID that you can use to
specify the control in subsequent function calls.
If you call this function to add a timer control to a panel, you
must do so in the same thread in which you create or load the panel.
Parameters
Return Value
Name | Type | Description |
controlID | integer | Returns the ID you can use to specify the control in subsequent function calls. Negative values indicate that an error occurred. Zero is not a valid ID. |
참고 : CVI 정보나눔, NI LabWindows/CVI Help
'Programmings > CVI' 카테고리의 다른 글
CVI에서 Dynamic Link Library(DLL) 만들기 (0) | 2008.02.01 |
---|---|
CVI에서 Static Library 만들기 (0) | 2008.02.01 |
GetActiveCtrl() 함수 (0) | 2008.01.24 |
GetCtrlVal() 함수 (0) | 2008.01.24 |
LabWindows/CVI에서 Win32 API를 사용하는 방법 (0) | 2008.01.18 |
GetActiveCtrl() 함수
GetActiveCtrl()함수는 특정 Panel위에 있는 활성화된 컨트롤의 ID를 받아오는 함수이다.
음.. 대충 사용하려는 컨트롤의 ID를 알고싶을 때 사용하면 좋을듯..
예를 들어(CVI 정보사랑을 검색하다 발견..)..
버튼이라든지 다른 컨트롤을 동적으로 생성할 경우가 있을 수 있다.
이렇게 동적으로 생성한 컨트롤을 다룰 때 이녀석의 ID는 어떻게 될지.. 혹은 ID를 사용해야 할 경우가 있다면, 그때 GetActiveCtrl()을 사용할 수 있을 것이다.
반대로 SetActiveCtrl()은 특정 Panel의 활성화 된 컨트롤에 ID를 세팅하는 정도(?)의 함수일 것이다.
GetActiveCtrl
int GetActiveCtrl (int panelHandle);
Purpose
Obtains the ID of the active control on the specified panel.
The active control is the control that receives keyboard events
when the panel is the active panel.
Parameters
Input | ||
Name | Type | Description |
panelHandle | integer | Specifier for a particular panel that is currently in memory. You obtain this handle from LoadPanel, NewPanel, or DuplicatePanel. |
Return Value
Name | Type | Description |
controlID | integer | Returns the control ID of the active control. If the panel has no controls,
GetActiveCtrl returns zero. GetActiveCtrl can return the following error code: –4—Panel, pop-up, menu bar, or plot ID is invalid. |
참고 : CVI 정보나눔, NI LabWindows/CVI Help
'Programmings > CVI' 카테고리의 다른 글
CVI에서 Static Library 만들기 (0) | 2008.02.01 |
---|---|
CVI에서 컨트롤을 동적으로 생성하기 (0) | 2008.01.24 |
GetCtrlVal() 함수 (0) | 2008.01.24 |
LabWindows/CVI에서 Win32 API를 사용하는 방법 (0) | 2008.01.18 |
CVI 첫번 째 프로그램 - Hello world (0) | 2008.01.15 |
GetCtrlVal() 함수
GetCtrlVal()함수는 해당 컨트롤의 값을 받아오는 함수이다.
다시말해서 수치컨트롤, 문자열컨트롤, 버튼컨트롤 등의 값을 읽어올 때 사용하는 CVI함수이다.
이와 반대로 컨트롤에 값을 기록할 때에는 SetCtrlVal()함수를 사용한다.
관련된 함수 정보는 NI LabWindows/CVI Help를 검색해보면 아래와 같은 정보를 얻을 수 있다.
GetCtrlVal
int GetCtrlVal (int panelHandle, int controlID, void *value);
Purpose
Obtains the current value of a control.
When the control ID is for a list box or ring control, GetCtrlVal returns the value of the currently selected list item. To obtain the index of the selected list item, use GetCtrlIndex.
Note This function is not valid for graph and strip chart controls. |
Parameters
Input | ||
Name | Type | Description |
panelHandle | integer | Specifier for a particular panel that is currently in memory. You obtain this handle from LoadPanel, NewPanel, or DuplicatePanel. |
controlID | integer | The defined constant, located in the .uir header file, that you assigned to the control in the User Interface Editor, or the ID returned by NewCtrl or DuplicateCtrl. |
Output | ||
Name | Type | Description |
value | void * | The control value. The data type of value must match the data type of the control. |
Return Value
Name | Type | Description |
status | integer | Return value indicating whether the function was successful. A negative number indicates that an error occurred. |
참고 : CVI 정보나눔, NI LabWindows/CVI Help
'Programmings > CVI' 카테고리의 다른 글
CVI에서 컨트롤을 동적으로 생성하기 (0) | 2008.01.24 |
---|---|
GetActiveCtrl() 함수 (0) | 2008.01.24 |
LabWindows/CVI에서 Win32 API를 사용하는 방법 (0) | 2008.01.18 |
CVI 첫번 째 프로그램 - Hello world (0) | 2008.01.15 |
CVI 설치 (0) | 2008.01.15 |
LabWindows/CVI에서 Win32 API를 사용하는 방법
Win32 API에는 Windows라는 OS에 사용되는 여러 자원을 이용하기 때문에 Windows상에서는 CVI보다는 훨씬 유용하게 사용할 수 있다.
그러나... LabWindows/CVI에서 Win32 API를 사용할 수 있다고 한다.
이 문서는 LabWindows/CVI상에서 Win32 API를 사용하는 방법에 대해 간략하게 말하고자 한다. 다음은 LabWindows/CVI 8.5에서 작업을 한 것이다.
방법은 생각외로 간단(?)하다.
Build Options를 수정해주는 것과 약간의 작업으로 끝!
첫 번째로 CVI에서 Options의 Build Options...를 선택한다.
다음은 Compiler Defines부분을 수정해준다.
원래는 /DWIN32_LEAN_AND_MEAN로 되어있는데.. 이부분을 /WIN32_LEAN_AND_MEAN로 수정한다음 OK버튼을 클릭한다.
Win32 API 함수를 사용하기를 원하는 소스파일에 windows.h 헤더파일을 추가한다.
그리고나서 해당 API함수에 대한 Import Library를 Project에 추가한다. Import Library를 확인하는 방법은 CVI의 Help를 이용하면 된다.
메뉴의 Help를 보면, Windows SDK에 대한 정보를 얻을 수 있는 것이 있다.
찾을 키워드에서 찾고 싶은 함수를 입력하게되면, Import Library를 확인할 수 있다.
해당하는 Import Library를 CVI가 설치된 디렉토리에서 찾아 해당 Project에 추가한다. 그리고 나서 소스에 원하는 Win32 API함수를 사용한 후 컴파일 하고, 실행파일을 만들면 CVI에서 Win32 API를 사용하는 것을 볼 수 있을 것이다.
참고 : CVI 정보나눔
'Programmings > CVI' 카테고리의 다른 글
CVI에서 컨트롤을 동적으로 생성하기 (0) | 2008.01.24 |
---|---|
GetActiveCtrl() 함수 (0) | 2008.01.24 |
GetCtrlVal() 함수 (0) | 2008.01.24 |
CVI 첫번 째 프로그램 - Hello world (0) | 2008.01.15 |
CVI 설치 (0) | 2008.01.15 |
CVI 첫번 째 프로그램 - Hello world
CVI를 설치하고 실행하는 첫번째 프로그램...
왜 사람들은 항상 첫번 째 프로그램을 Hello world로 하는 거지? ㅡㅡ;
그냥 한다. ㅋ
콘솔 프로그램은 텍스트 모드의 출력을 내는 순차적인 프로그램이다. 약간 촌스럽긴 하지만.. 함 해보는데 의의를 두고..
먼저 CVI를 실행시킨다.
모양새가 요즘의 프로그램 툴들과 비슷하여 그냥 보고 할 수 있을 정도이다. 처음엔 다 쉽지만.. 말이다.
일단 프로젝트를 열기 위해서 Files의 New의 Project를 클릭한다.
위와 같은 모양의 CVI 툴을 볼 수 있다. 쫌 단순하게 생겼다.. 별로 이쁘지도 않고..
File -> Save Untitled.prj As..를 클릭해 새로운 프로젝트로 저장을 한다. 뭐 일단 따라하기 식으로 따라하는 것이니.. 그대로 고고!!
소스파일을 작성하기 위해서 File -> New -> Source(.c)...를 클릭한다.
에디터에 다음과 같이 "Hello, world"를 출력할 프로그램을 작성한다.
이상한 점은... 기존의 C와는 달리 헤더파일이 없다는 거... ㅡㅡ;
CVI에서는 헤더파일을 적지 않는 것 같다. 뒤에 보면 알겠지만.. 알아서 생성되는 듯...
에디터 창의 파일을 현지의 프로젝트에 추가한다.
아래와 같이 변한 모습을 볼 수 있다.
실행 파일을 생성하기 위해서 다음과 같이 Build -> Create Debuggable Executable를 클릭한다.
참고로, 바로 실행을 하더라도 dependency check에 의해 컴파일 과정을 자동으로 거치게 된다.
디폴트 값은 디버그 모드로 되어 있고, Build -> Configuration에서 릴리즈 모드로 변경할 수 있다.
다음과 같은 창이 갑자기 튀어나올 것이다.
이녀석은 hello.c에 헤더파일을 적어주지 않았기 때문에 헤더파일을 추가시킬 것인지에 대한 메세지창이다.
stdio.h가 아니고, ansi_c.h로 되어있다. 이는 ANSI C에서 이용되는 모든 헤더파일을 포함한다고 생각하면 된다. CVI에서만 이용된다고 보면 된다.
'YES'를 클릭하면 실행파일이 만들어진다. 그리고 소스파일에는 다음과 같이 헤더파일이 추가된 것을 확인할 수 있다.
실행은 Run -> Debug ~.exe를 통해서 할 수 있다.
물론 아래쪽에 있는 Execute... 를 통해서도 할 수 있다.
실행을 하게 되면, 도스창이 깜빡이고 사라지는 것을 확인 할 수 있다. 마지막에 입력을 받기위해 대기하는 getchar()함수를 추가시키면 도스화면이 멈춘상태로 대기하는 것을 확인할 수 있다.
#include <ansi_c.h>Run -> Debug ~.exe를 실행시키면 다음과 같은 결과화면을 볼 수 있다.
void main(void)
{
printf("Hello, world!!\n");
getchar();
}
Run -> Execute ~.exe를 실행시키면 아래와 같이 약간 특이한 모양새의 출력화면을 볼 수 있다.
뭐 결과는 같으니.. 마음에 드는걸로다가 알아서 실행하기를... ㅋ
'Programmings > CVI' 카테고리의 다른 글
CVI에서 컨트롤을 동적으로 생성하기 (0) | 2008.01.24 |
---|---|
GetActiveCtrl() 함수 (0) | 2008.01.24 |
GetCtrlVal() 함수 (0) | 2008.01.24 |
LabWindows/CVI에서 Win32 API를 사용하는 방법 (0) | 2008.01.18 |
CVI 설치 (0) | 2008.01.15 |
CVI 설치
평가판은 http://www.ni.com/downloads/ 에서 다운로드 받을 수 있다.
다운받은 NILWCVIFDS85.exe를 실행하면 압축이 풀린다.(압축이 풀리는 장소는 임의로 정할 수 있고, 디폴트로는 C:\National Instruments Downloads\NILWCVIFDS85에 풀리게 된다.
CVI 설치 프로그램을 실행시키자!!
평가판으로 설치할 것이므로 시리얼 번호는 필요없고, Install this product for evaluation을 체크하자.
설치될 디렉토리를 설정한다.
아직은 잘 모르는 상황이니 그냥 풀로 깔자.. x로 되어 있는 부분들을 다 선택하자!!
뭔말인지.. 그냥 다음!!! 하자
중간에 driver를 설치할래 말래 하는 창이 뜨는데.. 일단 Later를 클릭해 나중에 설치해도 될듯 하다. pass!!
Finish버튼을 클릭!!
설치하는 기계를 재부팅함으로써 설치 끝!!!
'Programmings > CVI' 카테고리의 다른 글
CVI에서 컨트롤을 동적으로 생성하기 (0) | 2008.01.24 |
---|---|
GetActiveCtrl() 함수 (0) | 2008.01.24 |
GetCtrlVal() 함수 (0) | 2008.01.24 |
LabWindows/CVI에서 Win32 API를 사용하는 방법 (0) | 2008.01.18 |
CVI 첫번 째 프로그램 - Hello world (0) | 2008.01.15 |