다음을 통해 공유


ActiveX MFC 컨트롤: 고급 항목

이 문서에서는 ActiveX 컨트롤 개발과 관련 된 고급 항목을 다룹니다.제공합니다.

  • 데이터베이스 클래스에서 ActiveX 컨트롤을 사용합니다.

  • 매개 변수가 있는 속성을 구현합니다.

  • ActiveX 컨트롤의 오류 처리

  • 컨트롤에 특수 키를 처리합니다.

  • 런타임에 보이지 않는 대화 상자 컨트롤 액세스

데이터베이스 클래스에서 ActiveX 컨트롤을 사용합니다.

ActiveX 컨트롤 클래스는 클래스 라이브러리의 일부 이므로 같은 데이터베이스 클래스를 사용 하 여 MFC 데이터베이스 클래스를 사용 하는 ActiveX 컨트롤을 개발 하는 표준 MFC 응용 프로그램에 대 한 규칙 및 절차를 적용할 수 있습니다.

MFC 데이터베이스 클래스에 대 한 일반 개요를 참조 하십시오. MFC 데이터베이스 클래스 (ODBC 및 DAO).내용은 MFC ODBC 클래스를 소개 하 고 MFC DAO 클래스를 사용 하므로 하나에 대 한 자세한 내용은 안내.

[!참고]

Visual C++ .NET에서는 포함된 DAO 클래스를 아직 사용할 수 있지만 Visual C++ 환경 및 마법사가 더 이상 DAO를 지원하지 않습니다.사용 하는 것이 좋습니다 OLE DB 템플릿 또는 ODBC와 MFC 새 프로젝트.DAO는 기존 응용 프로그램을 유지 관리하는 데만 사용할 수 있습니다.

매개 변수가 있는 속성을 구현합니다.

매개 변수화 된 속성 (속성 배열이 라고도 함)는 동종 값의 컬렉션은 컨트롤의 단일 속성을 노출 하는 방법입니다.예를 들어, 배열 또는 사전의 속성으로 노출 하는 매개 변수화 된 속성을 사용할 수 있습니다.배열 표기법을 사용 하 여 이러한 속성 Visual Basic 액세스 합니다.

x = o.Array(2, 3) ' gets element of 2D array
o.Array(2, 3) = 7 ' sets element of 2D array

속성 추가 마법사를 사용 하 여 매개 변수화 된 속성을 구현 합니다.속성 추가 마법사 또는 표준 방식 중 위 표기법을 사용 하 여 속성에 액세스 하는 컨트롤 사용자가 Get/Set 함수 쌍을 추가 하 여 속성을 구현 합니다.

유사한 메서드 및 속성, 매개 변수화 된 속성에도 허용 되는 매개 변수의 개수에 제한이 있습니다.매개 변수화 된 속성의 경우 제한 (속성 값 저장용으로 예약 하는 하나의 매개 변수)와 15 매개 변수입니다.

다음 절차는 정수의 2 차원 배열로 액세스할 수 있는 Array 라는 이름의 매개 변수화 된 속성을 추가 합니다.

속성 추가 마법사를 사용 하 여 매개 변수화 된 속성을 추가 하려면

  1. 컨트롤의 프로젝트를 로드 합니다.

  2. 클래스 뷰에서 컨트롤의 라이브러리 노드를 확장 합니다.

  3. (두 번째 라이브러리 노드 노드) 컨트롤 인터페이스 노드를 마우스 오른쪽 단추로 바로 가기 메뉴를 엽니다.

  4. 바로 가기 메뉴에서 클릭 추가 누른 다음 속성 추가.

  5. 속성 이름 상자에 입력 Array.

  6. 속성 형식 상자에서 짧은.

  7. 에 대 한 구현 형식 클릭 Get/Set 메서드.

  8. Get 함수설정 함수 상자를 Get 및 Set 함수에 대 한 고유 이름을 입력 하거나 기본 이름을 적용 합니다.

  9. 호출 매개 변수를 추가 합니다. row (형식 short) 사용 하 여는 매개 변수 이름매개 변수 형식 컨트롤.

  10. 라는 두 번째 매개 변수를 추가 합니다. column (형식 short).

  11. 마침을 클릭합니다.

2dffbw6e.collapse_all(ko-kr,VS.110).gif변경의 속성 추가 마법사

사용자 지정 속성을 추가 하면 속성 추가 마법사는 컨트롤 클래스의 헤더 변경 됩니다 (.구현 및 H) (.CPP) 파일입니다.

다음 줄에는 컨트롤 클래스에 추가 됩니다.H 파일:

SHORT GetArray(SHORT row, SHORT column);
void SetArray(SHORT row, SHORT column, SHORT newVal);

이 코드를 호출 하는 두 개의 함수 선언 GetArray 및 SetArray 속성에 액세스할 때 특정 행과 열을 요청 하는 사용자를 허용 합니다.

또한 컨트롤 디스패치 맵, 컨트롤 클래스 구현 파일에 다음 줄 속성 추가 마법사를 추가 (.Cpp).

DISP_PROPERTY_PARAM_ID(CMyAxUICtrl, "Array", dispidArray, GetArray, SetArray, VT_I2, VTS_I2 VTS_I2)

구현은 마지막으로 GetArray 및 SetArray 함수 끝에 추가 되는.CPP 파일입니다.대부분의 경우이 속성의 값을 반환 하도록 Get 함수를 수정 합니다.Set 함수는 일반적으로 앞 이나 뒤에 속성 변경 내용을 실행 해야 하는 코드가 포함 됩니다.

이 속성에 대해 유용한 컨트롤 클래스 형식의 2 차원 배열의 멤버 변수를 선언할 수 있습니다 짧은, 매개 변수화 된 속성에 대 한 값을 저장 합니다.다음는 매개 변수에 의해 지정 된 대로 적절 한 행 및 열에 저장 된 값을 반환 하는 Get 함수를 수정 하 고 행과 열의 매개 변수에서 참조 하는 값을 업데이트 하도록 Set 함수를 수정할 수 있습니다.

ActiveX 컨트롤의 오류 처리

컨트롤에서 오류 조건이 발생 하는 경우 컨트롤 컨테이너에 오류를 보고 해야 합니다.오류가 발생 하는 상황에 따라 오류 보고에 다음 두 가지가 있습니다.오류가 발생 하면 속성 내에서 키를 가져오거나 설정할 함수를 또는 메서드의 구현에는 OLE 자동화 내에서 컨트롤을 호출 해야 COleControl::ThrowError, 어떤 신호 제어 사용자 오류가 발생 했습니다.다른 언제 든 지 오류가 발생 하는 경우 해당 컨트롤을 호출 해야 COleControl::FireError에 있는 주식 오류 이벤트를 발생 하는.

발생 한 오류의 종류를 나타내기 위해 컨트롤에서 오류 코드를 통과 해야 ThrowError 또는 FireError.오류 코드 값이 32 비트 OLE 상태 코드가입니다.가능 하면 오류 코드는 표준 OLECTL에 정의 된 코드 집합에서 선택 합니다.H 헤더 파일입니다.다음 표에서 이러한 코드를 요약합니다.

제어 오류 코드 ActiveX

오류

설명

CTL_E_ILLEGALFUNCTIONCALL

잘못 된 함수 호출

CTL_E_OVERFLOW

오버플로가 발생했습니다.

CTL_E_OUTOFMEMORY

메모리가 부족합니다.

CTL_E_DIVISIONBYZERO

0으로 나누었습니다.

CTL_E_OUTOFSTRINGSPACE

문자열 공간이 부족

CTL_E_OUTOFSTACKSPACE

스택 공간이 부족 합니다

CTL_E_BADFILENAMEORNUMBER

잘못 된 파일 이름 또는 번호

CTL_E_FILENOTFOUND

파일을 찾을 수 없습니다.

CTL_E_BADFILEMODE

잘못 된 파일 모드

CTL_E_FILEALREADYOPEN

파일이 이미 열려 있습니다.

CTL_E_DEVICEIOERROR

I/O 장치 오류

CTL_E_FILEALREADYEXISTS

파일이 이미 있습니다.

CTL_E_BADRECORDLENGTH

잘못 된 레코드 길이

CTL_E_DISKFULL

디스크가 꽉 찼습니다.

CTL_E_BADRECORDNUMBER

잘못 된 레코드 번호

CTL_E_BADFILENAME

잘못 된 파일 이름입니다.

CTL_E_TOOMANYFILES

파일이 너무 많습니다.

CTL_E_DEVICEUNAVAILABLE

장치를 사용할 수 없습니다.

CTL_E_PERMISSIONDENIED

사용 권한이 거부 되었습니다

CTL_E_DISKNOTREADY

디스크가 준비 되지 않았습니다.

CTL_E_PATHFILEACCESSERROR

경로/파일 액세스 오류입니다.

CTL_E_PATHNOTFOUND

경로 찾을 수 없습니다.

CTL_E_INVALIDPATTERNSTRING

패턴 문자열이 잘못 되었습니다

CTL_E_INVALIDUSEOFNULL

NULL 잘못 사용 했습니다.

CTL_E_INVALIDFILEFORMAT

잘못 된 파일 형식

CTL_E_INVALIDPROPERTYVALUE

잘못 된 속성 값입니다.

CTL_E_INVALIDPROPERTYARRAYINDEX

잘못 된 속성 배열 인덱스입니다.

CTL_E_SETNOTSUPPORTEDATRUNTIME

Set 런타임에 지원 되지 않습니다

CTL_E_SETNOTSUPPORTED

지원 되지 않는 설정 (읽기 전용)

CTL_E_NEEDPROPERTYARRAYINDEX

속성 배열 인덱스가 필요 합니다.

CTL_E_SETNOTPERMITTED

허용 설정

CTL_E_GETNOTSUPPORTEDATRUNTIME

런타임에 get이 지원 되지

CTL_E_GETNOTSUPPORTED

지원된 되지 않습니다 (쓰기 전용 속성)를 표시 합니다.

CTL_E_PROPERTYNOTFOUND

속성을 찾을 수 없습니다.

CTL_E_INVALIDCLIPBOARDFORMAT

잘못 된 클립보드 형식입니다.

CTL_E_INVALIDPICTURE

그림이 잘못 되었습니다.

CTL_E_PRINTERERROR

프린터 오류입니다.

CTL_E_CANTSAVEFILETOTEMP

파일을 TEMP에 저장할 수 없습니다.

CTL_E_SEARCHTEXTNOTFOUND

검색 텍스트를 찾을 수 없습니다.

CTL_E_REPLACEMENTSTOOLONG

바꿀 텍스트가 너무 깁니다

필요한 경우 사용 하는 CUSTOM_CTL_SCODE 는 포함 되지 않는 조건에 대 한 사용자 지정 오류 코드 표준 코드 중 하나를 정의 하는 매크로.이 매크로 대 한 매개 변수는 1000 사이의 정수 여야 합니다 및 32767입니다.예를 들면 다음과 같습니다.

#define MYCTL_E_SPECIALERROR CUSTOM_CTL_SCODE(1000)

기존의 VBX 컨트롤을 대체 하는 ActiveX 컨트롤을 만드는 경우 오류 코드가 호환 되도록 VBX 컨트롤을 사용 하 여 동일한 숫자 값을 ActiveX 컨트롤 오류 코드를 정의 합니다.

컨트롤에 특수 키를 처리합니다.

특정 키 입력 조합을 특별 하 게 처리 하는 경우가 있습니다. 예를 들어, 방향성을 때 컨트롤 삽입 textbox에서 ENTER 키를 누를 때 새 줄 상자 컨트롤 또는 편집 그룹 간의 이동 키 ID를 눌렀습니다.

ActiveX 컨트롤의 기본 클래스 이면 COleControl, 무시할 수 있습니다 CWnd::PreTranslateMessage 컨테이너를 처리 하기 전에 메시지를 처리할 수 있습니다.이 기술을 사용할 때는 항상 반환 TRUE 메시지를 처리 하 여 사용자 재정의 된 경우 PreTranslateMessage.

다음 코드 예제는 방향 키와 관련 된 메시지를 처리할 수 있는 한 가지 방법을 보여 줍니다.

BOOL CMyAxUICtrl::PreTranslateMessage(MSG* pMsg)
{
   BOOL bHandleNow = FALSE;

   switch (pMsg->message)
   {
      case WM_KEYDOWN:
         switch (pMsg->wParam)
         {
         case VK_UP:
         case VK_DOWN:
         case VK_LEFT:
         case VK_RIGHT:
            bHandleNow = TRUE;
            break;
         }
         if (bHandleNow)
         {
            OnKeyDown((UINT)pMsg->wParam, LOWORD(pMsg->lParam), HIWORD(pMsg->lParam));
         }
         break;
   }
   return bHandleNow;
}

키보드 인터페이스는 ActiveX 컨트롤에 대 한 처리에 대 한 자세한 내용은 ActiveX SDK 설명서를 참조 하십시오.

런타임에 보이지 않는 대화 상자 컨트롤 액세스

사용자 인터페이스가 있으며 런타임에 보이지 않는 대화 상자 컨트롤을 만들 수 있습니다.대화 상자 및 사용 하는 보이지 않는 런타임에 ActiveX 컨트롤 추가 하는 경우 cwnd:: Getdlgitem 컨트롤에 액세스 하려면 컨트롤이 제대로 작동 하지 않습니다.대신, 다음 방법 중 하나는 컨트롤을 나타내는 개체를 가져오려면 사용 해야:

  • 멤버 변수 추가 마법사를 사용 하 여 선택 합니다. 컨트롤 변수 및 다음 컨트롤의 ID를 선택 합니다.멤버 변수 이름을 입력 하 고 선택 컨트롤의 래퍼 클래스는 컨트롤 형식.

    또는

  • 대화 상자 항목으로 지역 변수 및 하위 클래스를 선언 합니다.다음과 비슷한 코드를 삽입 (CMyCtrl 래퍼 클래스인 IDC_MYCTRL1 컨트롤의 ID입니다):

    CCirc myCirc;
    myCirc.SubclassDlgItem(IDC_CIRCCTRL2, this);
    // ... use myCirc ...
    myCirc.UnsubclassWindow();
    

참고 항목

개념

MFC 컨트롤을 ActiveX