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 라는 이름의 매개 변수화 된 속성을 추가 합니다.
속성 추가 마법사를 사용 하 여 매개 변수화 된 속성을 추가 하려면
컨트롤의 프로젝트를 로드 합니다.
클래스 뷰에서 컨트롤의 라이브러리 노드를 확장 합니다.
(두 번째 라이브러리 노드 노드) 컨트롤 인터페이스 노드를 마우스 오른쪽 단추로 바로 가기 메뉴를 엽니다.
바로 가기 메뉴에서 클릭 추가 누른 다음 속성 추가.
에 속성 이름 상자에 입력 Array.
에 속성 형식 상자에서 짧은.
에 대 한 구현 형식 클릭 Get/Set 메서드.
에 Get 함수 및 설정 함수 상자를 Get 및 Set 함수에 대 한 고유 이름을 입력 하거나 기본 이름을 적용 합니다.
호출 매개 변수를 추가 합니다. row (형식 short) 사용 하 여는 매개 변수 이름 및 매개 변수 형식 컨트롤.
라는 두 번째 매개 변수를 추가 합니다. column (형식 short).
마침을 클릭합니다.
변경의 속성 추가 마법사
사용자 지정 속성을 추가 하면 속성 추가 마법사는 컨트롤 클래스의 헤더 변경 됩니다 (.구현 및 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();