'CVI 정보나눔'에 해당되는 글 7건

  1. 2008.04.24 CVI Control Modes for Generating Events
  2. 2008.04.16 CVI 시리얼 통신 예제
  3. 2008.02.01 CVI에서 Dynamic Link Library(DLL) 만들기
  4. 2008.01.24 CVI에서 컨트롤을 동적으로 생성하기
  5. 2008.01.24 GetActiveCtrl() 함수
  6. 2008.01.24 GetCtrlVal() 함수
  7. 2008.01.18 LabWindows/CVI에서 Win32 API를 사용하는 방법
2008. 4. 24. 21:42

CVI Control Modes for Generating Events



CVI로 이런 저런 프로그래밍을 하는 도중 늘 궁금한게 하나 있었다.
말이 그렇지 하나 뿐만이 아니고 아주 아주 많이있다..... -_-

그러던 도중 오늘 드디어 궁금증을 하나 풀어낸 것이 있으니..  바로 "컨트롤 모드(control mode)"에 관련된 것이다.
각 컨트롤마다 Edit 창을 열어 속성을 정하거나 하는데.. 중간에 보면 꼭 Control Mode라는 것이 있는 것이다. 내용도 'Hot', 'Normal', Indicator', 'Validate'등 다양하게 있는데 뭔뜻인지.. ^^;

CVI정보나눔의 질문답변란에서 그 정답을 찾았다.

> 안녕하세요...
> cvi를 시작한지 얼마 안 된 학생 입니다.
> hot와 validate의 차이점에 관해 좀 알려 주시면 감사 하겠습니다.
> 수고하세요...
>

CVI 도움말의 다음 항목에서 잘 설명해 주고 있습니다.
Control Modes for Generating Events

아래는 제가 공부삼아 번역해본 내용입니다.

---------------------------------------------------------
이벤트 발생에 대한 Control Mode

여러분은 control에 의해 발생되는 이벤트의 type을 match시키기 위해 control의 mode를 Normal, Indicator, Hot 혹은 Validate mode로 설정할 수 있습니다.

- Value Changed event는 GUI의 사용자가 control의 설정값을 수정할 때 발생되는 이벤트입니다. 즉, slide control의 slider를 마우스로 드래그 한다든지, string control에다 문자를 입력할 때 발생됩니다.

- Commit event는 GUI의 사용자가 동작을 실제로 완료할 때 발생됩니다. 즉, menu를 선택한다든지, 숫자를 입력하고 Enter키를 누른다든지, 혹은 slide control에서 slider를 드래그한 후에 마우스 버튼을 놓을 때 말입니다.

여러분이 control을 만들 때, 아래의 control mode 중에서 하나를 지정할 수 있습니다.
control mode는 control이 이벤트를 어떻게 발생시킬지, 사용자가 조작할 수 있는 범위를 어떻게 정할지를 결정합니다.

- Normal: 이 모드에서는 사용자가 control을 조작할 수 있게 하고, 또 control이 commit 이벤트를 제외한 모든 이벤트를 발생시킬 수 있습니다.

- Indicator: 이 모드에서는 사용자가 control을 조작할 수가 없고, 또 control이 commit나 value changed event를 발생시키지 않습니다.

- Hot: 보통 Default로 설정되어 있습니다. 이 모드는 Normal과 거의 같은데, 사용자가 어떤 동작을 수행했을 때, control이 commit 이벤트를 발생시킵니다. 통상적으로 hot control은 상태가 변경되었을 때 commit event를 발생합니다. 예를 들면, 사용자가 binary switch를 off에서 on으로 드래그하고, 마우스 버튼을 놓으면, commit event가 발생됩니다. 아래의 control type에 대한 설명은 commit event가 어떻게 발생되는지에 대해 확실한 규칙을 보여줍니다.

   o Hot numeric, string, 그리고 text box control은 값을 control에 입력한 후, Enter나 Tab을 눌렀을 때,
     또는 값을 입력한 후 마우스를 다른 곳 아무데나 클릭했을 때, commit event를 발생합니다.

   o Hot list box control은 check mode가 아닐 때, 사용자가 control이 active 되어 있는 동안 Enter를 누른
     다든지, list item을 더블클릭했을 때 commit event를 발생합니다.

   o Hot list box control은 check mode일 때, 사용자가 control이 active되어 있는 동안 스페이스바를 누른
     다거나, list item을 더블클릭했을 때 commit event를 발생합니다.

   o Hot graph control은 사용자가 화살표 키와 함께 커서를 이동할 때나, 사용자가 커서를 옮긴 후에 마우
     스 버튼을 놓으면, commit event를 발생시킵니다.

   o Hot table control은 사용자가 numeric 혹은 string cell에다 값을 입력한 후 active cell을 변경할 때,
     commit event를 발생시킵니다.

- Validate: 이 모드는 Hot 모드와 한가지 점만 빼고는 동일합니다.
commit event가 발생되기 전에 프로그램은 range-checking 속성이 Notify로 되어 있는 panel상의 모든 numeric control을 유효화(validate)시키게 됩니다. Notify 설정은 LabWindows/CVI가 미리 지정된 range를 벗어나는 control값을 체크하도록 합니다. 만약 range를 벗어나는 무효한 조건이 발견된다면, LabWindows/CVI는 control을 활성화시키고, Out of Range 라는 이름의 notification box를 표시합니다. 그리고, validate control은 사용자가 모든 control에 대해 유효한 새 값을 입력할 때까지는 commit event를 발생시키지 않습니다.
이런 과정은 GUI가 commit event를 발생시키기 전에 모든 numeric/scalar control의 값을 유효한지를 분명하게 해줍니다.
---------------------------------------------------------

쉽게 말해서,
Hot control은 숫자 컨트롤의 값이 range를 벗어나더라도 commit event가 발생되는 것이고,

Validate control은 숫자 컨트롤의 값이 range를 벗어나면,
유효한 새 값이 입력되기 전까지 commit event가 발생되지 않는 모드입니다. 즉, 숫자 컨트롤에 range를 설정한다면, Validate 모드로 하는 것이 더 적절하겠습니다.

그럼, 좋은 하루되세요.
2003-02-13 18:49:09
출처 : CVI 정보나눔(질문답변 게시판)

헐... 2003년 게시글이다... -_-
오래도 됐건만.. 난 이제서야 이런걸 찾고 하고 있다네.. ㅋㅋ

위의 내용은 'LabWindows/CVI Help'에서 'Control Modes for Generating Event(Library Reference > User Interface > Using a Graphical User > Control Modes for Generating Event)'라는 이름으로 찾을 수 있다.

'Programmings > CVI' 카테고리의 다른 글

CVI Serial통신 관련 함수  (0) 2008.04.21
CVI 시리얼 통신 예제  (0) 2008.04.16
CVI Ring control의 간단한 예  (0) 2008.04.11
CVI에서 Dynamic Link Library(DLL) 만들기  (0) 2008.02.01
CVI에서 Static Library 만들기  (0) 2008.02.01
2008. 4. 16. 19:25

CVI 시리얼 통신 예제



간단한 '시리얼 통신프로그램''LabWindows/CVI'로 구현하는 방법에 대해 알아보려 한다.

LabWindows/CVI에서 제공하는 Sample RS232예제를 보고 하려니 쫌 답답한 면도 있고.. 약간 복잡(?)한것 같아 일단 접는다. ㅋ
'CVI 정보나눔'이라는 한글 CVI관련 사이트의 예제 프로그램을 간단히 분석해보려 한다.

RS-232통신이라고 하지만.. 간단한 예제라 그런지 생각보다 단순하다.

'CVI 정보나눔'에서는 다른 프로그램과 연동하여 그 프로그램의 정보를 받아오는 역할을 하지만, 본인은 간단히 루프백하여 전송한 데이터를 다시 받아오는 형식으로 진행한다. 그게 간단하니깐...
프로그램을 설명하자면, RS-232 Port에서 포트를 선택하고, Write 에서 전송할 데이터를 입력하고 Query버튼을 클릭하면, 전송한 데이터가 Read로 다시 리턴되는 프로그램이다.
사용자 삽입 이미지

대충의 'uir'을 위의 화면과 같이 작성한다. 보기 좋게 속성 값과 함수의 값도 설정하고...
다 대충 대충 해도 Query버튼에 관련된 세팅은 대충하면 안된다. RS-232 통신하는데 가장 중요한 부분이므로..

본인의 경우 Query버튼의 속성을 아래 그림과 같이 Callback Function을 cmdQuery라고 정해 주었다. 사실... CVI정보나눔에서 이리 되어 있어 따라한거긴 하지만... -_-
사용자 삽입 이미지

cmdQuery 콜백함수의 내용은 아래와 같다.
int CVICALLBACK cmdQuery (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
{
int port, RTCount;

// 쓰기 버퍼관련 변수들..
char WriteBuffer[256];
int length;
int TermChar; // 전송하기 전에 덧붙일 Term.Char방법
// 0:None, 1:CR(0x0D), 2:LF(0x0A), 3:CR+LF

// 읽기 버퍼관련 변수들..
char ReadBuffer[10000];

// 1. Port를 Open하고, Configure합니다.
GetCtrlVal (panel, PANEL_ringRESOURCE, &port);
if(!OpenComConfig (port, "", 9600, 0, 8, 2, 512, 512) ) {
SetComTime (port, 2000);

// 2. 장치 포트로 보낼 데이터를 읽어옵니다.
GetCtrlVal (panel, PANEL_strWriteBuffer, WriteBuffer);
GetCtrlVal (panel, PANEL_ringTermChar, &TermChar);

// 3. Termination character를 덧붙여서 송신합니다.
switch(TermChar) {
case 1:
strcat(WriteBuffer, "\015"); // CR(0x0D)는 8진수로 015
break;
case 2:
strcat(WriteBuffer, "\012"); // LF(0x0A)는 8진수로 012
break;
case 3:
strcat(WriteBuffer, "\015\012");
break;
}
length = strlen(WriteBuffer);
ComWrt (port, WriteBuffer, length);

// 4. 장치 포트로부터 데이터를 읽어옵니다.
ReadBuffer[0] = '\0';
RTCount = ComRdTerm (port, ReadBuffer, 50, 0x0A);
ReadBuffer[RTCount] = '\0';
SetCtrlVal(panel, PANEL_strReadBuffer, ReadBuffer);

// 5. 포트를 닫습니다.
CloseCom (port);
}
}
break;
}
return 0;
}

일반적인 통신 프로그래밍과 얼추 비슷한것 같다.
통신할 장치(Device)를 열고, 읽고, 쓰고, 통신한 장치를 닫고... 등..

LabWindows/CVI에서의 시리얼 통신에 관련된 부분은 NI의 웹페이지에서도 찾아볼 수 있다.
LabWindows/CVI Serial Communication Serial Communication Programming(http://www.ni.com/support/cvi/serlprog.htm)

위의 링크를 따라가면
  • Opening and Closing COM Ports
  • Writing to COM Port
  • Reading from COM Port
  • Using InstallComCallback with Serial Reads
등에 관련된 정보를 얻을 수 있다.

2008. 2. 1. 17:23

CVI에서 Dynamic Link Library(DLL) 만들기



이번엔 LabWindows/CVI에서 Dynamic Link Labrary(DLL)을 만드는 방법이다!!
아무래도 Static Library보다는 Dynamic Link Labrary이 사용하기에도 더 편리하고 더 많이 사용하는 듯 하기에...

현재 만드는 DLL이니 LIB니 하는 것들은 다음번에 다룰 CVI로 작성하게 될 MP3 Player를 만들기 위해 사용되는 라이브러리이다. 뭐 직접 하지 않아도 상관은 없지만.. 하나하나 직접 따라 해보는 것이 좋지 않을까? 생각한다.

이번 예제도 앞서 이야기 했던 'Static Labrary'와 마찬가지로 'CVI 정보나눔'의 강좌를 토대로 작성을 했고, KD_MCI_sl_source.zip파일을 이용하여 DLL파일을 작성하게 된다.

DLL을 만들기 위해 하나의 프로젝트(KD_MCI.prj)를 생성한다. 물론 다른 이름으로 프로젝트를 생성해도 전혀 상관이 없다. 위의 첨부파일의 압축을 해제하고, 파일들을 프로젝트에 포함시킨다.
참고로, 편의를 위해서 파일명을 KD_MCI_sl.*에서 KD_MCI.*로 바꾸어 준다. 안해도 상관은 없음... -_-
사용자 삽입 이미지
Static Library를 만들 때와 다른 점이라면, 프로젝트에 winmm.lib가 포함된다는 점이다.

다음 해주어야 하는 일은 각각의 소스파일에 약간의 수정을 해주어야 하는 부분이 있다.
파일 이름을 수정해 주었으므로 include문도 수정을 해주고, Export할 변수 이름과 함수 앞에 DLLEXPORT라는 것을 추가시켜준다.
Export한다는 것은 해당 DLL을 이용하는 다른 프로그램이 해당 변수나 함수를 이용할 수 있도록 하겠다는 의미이다.
사용자 삽입 이미지
참고로... 위 그림에 나오는 부분만 바꾸는 것이 아니고 죄다~ 싹 다 바꾸는 거다!!

다음은... DLL중 가장 중요한 함수를 작성해야 한다.
DLL main이라고.. 다른 main함수와 마찬가지로 DLL의 시작점을 나타내는 함수이다.
'KD_MCIPLAY DLLEXPORT kmp; 다음에 커서를 위치시키고, Edit > Insert Construct > DLLMain을 선택하자.
사용자 삽입 이미지

그러면, 아래와 같이 DLLMain과 관련된 부분이 생성되는 것을 확인할 수 있다.
사용자 삽입 이미지
추가로 맨위의 #define KD_MCI_C는 KD_MCI.h 파일에서 전역변수 kmp에 대한 선언을 DLL만들 때와 DLL사용할 때를 구분하기 위해 정의한 매크로이다.

다음으로 KD_MCI.h파일을 수정하자.
별건 없고, 아래의 붉은 부분으로 된 부분을 수정해 주면 된다.
사용자 삽입 이미지
잘은 모르지만.. extern KD_MCIPLAY DLLIMPORT kmp;를 해주어야 한다고 한다. DLL을 만들 때는 선언되지 않도록 하고, 나중에 DLL을 사용하기 위한 프로그램의 프로젝트에서는 적용되어 사용을 할 수 있게 된다고 한다.
.c에서 define으로 정의해 두고, 정의가 되지 않으면 사용하도록 해서 그런가?? -_-
다음은 DLL Project 파일 속성을 설정하는 부분이다.
Build > Configuration > Release를 선택하고,
사용자 삽입 이미지

Build > Target Type > Dynamic Link Library를 선택,
사용자 삽입 이미지

Build > Target Settings... 에서 DLL Export Option을 설정한다.
사용자 삽입 이미지

Build > Create Release Dynamic Link Library 메뉴를 선택하여, DLL을 생성한다.
생성된 DLL은 프로젝트가 있는 디렉토리를 확인하면 생성된 파일을 볼 수 있을 것이다.
사용자 삽입 이미지

생성된 파일들은 Static Library와 비슷하다.

참고 : CVI 정보나눔

'Programmings > CVI' 카테고리의 다른 글

CVI 시리얼 통신 예제  (0) 2008.04.16
CVI Ring control의 간단한 예  (0) 2008.04.11
CVI에서 Static Library 만들기  (0) 2008.02.01
CVI에서 컨트롤을 동적으로 생성하기  (0) 2008.01.24
GetActiveCtrl() 함수  (0) 2008.01.24
2008. 1. 24. 20:27

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

Input
Name Type Description
panelHandle integer Specifier for a particular panel that is currently in memory. You obtain this handle from LoadPanel, NewPanel, or DuplicatePanet.
controlStyle integer Select one of the following control styles.

Type Style
Numeric CTRL_NUMERIC
CTRL_NUMERIC_LS
Color Numeric CTRL_COLOR_NUMERIC
CTRL_COLOR_NUMERIC_LS

Numeric Slide CTRL_NUMERIC_THERMOMETER
CTRL_NUMERIC_THERMOMETER_LS
CTRL_NUMERIC_TANK
CTRL_NUMERIC_TANK_LS
CTRL_NUMERIC_GAUGE
CTRL_NUMERIC_GAUGE_LS
CTRL_NUMERIC_METER
CTRL_NUMERIC_METER_LS
CTRL_NUMERIC_KNOB
CTRL_NUMERIC_KNOB_LS
CTRL_NUMERIC_DIAL
CTRL_NUMERIC_DIAL_LS
CTRL_NUMERIC_VSLIDE
CTRL_NUMERIC_HSLIDE
CTRL_NUMERIC_FLAT_VSLIDE
CTRL_NUMERIC_FLAT_HSLIDE
CTRL_NUMERIC_LEVEL_VSLIDE
CTRL_NUMERIC_LEVEL_VSLIDE_LS
CTRL_NUMERIC_LEVEL_HSLIDE
CTRL_NUMERIC_LEVEL_HSLIDE_LS
CTRL_NUMERIC_POINTER_VSLIDE
CTRL_NUMERIC_POINTER_VSLIDE_LS
CTRL_NUMERIC_POINTER_HSLIDE
CTRL_NUMERIC_POINTER_HSLIDE_LS

String CTRL_STRING
CTRL_STRING_LS

Text Message CTRL_TEXT_MSG

Text Box CTRL_TEXT_BOX
CTRL_TEXT_BOX_LS

Command Button CTRL_SQUARE_COMMAND_BUTTON
CTRL_SQUARE_COMMAND_BUTTON_LS
CTRL_OBLONG_COMMAND_BUTTON
CTRL_ROUND_COMMAND_BUTTON
CTRL_ROUNDED_COMMAND_BUTTON

Picture Button CTRL_PICTURE_COMMAND_BUTTON
CTRL_PICTURE_COMMAND_BUTTON_LS
CTRL_PICTURE_TOGGLE_BUTTON
CTRL_PICTURE_TOGGLE_BUTTON_LS

Toggle Button CTRL_ROUND_BUTTON
CTRL_SQUARE_BUTTON
CTRL_SQUARE_BUTTON_LS
CTRL_ROUND_FLAT_BUTTON
CTRL_SQUARE_FLAT_BUTTON
CTRL_ROUND_PUSH_BUTTON
CTRL_SQUARE_PUSH_BUTTON
CTRL_SQUARE_PUSH_BUTTON_LS
CTRL_ROUND_PUSH_BUTTON2
CTRL_SQUARE_PUSH_BUTTON2

Text Button CTRL_SQUARE_TEXT_BUTTON
CTRL_SQUARE_TEXT_BUTTON_LS
CTRL_OBLONG_TEXT_BUTTON
CTRL_ROUND_TEXT_BUTTON
CTRL_ROUNDED_TEXT_BUTTON

Radio Button CTRL_ROUND_RADIO_BUTTON
CTRL_SQUARE_RADIO_BUTTON
CTRL_CHECK_BOX

LED CTRL_ROUND_LIGHT
CTRL_SQUARE_LIGHT
CTRL_ROUND_LED
CTRL_ROUND_LED_LS
CTRL_SQUARE_LED
CTRL_SQUARE_LED_LS

Binary Switch CTRL_HSWITCH
CTRL_VSWITCH
CTRL_GROOVED_HSWITCH
CTRL_GROOVED_VSWITCH
CTRL_TOGGLE_HSWITCH
CTRL_TOGGLE_HSWITCH_LS
CTRL_TOGGLE_VSWITCH
CTRL_TOGGLE_VSWITCH_LS

Ring CTRL_RING
CTRL_RING_LS
CTRL_RECESSED_MENU_RING
CTRL_RECESSED_MENU_RING_LS
CTRL_MENU_RING
CTRL_MENU_RING_LS
CTRL_POPUP_MENU_RING
CTRL_POPUP_MENU_RING_LS

Ring Slide CTRL_RING_VSLIDE
CTRL_RING_HSLIDE
CTRL_RING_FLAT_VSLIDE
CTRL_RING_FLAT_HSLIDE
CTRL_RING_LEVEL_VSLIDE
CTRL_RING_LEVEL_VSLIDE_LS
CTRL_RING_LEVEL_HSLIDE
CTRL_RING_LEVEL_HSLIDE_LS
CTRL_RING_POINTER_VSLIDE
CTRL_RING_POINTER_VSLIDE_LS
CTRL_RING_POINTER_HSLIDE
CTRL_RING_POINTER_HSLIDE_LS
CTRL_RING_THERMOMETER
CTRL_RING_THERMOMETER_LS
CTRL_RING_TANK
CTRL_RING_TANK_LS
CTRL_RING_GAUGE
CTRL_RING_GAUGE_LS
CTRL_RING_METER
CTRL_RING_METER_LS
CTRL_RING_KNOB
CTRL_RING_KNOB_LS
CTRL_RING_DIAL
CTRL_RING_DIAL_LS

Picture Ring CTRL_PICTURE_RING
CTRL_PICTURE_RING_LS

List Box CTRL_LIST
CTRL_LIST_LS

Decoration
CTRL_RAISED_BOX
CTRL_RAISED_BOX_LS
CTRL_RECESSED_BOX
CTRL_RECESSED_BOX_LS
CTRL_FLAT_BOX
CTRL_RAISED_CIRCLE
CTRL_RECESSED_CIRCLE
CTRL_FLAT_CIRCLE
CTRL_RAISED_FRAME
CTRL_RECESSED_FRAME
CTRL_RECESSED_NARROW_FRAME
CTRL_FLAT_FRAME
CTRL_RAISED_ROUND_FRAME
CTRL_RECESSED_ROUND_FRAME
CTRL_FLAT_ROUND_FRAME
CTRL_RAISED_ROUNDED_BOX
CTRL_RECESSED_ROUNDED_BOX
CTRL_FLAT_ROUNDED_BOX
CTRL_SMOOTH_VERTICAL_BOX_LS
CTRL_SMOOTH_HORIZONTAL_BOX_LS

Graph CTRL_GRAPH
CTRL_GRAPH_LS

Digital Graph CTRL_DIGITAL_GRAPH
CTRL_DIGITAL_GRAPH_LS

Strip Chart CTRL_STRIP_CHART
CTRL_STRIP_CHART_LS

Picture CTRL_PICTURE
CTRL_PICTURE_LS

Timer CTRL_TIMER

Canvas CTRL_CANVAS

Table CTRL_TABLE
CTRL_TABLE_LS

ActiveX CTRL_ACTIVEX

Tree
CTRL_TREE
CTRL_TREE_LS

Splitter CTRL_HORIZONTAL_SPLITTER
CTRL_HORIZONTAL_SPLITTER_LS
CTRL_VERTICAL_SPLITTER
CTRL_VERTICAL_SPLITTER_LS

Tab CTRL_TABS
controlLabel string Label of the new control. Pass "" or 0 for no label.

Note: This parameter is ignored for splitters, tabs, and decorations.
controlTop integer Vertical coordinate at which to place the upper left corner of the control, not including labels.

The coordinate must be an integer value from –32,768 to 32,767. The origin (0,0) is at the upper-left corner of the panel, directly below the title bar, before the panel is scrolled.
controlLeft integer Horizontal coordinate at which to place the upper left corner of the control, not including labels.

The coordinate must be an integer value from –32,768 to 32,767. The origin (0,0) is at the upper-left corner of the panel, directly below the title bar, before the panel is scrolled.

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
2008. 1. 24. 18:33

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

2008. 1. 24. 18:05

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
2008. 1. 18. 18:04

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