글꼴을 사용 하는 MFC 컨트롤을 ActiveX.
ActiveX 컨트롤 텍스트를 표시 하면 컨트롤 사용자가 글꼴 속성을 변경 하 여 텍스트 모양을 변경 하려면 허용할 수 있습니다.글꼴 글꼴 개체로 구현 되어 속성과 두 형식 중 하나일 수 있습니다: 스톡 또는 사용자 지정 합니다.스톡 Font 속성은 속성 추가 마법사를 사용 하 여 추가할 수 있는 미리 글꼴 속성입니다.사용자 지정 Font 속성 preimplemented 되지 않습니다 및 속성의 동작 및 용도 결정 하는 컨트롤 개발자가.
이 문서에서는 다음 항목을 다룹니다.
스톡 Font 속성을 사용합니다.
컨트롤에 사용자 지정 글꼴 속성을 사용합니다.
스톡 Font 속성을 사용합니다.
스톡 Font 속성은 클래스에서 preimplemented는 COleControl.또한 표준 Font 속성 페이지의 이름, 크기 및 스타일 같은 글꼴 개체의 다양 한 특성을 변경할 수 있도록 사용할 수 이기도 합니다.
글꼴 개체를 통해 액세스를 GetFont, SetFont, 및 InternalGetFont 기능을 COleControl.컨트롤 사용자는 글꼴 개체를 통해 액세스할는 GetFont 및 SetFont 함수는 같은 방식으로 Get/Set 속성입니다.글꼴 개체 액세스 컨트롤 내에서 요구 되는 경우 사용 하는 InternalGetFont 함수.
설명한 것 처럼 ActiveX 컨트롤을 MFC: 속성, 스톡 속성 추가를 쉽게 되는 속성 추가 마법사.속성 추가 마법사는 해당 컨트롤의 디스패치 맵에 스톡 Font 엔트리를 자동으로 삽입 하 고 글꼴 속성을 선택 합니다.
속성 추가 마법사를 사용 하 여 스톡 Font 속성을 추가 하려면
컨트롤의 프로젝트를 로드 합니다.
클래스 뷰에서 컨트롤의 라이브러리 노드를 확장 합니다.
(두 번째 라이브러리 노드 노드) 컨트롤 인터페이스 노드를 마우스 오른쪽 단추로 바로 가기 메뉴를 엽니다.
바로 가기 메뉴에서 클릭 추가 누른 다음 속성 추가.
이 속성 추가 마법사가 열립니다.
에 속성 이름 상자에서 누릅니다 글꼴.
마침을 클릭합니다.
속성 추가 마법사 컨트롤 클래스 구현 파일에 있는 해당 컨트롤의 디스패치 맵, 다음 줄을 추가 합니다.
DISP_STOCKPROP_FONT()
또한 속성 추가 마법사 컨트롤에 다음 줄을 추가합니다.IDL 파일:
[id(DISPID_FONT)] IFontDisp*Font;
스톡 Caption 속성에 스톡 글꼴 속성 정보를 사용 하 여 그릴 수 있는 텍스트 속성의 예입니다.컨트롤에 스톡 Caption 속성을 추가 스톡 Font 속성 사용 된 것과 유사한 단계를 사용 합니다.
속성 추가 마법사를 사용 하 여 스톡 Caption 속성을 추가 하려면
컨트롤의 프로젝트를 로드 합니다.
클래스 뷰에서 컨트롤의 라이브러리 노드를 확장 합니다.
(두 번째 라이브러리 노드 노드) 컨트롤 인터페이스 노드를 마우스 오른쪽 단추로 바로 가기 메뉴를 엽니다.
바로 가기 메뉴에서 클릭 추가 누른 다음 속성 추가.
이 속성 추가 마법사가 열립니다.
에 속성 이름 상자에서 누릅니다 캡션.
마침을 클릭합니다.
속성 추가 마법사 컨트롤 클래스 구현 파일에 있는 해당 컨트롤의 디스패치 맵, 다음 줄을 추가 합니다.
DISP_STOCKPROP_CAPTION()
OnDraw 함수를 수정합니다.
기본 구현은 OnDraw Windows 시스템 글꼴을 사용 하 여 컨트롤에 표시 되는 모든 텍스트에 대해.이 수정 해야 한다는 의미는 OnDraw font 개체를 디바이스 컨텍스트로 선택 하 여 코드.이렇게 하려면 호출 COleControl::SelectStockFont 는 다음 예제와 같이 컨트롤의 디바이스 컨텍스트를 전달 하 고:
CFont* pOldFont;
TEXTMETRIC tm;
const CString& strCaption = InternalGetText();
pOldFont = SelectStockFont(pdc);
pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH )GetStockObject(WHITE_BRUSH)));
pdc->Ellipse(rcBounds);
pdc->GetTextMetrics(&tm);
pdc->SetTextAlign(TA_CENTER | TA_TOP);
pdc->ExtTextOut((rcBounds.left + rcBounds.right) / 2,
(rcBounds.top + rcBounds.bottom - tm.tmHeight) / 2,
ETO_CLIPPED, rcBounds, strCaption, strCaption.GetLength(), NULL);
pdc->SelectObject(pOldFont);
후에 OnDraw 함수 font 개체를 사용 하도록 수정 되었습니다, 컨트롤 내의 텍스트 컨트롤의 스톡 Font 속성 특징에 표시 됩니다.
컨트롤에 사용자 지정 글꼴 속성을 사용합니다.
스톡 Font 속성 외에, ActiveX 컨트롤 사용자 지정 Font 속성을 가질 수 있습니다.사용자 지정 font 속성을 추가 하려면 다음을 수행 해야 합니다.
속성 추가 마법사를 사용 하 여 사용자 지정 Font 속성을 구현 합니다.
글꼴 알림 처리.
새 글꼴 알림 인터페이스를 구현 합니다..
사용자 지정 Font 속성을 구현합니다.
사용자 지정 Font 속성을 구현 하려면 속성 추가 마법사를 사용 하 여 속성을 추가한 다음 일부 코드를 수정 합니다.다음 섹션에서는 사용자 지정을 추가 하는 방법을 설명 HeadingFont 샘플 컨트롤 속성입니다.
속성 추가 마법사를 사용 하 여 사용자 지정 Font 속성을 추가 하려면
컨트롤의 프로젝트를 로드 합니다.
클래스 뷰에서 컨트롤의 라이브러리 노드를 확장 합니다.
(두 번째 라이브러리 노드 노드) 컨트롤 인터페이스 노드를 마우스 오른쪽 단추로 바로 가기 메뉴를 엽니다.
바로 가기 메뉴에서 클릭 추가 누른 다음 속성 추가.
이 속성 추가 마법사가 열립니다.
에 속성 이름 상자에 속성 이름을 입력 합니다.이 예제를 사용 하 여 HeadingFont.
에 대 한 형식 구현를 클릭 Get/Set 메서드.
에 속성 형식 상자에서 IDispatch * 속성의 형식에 대 한.
마침을 클릭합니다.
속성 추가 마법사를 추가 하는 코드 작성에 HeadingFont 사용자 지정 속성에는 CSampleCtrl 클래스 및 샘플.IDL 파일입니다.때문에 HeadingFont Get/Set 속성 형식인 속성 추가 마법사를 수정에 CSampleCtrl 클래스의 디스패치 맵을 포함 하는 DISP_PROPERTY_EX_IDDISP_PROPERTY_EX 매크로 항목:
DISP_PROPERTY_EX_ID(CMyAxFontCtrl, "HeadingFont", dispidHeadingFont,
GetHeadingFont, SetHeadingFont, VT_DISPATCH)
DISP_PROPERTY_EX 매크로 연결의 HeadingFont 함께 해당 속성 이름을 CSampleCtrl 클래스에 Get 및 Set 메서드를 GetHeadingFont 및 SetHeadingFont.또한 속성 값이 지정 됩니다. 이 경우 VT_FONT.
속성 추가 마법사는 또한 선언 컨트롤 헤더 파일에 추가 (.H)에 있는 GetHeadingFont 및 SetHeadingFont 함수 및 해당 함수 템플릿의 컨트롤 구현 파일에 추가 (.CPP):
IDispatch* CWizardGenCtrl::GetHeadingFont(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: Add your dispatch handler code here
return NULL;
}
void CWizardGenCtrl::SetHeadingFont(IDispatch* /*pVal*/)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: Add your property handler code here
SetModifiedFlag();
}
마지막으로 속성 추가 마법사는 컨트롤을 수정합니다.IDL 파일에 항목을 추가 하 여 해당 HeadingFont 속성:
[id(1)] IDispatch* HeadingFont;
제어 코드 수정
추가 했으면 해당 HeadingFont 컨트롤 속성을 해야 변경 일부 변경 내용은 새 속성을 완벽 하 게 지원 컨트롤 헤더 파일과 구현 파일에 있습니다.
컨트롤 헤더 파일에서 (.H), 보호 된 멤버 변수의 다음 선언을 추가 합니다.
protected:
CFontHolder m_fontHeading;
컨트롤 구현 파일에서 (.CPP) 다음을 수행 합니다.
초기화 m_fontHeading 컨트롤 생성자에서입니다.
CMyAxFontCtrl::CMyAxFontCtrl() : m_fontHeading(&m_xFontNotification) { InitializeIIDs(&IID_DNVC_MFC_AxFont, &IID_DNVC_MFC_AxFontEvents); }
정적 선언 FONTDESC 글꼴의 기본 특성을 포함 하는 구조입니다.
static const FONTDESC _fontdescHeading = { sizeof(FONTDESC), OLESTR("MS Sans Serif"), FONTSIZE( 12 ), FW_BOLD, ANSI_CHARSET, FALSE, FALSE, FALSE };
컨트롤에서 DoPropExchange 구성원 기능, 호출을 추가 하는 PX_Font 함수.초기화 및 사용자 지정 글꼴 속성에 대 한 지 속성을 제공합니다.
void CMyAxFontCtrl::DoPropExchange(CPropExchange* pPX) { ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor)); COleControl::DoPropExchange(pPX); // [...other PX_ function calls...] PX_Font(pPX, _T("HeadingFont"), m_fontHeading, &_fontdescHeading); }
컨트롤 구현 완료 GetHeadingFont 멤버 함수입니다.
IDispatch* CMyAxFontCtrl::GetHeadingFont(void) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); return m_fontHeading.GetFontDispatch(); }
컨트롤 구현 완료 SetHeadingFont 멤버 함수입니다.
void CMyAxFontCtrl::SetHeadingFont(IDispatch* pVal) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); m_fontHeading.InitializeFont(&_fontdescHeading, pVal); OnFontChanged(); //notify any changes SetModifiedFlag(); }
컨트롤 수정 OnDraw 멤버 함수는 이전에 선택한 글꼴을 보유 하는 변수를 정의할 수 있습니다.
CFont* pOldHeadingFont;
컨트롤 수정 OnDraw 멤버 함수는 다음 줄 사용 되는 글꼴 위치를 추가 하 여 사용자 지정 글꼴 디바이스 컨텍스트로 선택할 수 있습니다.
pOldHeadingFont = SelectFontObject(pdc, m_fontHeading);
컨트롤 수정 OnDraw 멤버 함수는 해당 글꼴이 사용 된 후 다음 줄을 추가 하 여 이전 글꼴 디바이스 컨텍스트로 선택할 수 있습니다.
pdc->SelectObject(pOldHeadingFont);
사용자 지정 Font 속성 구현 된 후 해당 컨트롤의 현재 글꼴을 변경 하려면 컨트롤 사용자가 표준 Font 속성 페이지 구현 되어야 합니다.다음 줄 뒤에 표준 Font 속성 페이지 속성 페이지 ID를 추가 하려면 삽입은 BEGIN_PROPPAGEIDS 매크로:
PROPPAGEID(CLSID_CFontPropPage)
또한 count 매개 변수를 증가 해야 사용자 BEGIN_PROPPAGEIDS 씩 매크로.다음 줄이를 보여줍니다.
BEGIN_PROPPAGEIDS(CMyAxFontCtrl, 2)
이러한 변경 사항이 후 추가 기능이 병합 되도록 전체 프로젝트를 다시 빌드하십시오.
글꼴 알림 처리
대부분의 컨트롤은 font 개체의 특성을 수정한 경우를 알고 있어야 합니다.각 font 개체의 멤버 함수를 호출 하 여이 변경 될 때 알림을 제공할 수 있습니다.의 IFontNotification 에 의해 구현 된 인터페이스를 COleControl.
컨트롤이 스톡 Font 속성을 사용 하는 경우에 알림을 처리 하는 있는 OnFontChanged 멤버 함수를 COleControl.사용자 지정 font 속성을 추가 하는 경우 동일한 구현을 사용 하 여 수 있습니다.이전 섹션에서의 예제에서는이 전달 하 여 수행 되었습니다 &m_xFontNotification 초기화 하는 동안에 m_fontHeading 멤버 변수입니다.
여러 글꼴 개체 인터페이스 구현
두 글꼴 개체가 같은 구현을 사용 하 고 실선은 위의 그림에서 표시 IFontNotification.어떤 글꼴이 변경 되었는지를 구별 하고자 하는 경우이 문제가 발생할 수 있습니다.
컨트롤의 글꼴 개체 알림을 사이 구별할 수 있습니다 중에 별도 구현을 만들 수 있는 IFontNotification 컨트롤에 있는 각 글꼴 개체에 대 한 인터페이스.이 기술은 문자열 또는 최근에 수정 된 글꼴을 사용 하는 문자열을 업데이트 함으로써 그리기 코드를 최적화할 수 있습니다.다음 단원에서는 둘째 Font 속성에 대 한 별도 알림 인터페이스를 구현 하는 데 필요한 단계를 보여 줍니다.둘째 font 속성으로 간주 되는 HeadingFont 속성은 이전 단원에서 추가한.
새 글꼴 알림 인터페이스를 구현합니다.
둘 이상의 글꼴에 대 한 알림을 사이 구분 하기 위해 컨트롤에 사용 된 각 글꼴에 대해 새로운 알림 인터페이스를 구현 합니다.다음 단원에서는 컨트롤의 헤더 파일과 구현 파일을 수정 하 여 새 글꼴 알림 인터페이스를 구현 하는 방법에 설명 합니다.
헤더 파일의 추가 사항
컨트롤 헤더 파일에서 (.H) 클래스 선언에 다음 줄을 추가 합니다.
protected:
BEGIN_INTERFACE_PART(HeadingFontNotify, IPropertyNotifySink)
INIT_INTERFACE_PART(CMyAxFontCtrl, HeadingFontNotify)
STDMETHOD(OnRequestEdit)(DISPID);
STDMETHOD(OnChanged)(DISPID);
END_INTERFACE_PART(HeadingFontNotify)
이 구현의 만듭니다는 IPropertyNotifySink 라는 인터페이스 HeadingFontNotify.이 새 인터페이스 라는 메서드가 포함 되어 있습니다. OnChanged.
구현 파일의 추가 사항
머리글 글꼴 (컨트롤 생성자) 초기화 코드에서 변경 &m_xFontNotification 에 &m_xHeadingFontNotify.다음 다음 코드를 추가 합니다.
STDMETHODIMP_(ULONG) CMyAxFontCtrl::XHeadingFontNotify::AddRef()
{
METHOD_MANAGE_STATE(CMyAxFontCtrl, HeadingFontNotify)
return 1;
}
STDMETHODIMP_(ULONG) CMyAxFontCtrl::XHeadingFontNotify::Release()
{
METHOD_MANAGE_STATE(CMyAxFontCtrl, HeadingFontNotify)
return 0;
}
STDMETHODIMP CMyAxFontCtrl::XHeadingFontNotify::QueryInterface(REFIID iid, LPVOID FAR* ppvObj)
{
METHOD_MANAGE_STATE(CMyAxFontCtrl, HeadingFontNotify)
if( IsEqualIID(iid, IID_IUnknown) || IsEqualIID(iid, IID_IPropertyNotifySink))
{
*ppvObj= this;
AddRef();
return NOERROR;
}
return ResultFromScode(E_NOINTERFACE);
}
STDMETHODIMP CMyAxFontCtrl::XHeadingFontNotify::OnChanged(DISPID)
{
METHOD_MANAGE_STATE(CMyAxFontCtrl, HeadingFontNotify)
pThis->InvalidateControl();
return NOERROR;
}
STDMETHODIMP CMyAxFontCtrl::XHeadingFontNotify::OnRequestEdit(DISPID)
{
return NOERROR;
}
AddRef 및 Release 메서드에서 IPropertyNotifySink 인터페이스는 ActiveX 컨트롤 개체에 대 한 참조 횟수를 추적 합니다.컨트롤 액세스에 대 한 인터페이스 포인터를 얻으면 컨트롤 호출 AddRef 참조 횟수가 증가 합니다.컨트롤에 포인터를 완료 되 면 호출 Release에서 거의 같은 방식으로 해당 GlobalFree 호출 하 여 전역 메모리 블록 해제 될 수 있습니다.이 인터페이스의 참조 횟수가 0이 되 면 해당 인터페이스 구현이 종료 됩니다.이 예제는 QueryInterface 함수에 대 한 포인터를 반환 합니다는 IPropertyNotifySink 특정 개체에 대 한 인터페이스.이 함수는 ActiveX 컨트롤을 지 원하는 인터페이스를 확인 하기 위해 개체를 쿼리할 수 있습니다.
이러한 프로젝트에 변경한 후 프로젝트를 다시 빌드해야 Test Container를 사용 하 여 인터페이스를 테스트 합니다.테스트 컨테이너에 액세스하는 방법에 대한 자세한 내용은 Test Container를 사용하여 속성 및 이벤트 테스트를 참조하십시오.
참고 항목
참조
MFC 컨트롤을 ActiveX: ActiveX 컨트롤에 있는 그림을 사용
MFC ActiveX 컨트롤: 스톡 속성 페이지를 사용 하 여