TestStand 사용자 인터페이스 개발 우수 사례

개요

TestStand 사용자 인터페이스는 생산 스테이션에서 테스트를 실행하기 위한 그래픽 인터페이스를 제공하는 어플리케이션입니다. 일반적으로 사용자 인터페이스 어플리케이션을 사용하여 테스트를 실행하고 TestStand Sequence Editor를 사용하여 테스트를 개발합니다. 특정 테스트 요구에 맞게 또는 필요한 경우 테스트 개발을 위해 사용자 인터페이스를 사용자 정의할 수 있습니다.

이 문서에서는 TestStand 사용자 인터페이스 어플리케이션을 설계하고 개발하기 위한 우수 사례에 대해 설명합니다.

  • TestStand에서 기본적으로 제공하는 구성요소를 설명합니다
  • TestStand 아키텍처를 활용하여 확장 가능하고 유지보수 가능한 테스트 시스템을 구축하는 방법을 설명합니다.

내용

TestStand 사용자 인터페이스의 아키텍처

TestStand는 모듈식 아키텍처를 사용하여 각각 단일 목적을 가진 고유한 구성요소를 활용하여 설계되었기 때문에 전체 시스템의 개발 및 유지보수가 보다 간단해집니다.

사용자 인터페이스는 모듈식 TestStand 아키텍처 내의 개별 구성요소입니다

사용자 인터페이스 구성요소는 개발자 및 테스트 작업자가 테스트 시스템에서 시퀀스를 작성하고 실행할 수 있는 메커니즘을 제공합니다. 모듈식 아키텍처에서는 UI와 기본 TestStand 어플리케이션 사이에 명확한 경계가 있어야 합니다. 여기에는 다음과 같은 이점이 있습니다.

  • 여러 다른 사용자 인터페이스를 사용하는 테스트 시스템과 원활하게 상호 작용합니다.  예를 들어 테스트 개발자는 시퀀스 편집기를 사용하여 시퀀스를 개발할 수 있고, 테스트 작업자는 운영자 인터페이스를 사용하여 테스트를 실행하고 결과를 볼 수 있습니다.
  • 테스트 자체의 동작이 바뀔 위험 없이 UI를 변경합니다.

TestStand 사용자 인터페이스는 TestStand Engine API와 통신하여 테스트 실행 상태 가져오기, 시퀀스 작성 및 편집, 설정 구성 등의 다양한 기능을 수행합니다. 또한 TestStand는 사용자가 자체 TestStand 사용자 인터페이스를 신속하게 작성할 수 있도록 일련의 사용자 인터페이스 컨트롤 및 별도의 UI API를 제공합니다.


TestStand 사용자 인터페이스(UI) 컨트롤

TestStand UI (사용자 인터페이스) 컨트롤은 어플리케이션이 테스트 시퀀스를 표시, 실행, 디버그하는 데 필요한 공통 기능을 구현하는 ActiveX 컨트롤의 집합입니다. 이러한 ActiveX 컨트롤은 사용자 인터페이스가 사용자 인터페이스 태스크를 처리하기 위해 TestStand API와 상호 작용하는 데 필요한 소스 코드의 양을 크게 줄입니다. 속성 페이지를 사용하거나 사용 가능한 속성 및 메소드를 호출하여 이러한 컨트롤을 구성할 수 있습니다. LabVIEW, CVI, C# 또는 VB.NET에서 TestStand UI 컨트롤을 사용하는 방법에 대한 자세한 내용은 TestStand UI 컨트롤 도움말 항목을 참조하십시오.

관리자 컨트롤 및 보이는 컨트롤

TestStand UI 컨트롤은 관리자 컨트롤과 보이는 컨트롤의 두 가지 사용자 인터페이스 컨트롤을 제공합니다.

관리자 컨트롤은 TestStand API를 호출하여 파일 로드, 실행 시작, 시퀀스 및 실행 정보 검색과 같은 태스크를 수행합니다. 또한 관리자 컨트롤은 사용자가 로그인하거나 실행이 브레이크포인트에 도달하거나 사용자가 보고 있는 파일 또는 시퀀스를 변경하는 등의 어플리케이션 이벤트가 발생할 때 알려줍니다. 관리자 컨트롤은 런타임에 보이지 않습니다.

보이는 컨트롤은 현재 실행 상태를 보여주는 실행 뷰 컨트롤과 같은 정보를 사용자에게 표시합니다. 또한 보이는 컨트롤을 통해 사용자는 버튼 컨트롤을 사용하여 테스트를 실행하는 등 UI와 상호 작용할 수 있습니다.  보이는 컨트롤은 기능을 정의하기 위해 관리자 컨트롤에 연결되어야 합니다.  이 연결은 관리자 컨트롤의 연결 메소드를 사용하여 구현됩니다. 컨트롤을 연결하면 보이는 컨트롤의 동작을 관리하는 내부 논리를 관리자 컨트롤이 자동으로 처리합니다.  관리자 컨트롤 및 연결된 보이는 컨트롤의 유형에 따라 또한 보이는 컨트롤의 원하는 동작에 따라 보기 연결, 목록 연결, 명령 연결 및 정보 소스 연결을 생성할 수 있습니다.

보이는 TestStand UI 컨트롤을 관리자 컨트롤에 연결하여 동작을 정의합니다.

다른 프로그래밍 환경에서 TestStand UI 컨트롤을 사용하는 방법에 대한 자세한 내용은 TestStand 사용자 인터페이스 컨트롤 도움말 항목을 참조하십시오.  UI 컨트롤 연결 데모를 통해 생성할 수 있는 사용 가능한 연결의 동작을 볼 수도 있습니다.

또한 프로그래밍 환경에서 기본적으로 제공되는 컨트롤을 TestStand UI 컨트롤과 함께 사용할 수 있습니다. 기본 컨트롤과 함께 사용하는 경우 사용자 인터페이스 API를 통해 관리자 컨트롤과 직접 통신하여 TestStand 관련 기능을 구현할 수 있습니다. TestStand API를 직접 호출하는 어플리케이션 작성에 대한 자세한 내용은 기본 컨트롤을 사용하여 TestStand UI 빌드 예제를 참조하십시오.


단순 및 전체 기능 사용자 인터페이스 어플리케이션 예제

TestStand는 사용자 인터페이스를 빌드하는 데 도움이 되는 몇 가지 예제 및 구성 요소를 제공합니다. 예제 사용자 인터페이스는 사용자 정의 사용자 인터페이스를 개발하기 위한 시작 지점을 제공합니다. 또한 TestStand에는 사용자가 자체 어플리케이션에서 재사용할 수 있도록 이러한 어플리케이션에 사용되는 공통 기능을 구현하는 사용자 인터페이스 구성 요소가 함께 제공됩니다.

TestStand는 LabVIEW, LabVIEW NXG, Labwindows™/CVI™, C#, VB.net 등 지원되는 프로그래밍 언어로 작성된 단순 및 전체 기능 사용자 인터페이스 어플리케이션 예제와 함께 제공됩니다. TestStand는 이러한 예제의 소스 코드를 지원되는 각 프로그래밍 언어로 제공합니다. 이 소스 코드를 사용자 정의 사용자 인터페이스를 개발하기 위한 시작 지점으로 사용하거나 있는 그대로 사용할 수 있습니다.

단순 사용자 인터페이스는 디스플레이가 최소화되고 메뉴 모음을 포함하지 않으며 배포된 테스트 시스템에서 테스트 작업자용 인터페이스로 사용하기 위한 것입니다. 전체 기능 사용자 인터페이스는 더 많은 정보를 표시하고 메뉴 모음을 포함하며 디버깅 기능을 제공합니다.  전체 기능 사용자 인터페이스에는 TestStand Sequence Editor와 같은 테스트 시퀀스를 작성하고 수정할 수 있는 편집기 모드가 있습니다.

단순 사용자 인터페이스 예제는 TestStand UI 컨트롤을 사용하여 개발하는 방법을 처음 배울 때 유용합니다.  LabVIEW, LabWindows/CVI 또는 C# 구현의 경우 다음 가이드를 사용하여 소스 코드에 대한 자세한 설명과 작동 방식을 확인할 수 있습니다.

 

다른 사용자의 요구 사항 관리

테스트 시스템용 사용자 인터페이스를 개발 시 어플리케이션과 상호 작용할 모든 사용자의 목표 및 요구 사항을 고려해야 합니다.  테스트 시스템 사용자는 일반적으로 다음 역할로 분류할 수 있습니다.

  • 프레임워크 개발자 – 사용자 정의된 사용자 인터페이스, 프로세스 모델, 단계 타입 등의 테스트 프레임워크 구성요소를 설계합니다.  
  • 테스트 개발자 – 프레임워크 개발자가 구현한 프레임워크 내에서 테스트 시퀀스를 작성합니다.
  • 기술자 – 생산 환경에서 실행되는 테스트의 문제를 해결합니다.
  • 테스트 작업자 – 테스트를 위해 장치를 설정하고 생산 설정에서 테스트를 실행합니다.

테스트 시스템 사용자를 위해 적절한 사용자 인터페이스를 계획하고 설계하는 경우 프레임워크 개발자 역할을 수행하는 것입니다.  TestStand UI 컨트롤을 사용하면 사용자 인터페이스를 사용자 요구 사항에 따라 완전히 사용자 정의할 수 있습니다. 예를 들어 테스트 작업자는 테스트를 시작하고 결과를 볼 수 있는 기능만 필요합니다.  그러나 테스트 개발자는 시퀀스 파일 작성 및 편집에 대한 전체 액세스 권한이 있어야 합니다.

TestStand와 함께 제공되는 전체 기능 UI 예제 또는 시퀀스 편집기와 같이 시퀀스 파일을 작성하고 편집할 수 있는 전체 기능 사용자 인터페이스를 테스트 개발자에게 제공할 수 있습니다.  테스트 작업자를 위해서는 성공적으로 테스트를 실행할 수 있도록 테스트를 시작하기 위한 버튼과 테스트 결과를 표시하는 인디케이터만 노출되는 단순 사용자 인터페이스를 설계할 수 있습니다.  테스트 작업자에게 더 복잡한 UI를 제공하는 경우 추가로 작업자 교육이 필요하고 사용 가능한 기능으로 인해 오류가 발생하기 때문에 문제가 될 수 있습니다.

TestStand UI 컨트롤을 사용하여 UI를 개발하면 전체 기능 UI에서 단순 UI로 원활하게 마이그레이션할 수 있습니다. 두 UI 모두에서 공유되는 TestStand 엔진, 시퀀스, 프로세스 모델 및 기타 구성요소를 기반으로 빌드되기 때문입니다.

시퀀스 편집기와 같은 전체 기능 UI와 단순 운영자 UI는 동일한 테스트 코드와 원활하게 상호 작용할 수 있습니다.

별도의 사용자 인터페이스를 작성하는 것 외에도 TestStand 사용자 관리를 사용하여 단일 사용자 인터페이스 어플리케이션에서 사용할 수 있는 기능을 사용자 정의할 수 있습니다.  이 방법은 다양한 역할이 동일한 테스트 실행에서 작업하는 경우에 더 효과적입니다.  예를 들어 테스트 오류를 문제 해결하는 기술자는 일반적으로 작업자에게 노출되지 않는 실행 및/또는 테스트 보고서 보기와 같은 진단 데이터에 액세스해야 합니다.  기술자를 위한 별도의 UI 어플리케이션이 있는 경우 해당 어플리케이션에서 현재 실행 정보에 액세스할 수 없다면 문제가 될 수 있습니다.  이 문제를 해결하기 위해 보다 고급 사용자를 위한 추가 보기를 사용할 수 있는 단일 사용자 인터페이스를 작성할 수 있습니다.  예를 들어 고급 사용자에게 시퀀스를 변경할 수 있는 기능을 제공하기 위해 ctrl + shift + alt + insert를 사용하여 TestStand 전체 기능 사용자 인터페이스를 편집기 모드로 변경할 수 있습니다.


전체 기능 UI 예제는 운영자 모드 또는 편집기 모드에서 실행될 수 있습니다

TestStand 사용자 관리자에 대한 사용자를 정의하면 TestStand UI 컨트롤은 현재 사용자의 권한에 따라 해당 상태를 자동으로 활성화 또는 비활성화합니다. Engine.CurrentUserHasPrivilege TestStand API 메소드를 사용하여 사용자 권한에 따라 사용자 정의 동작을 정의할 수도 있습니다(예: 사용자 인터페이스의 특정 부분을 숨기기 또는 표시). 사용자 및 권한 정의에 대한 자세한 내용은 사용자 관리 도움말 항목을 참조하십시오.

 

UI 외부에서 구현하는 기능

TestStand 사용자 인터페이스를 개발할 때 UI에서 구현되는 구성요소를 테스트 시스템의 다른 구성요소와 명확하게 구분하는 것이 중요합니다.  이 섹션에서는 일반적인 테스트 시스템 기능과 TestStand 아키텍처 내에서 해당 기능을 구현해야 하는 위치에 대해 간략하게 설명합니다.

프런트엔드 콜백에서 초기화 코드 구현

대부분의 경우 테스트 시스템에서는 테스트 실행을 시작하기 전에 작업을 수행해야 합니다. 예를 들어 테스트 하드웨어를 초기화하고 하드웨어가 교정되었는지 검증하거나 사용자 인터페이스를 초기화하기 위한 사용자 권한을 확인해야 할 수 있습니다.

이러한 기능을 처리하기 위해 프런트엔드 콜백 시퀀스 파일에서 LoginLogout 시퀀스를 사용할 수 있습니다.  이 시퀀스는 기본적으로 TestStand가 시작될 때 TestStand UI 어플리케이션 관리자 컨트롤에 의해 실행되며 기본적으로 사용자에게 로그인 대화 상자를 표시합니다.  이 시퀀스에 기능을 추가하면 다음과 같은 이점이 있습니다.

  • 모든 TestStand 사용자 인터페이스와 시퀀스 편집기는 동일한 LoginLogout 시퀀스를 호출하므로 임의의 UI에서 액세스할 수 있는 기능을 정의하면서 중복된 코드를 피할 수 있습니다.
  • 사용자 인터페이스를 변경할 필요 없이 추가 코드의 동작을 변경할 수 있습니다.

LoginLogout 시퀀스 외에도 프런트엔드 콜백에서 추가 시퀀스를 정의하여 다른 시점에 호출되는 기능을 구현할 수 있습니다.  이러한 추가 시퀀스의 경우 Engine.CallFrontEndCallbackEx() 메소드를 사용하여 원하는 시점에 시퀀스를 호출하려면 사용자 인터페이스에 코드를 추가해야 합니다.  이 방법이 편리한 이유는 프런트엔드 콜백이 TestStand에 의해 자동으로 로드 및 언로드되므로 시퀀스 파일에 대한 참조를 관리할 필요가 없기 때문입니다.  


도구 메뉴를 사용하여 보충 어플리케이션에 액세스

테스트 시스템은 종종 테스트와 함께 작동하는 별도의 도구 또는 어플리케이션을 사용합니다.  예를 들어 데이터베이스 설정 유틸리티 또는 분석 어플리케이션을 시작할 수 있습니다.  이러한 기능을 사용자 인터페이스 어플리케이션의 모듈로 구축하는 대신 독립 실행형 도구를 삽입하여 시스템을 모듈화하고 사용자 정의 도구 메뉴 아이템을 통해 해당 도구에 액세스할 수 있습니다.  도구 ≫ 사용자 정의 메뉴를 사용하여 시퀀스 편집기에서 도구 메뉴를 사용자 정의할 수 있습니다. 사용자 정의 대화 상자에서 새 도구 메뉴 아이템을 추가하고 해당 동작을 구성할 수 있습니다.


도구 메뉴를 구현하는 모든 사용자 인터페이스에 추가 기능을 제공하는 사용자 정의 도구 생성

변경 사항이 별도의 설정 파일에 저장되므로 모든 사용자 인터페이스에 사용자가 만든 동일한 사용자 정의 항목이 표시됩니다.  자세한 내용은 도구 메뉴 사용자 정의 대화 상자 도움말 항목을 참조하십시오.

프로세스 모델을 사용하여 시퀀스 진입점 정의

사용자 인터페이스는 사용자가 시퀀스 실행을 시작하는 방법을 제공해야 하지만 UI는 어떤 시퀀스 파일과도 직접 연결되지 않아야 합니다.  사용자가 테스트를 시작할 수 있도록 시퀀스를 직접 실행하거나 단일 패스 및 테스트 UUT와 같은 프로세스 모델 진입점을 사용하거나 하여 현재 로드된 시퀀스의 실행 진입점을 호출하는 버튼을 만들 수 있습니다.  사용자 인터페이스에는 시퀀스 실행 전후에 실행되는 기능이 포함되면 안됩니다. 대신 프로세스 모델을 통해 이 기능을 구현하십시오.

프로세스 모델은 사용자가 프로세스 모델 설정을 구성할 수 있는 설정 진입점을 정의할 수도 있습니다. 모델 설정은 사용자 인터페이스를 직접 통하지 않고 이러한 진입점에서 구성해야 합니다. 프로세스 모델에 기능을 빌드하면 모든 TestStand 사용자 인터페이스 어플리케이션 및 시퀀스 편집기에서 해당 기능을 사용할 수 있습니다.

프로세스 모델 사용에 대한 자세한 내용은 TestStand 프로세스 모델 사용자 정의 우수 사례 문서를 참조하십시오.

 

사용자 인터페이스와 기타 구성요소 간 통신

사용자 인터페이스가 테스트 시퀀스 파일 및 프로세스 모델과 같은 다른 테스트 시스템 구성요소와 분리되는 것이 중요하지만, 사용자 인터페이스는 이러한 구성요소와 효과적으로 통신해야 합니다.  이 섹션에서는 이러한 모듈성을 유지하면서 각 구성요소 간 통신에 사용할 수 있는 방법을 설명합니다.

시퀀스와 사용자 인터페이스 간 통신

테스트가 실행되는 동안 테스트 시스템은 실행 중인 테스트 또는 현재 테스트 결과와 같은 현재 실행 상태를 나타내는 피드백을 작업자에게 제공해야 합니다. 일반적으로 TestStand UI 컨트롤을 사용하여 이 정보를 표시할 수 있습니다(예: 실행 보기 및 보고서 보기). 이러한 컨트롤을 관리자 컨트롤에 연결하면 엔진에서 관리하는 대로 현재 실행 상태를 표시하도록 컨트롤이 항상 업데이트됩니다.

경우에 따라 테스트에 대한 보다 구체적인 정보를 표시할 수도 있습니다.  실행 시퀀스 또는 코드 모듈은 이 정보를 사용자 인터페이스에 전달하여 표시하거나 사용자 인터페이스가 조치를 취하도록 지시해야 합니다. 연결을 도입하지 않고 이 정보를 전달하기 위해 UI 메시지를 사용하여 통신을 구현할 수 있습니다. 통신 수단으로 시퀀스 파일 속성 또는 UI 변수를 사용하는 대안은 시퀀스 파일과 사용자 인터페이스간에 불필요한 종속성이 생깁니다. 예를 들어 시퀀스에서 파일 글로벌을 업데이트한 다음 사용자 인터페이스에서 파일 상태를 확인하면 글로벌과 UI가 연결됩니다.   다음 두 가지 이유로 UI 메시지를 사용하는 것이 더 좋습니다.

  1. UI 및 시퀀스 파일의 독립성 - 사용자 인터페이스는 항상 시퀀스 파일과 함께 실행해야 하며 그 반대도 마찬가지입니다.  UI 메시지를 사용하면 사용자 인터페이스와 함께 사용할 때 시퀀스 파일에 특정 속성이 존재하지 않아도 됩니다.  UI 메시지를 사용하면,
    • 사용자 인터페이스가 특정 메시지를 구현하지 않는 시퀀스를 실행할 수 있습니다(사용자 인터페이스의 처리 코드가 실행되지 않음).
    • 사용자 정의 메시지를 게시하는 시퀀스가 이러한 메시지를 처리하도록 빌드되지 않은 UI에서 실행될 수 있습니다(사용자 인터페이스가 UI 메시지를 무시함).
  2. 유지보수성 - UI 메시지는 시퀀스 파일 속성 또는 UI 변수에 대한 종속성이 없으므로 시퀀스 파일 및 사용자 인터페이스 개발자 모두 유지보수가 줄어듭니다.

UI 메시지 사용에 대한 자세한 내용은 TestStand 사용자 인터페이스 메시지(UI 메시지) 사용을 참조하십시오.

UI 메시지 유형

UI 메시지에는 메시지의 용도를 나타내는 메시지 ID가 있습니다.  TestStand는 엔진이 자동으로 전송하거나 TestStand 사용자 인터페이스 컨트롤이 자동으로 처리하는 메시지를 정의하는 여러 UI 메시지 ID를 정의합니다.  예를 들어 메시지 ID UIMsg_EndExecution(값 4)은 실행이 종료된 후 엔진에 의해 전송됩니다.  관리자 컨트롤은 이러한 UI 메시지를 대부분 개별 이벤트로 표시합니다. 이 경우 UI 메시지 이벤트 핸들러를 직접 사용하지 않고 ApplicationManager EndExecution 이벤트에 대한 핸들러를 정의할 수 있습니다.

UIMsg_ModelState_Identified(값: 32)와 같은 다른 UI 메시지는 기본 프로세스 모델에 의해 게시됩니다. 프로세스 모델은 UUT의 일련 번호를 식별한 후 이러한 메시지를 게시합니다.  또한 Thread.PostUIMessageEx TestStand API 메소드를 사용하여 코드 모듈, 테스트 시퀀스 또는 프로세스 모델에서 미리 정의된 또는 사용자 정의 UIMessage를 게시할 수 있습니다.

UI 메시지 ID 또는 이벤트 코드의 목록은 UIMessageCodes 도움말 항목에서 찾을 수 있습니다.

차트 및 히스토그램 데이터 업데이트와 같은 사용자 지정 작업에 대한 고유한 UIMessage를 정의할 수 있습니다. 사용자 정의 UIMessage를 정의할 때 UIMsg_UserMessageBase 이벤트 코드에서 시작하는 고유한 이벤트 코드를 지정합니다. 사용자 정의 UIMessage를 게시할 때 정의된 이벤트 코드와 표시할 데이터를 전달합니다. UI 메시지는 postUIMessageEx 메소드를 호출할 때 지정하는 숫자, 문자열 또는 ActiveX 데이터에 대한 데이터 필드를 제공합니다. 사용자 인터페이스에서 UI 메시지에 응답하는 핸들러를 정의하면 이 데이터는 이벤트 콜백에서 파라미터로 노출됩니다.

사용자 인터페이스가 UI 메시지를 처리하는 방법을 정의하려면 다음 두 가지 어플리케이션 관리자 이벤트 중 하나에 대한 이벤트 콜백을 추가하여 UI 메시지가 처리될 때 사용자 정의 코드를 실행하도록 운영자 인터페이스를 구성합니다.

  • UImessage 이벤트 - 이 이벤트는 어플리케이션 관리자가 UI 메시지를 처리할 때마다 발생합니다.  지정한 이벤트 콜백은 모든 기본 UI 메시지 처리 작업 전에 실행됩니다.  콜백에서 출력 취소 이벤트 인수를 True로 설정하면 기본 이벤트 작업을 재정의할 수 있습니다.
  • UserMessage 이벤트 - 이 이벤트는 사용자 정의 UI 메시지(메시지 ID가 10,000 이상인 메시지)에 대해서만 발생합니다.  

사용자 인터페이스에서 이벤트 핸들러 정의에 대한 자세한 내용은 TestStand 도움말의 이벤트 처리 항목을 참조하십시오.

사용자 인터페이스에서 실행 중 테스트로의 통신

경우에 따라 사용자 인터페이스에서 테스트 시퀀스로 정보를 전달해야 할 수도 있습니다.  그러나 시퀀스와 UI 간 통신은 시퀀스가 데이터를 수정할 수 있는 상태에 있도록 항상 시퀀스에 의해 시작되어야 합니다.  이를 위해 시퀀스는 사용자 정의 코드와 함께 UI 메시지를 게시하여 통신할 준비가 되었음을 나타냅니다. UIMessage를 게시할 때 사용자 인터페이스가 메시지를 처리할 때까지 실행이 대기하도록 동기 파라미터를 True로 설정하십시오. 사용자 인터페이스는 UIMessage를 처리할 때 SequenceContext 객체를 검색하고 프로세스 모델 로컬 변수와 같은 특정 변수를 쓰거나 읽습니다.
대부분의 경우 UI는 사용자가 테스트와 관련된 데이터를 지정하기에 가장 좋은 위치가 아닙니다.  예를 들어 데이터가 프로세스 모델의 태스크와 관련된 경우 기본 메뉴에서 액세스할 수 있는 설정 진입점을 생성하거나 수정하는 것이 더 좋습니다.

UI 메시지를 사용하여 사용자 인터페이스에서 데이터를 수집하는 작업을 포함하여 UI 메시지 게시 및 처리를 보여주는 예는 UI 메시지 처리 예제를 참조하십시오.