MFC ActiveX コントロール : フォントの使用
ActiveX コントロールがショートメッセージは、コントロールのユーザーがフォント プロパティを変更して、テキストの外観を変更できるようにすることができます。フォント プロパティは、フォント オブジェクトとして実装され、 2 種類の 1 つです: ストックまたはカスタム。ストック フォント プロパティは、プロパティの追加ウィザードを使用して追加できる preimplemented フォント プロパティです。カスタム フォントのプロパティは、エンティティ preimplemented し、コントロールの開発者はプロパティの動作と使用を決定します。
ここでは、次のトピックについて説明します。
ストック フォント プロパティを使用する
コントロールのカスタム フォントのプロパティを使用する
ストック フォント プロパティを使用する
ストック フォント プロパティは、クラス COleControlによって preimplemented。また、標準フォントのプロパティ ページでは、使用すると、名前、サイズ、およびフォームのようなフォント オブジェクトのさまざまな属性を、変更を許可します。
COleControlの GetFont、 SetFontと InternalGetFont 関数によってフォント オブジェクトにアクセスします。コントロールのユーザーは GetFont と SetFont 関数によって他の取得と設定のプロパティと同様にフォント オブジェクトにアクセスします。フォント オブジェクトへのアクセスがコントロール内から必要な場合は、 InternalGetFont 関数を使用します。
MFC ActiveX コントロール: プロパティに説明されているように、ストック プロパティを追加すると、 プロパティ追加ウィザードと簡単です。フォント プロパティを選択し、プロパティの追加ウィザードは、コントロールのディスパッチ マップに自動的に標準的なフォント エントリを挿入します。
ストック フォント プロパティをプロパティの追加ウィザードを追加するには
コントロール プロジェクトを読み込んでください。
クラス ビューで、コントロールのライブラリ ノードを展開します。
ショートカット メニューを開くには、コントロール (ライブラリ ノードの 2 番目のノード)のインターフェイス ノードを右クリックします。
ショートカット メニューのをクリック 追加 は、 プロパティの追加をクリックします。
これは、プロパティの追加ウィザードを開きます。
プロパティ名(O),プロパティ名 ボックスで、をクリック フォント。
[完了] をクリックします。
プロパティの追加ウィザードはコントロール クラスの実装ファイルに含まれるコントロールのディスパッチ マップに次の行を追加します:
DISP_STOCKPROP_FONT()
また、プロパティの追加ウィザードは、コントロール .IDL ファイルに次の行を追加します:
[id(DISPID_FONT)] IFontDisp*Font;
ストック Caption プロパティは、ストック フォント プロパティの情報を使用して描画できるテキスト プロパティの例です。コントロールに標準的なキャプション プロパティを追加すると、ストック フォント プロパティに使用する要素と似た手順を使用します。
標準的なキャプション プロパティをプロパティの追加ウィザードを追加するには
コントロール プロジェクトを読み込んでください。
クラス ビューで、コントロールのライブラリ ノードを展開します。
ショートカット メニューを開くには、コントロール (ライブラリ ノードの 2 番目のノード)のインターフェイス ノードを右クリックします。
ショートカット メニューのをクリック 追加 は、 プロパティの追加をクリックします。
これは、プロパティの追加ウィザードを開きます。
プロパティ名(O),プロパティ名 ボックスで、をクリック キャプション。
[完了] をクリックします。
プロパティの追加ウィザードはコントロール クラスの実装ファイルに含まれるコントロールのディスパッチ マップに次の行を追加します:
DISP_STOCKPROP_CAPTION()
OnDraw の関数の変更
OnDraw の既定の実装は、コントロールに表示されるすべてのテキストに Windows システム フォントを使用します。これはデバイス コンテキストにフォント オブジェクトの選択によって OnDraw コードを変更する必要があることを意味します。これを行うには、 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 関数が変更された後のコントロール内のテキストがコントロールのストック フォント プロパティの特性が表示されます。
コントロールのカスタム フォントのプロパティを使用する
ストック フォント プロパティに加えて、 ActiveX コントロールはカスタム フォントのプロパティを持つ場合があります。カスタム フォントのプロパティを追加するには、次の条件を満たしている:
カスタム フォントのプロパティを実装するには、プロパティの追加ウィザードを使用します。
フォントの通知の処理。
新しいフォントの通知インターフェイスの実装。
カスタム フォントのプロパティの実装
カスタム フォントのプロパティを実装するには、プロパティを追加し、コードに対する変更を行うには、プロパティの追加ウィザードを使用します。以降のセクションでは、サンプルのコントロールに HeadingFont のカスタム プロパティを追加する方法について説明します。
カスタム フォントのプロパティをプロパティの追加ウィザードを追加するには
コントロール プロジェクトを読み込んでください。
クラス ビューで、コントロールのライブラリ ノードを展開します。
ショートカット メニューを開くには、コントロール (ライブラリ ノードの 2 番目のノード)のインターフェイス ノードを右クリックします。
ショートカット メニューのをクリック 追加 は、 プロパティの追加をクリックします。
これは、プロパティの追加ウィザードを開きます。
プロパティ名(O),プロパティ名 ボックスで、プロパティの名前を入力します。この例では、 HeadingFontを使用します。
Implementation Typeでは、をクリック Get/Set Methods。
プロパティの型,プロパティの種類,プロパティの種類(Y),プロパティ型 ボックスで、プロパティの型の選択 IDispatch* 。
[完了] をクリックします。
プロパティの追加ウィザードは CSampleCtrl のクラスと SAMPLE.IDL ファイルに HeadingFont のカスタム プロパティを追加するコードを作成します。HeadingFont が取得と設定のプロパティ型であるため、プロパティの追加ウィザードは DISP_PROPERTY_EX_IDDISP_PROPERTY_EX マクロ エントリを含むように CSampleCtrl のクラスのディスパッチ マップを変更します:
DISP_PROPERTY_EX_ID(CMyAxFontCtrl, "HeadingFont", dispidHeadingFont,
GetHeadingFont, SetHeadingFont, VT_DISPATCH)
DISP_PROPERTY_EX のマクロは CSampleCtrl の対応するクラス名と HeadingFont のプロパティ設定を取得します GetHeadingFont メソッド、および SetHeadingFont関連付け。プロパティ値の型も指定されます; この場合、 VT_FONT。
プロパティの追加ウィザードは、コントロールのヘッダー ファイルの宣言を追加します。 GetHeadingFont と SetHeadingFont の H)は機能し、コントロールの実装ファイル (.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();
}
最後に、プロパティの追加ウィザードは HeadingFont のプロパティのエントリを追加してコントロール .IDL ファイルを変更する:
[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);
カスタム フォントのプロパティが実行された後、標準フォントのプロパティ ページが実行する必要があります。コントロールの現在のフォントの変更などをコントロールのユーザーを許可します。標準フォントのプロパティ ページのプロパティ ページ ID を追加するには、 BEGIN_PROPPAGEIDS マクロの後に次の行を挿入します:
PROPPAGEID(CLSID_CFontPropPage)
または 1 ずつ BEGIN_PROPPAGEIDS マクロのパラメーター数をインクリメントします。次の行は、これを示しています:
BEGIN_PROPPAGEIDS(CMyAxFontCtrl, 2)
これらの変更が加えられた後、追加機能を組み込むプロジェクト全体を再ビルドします。
フォントの通知の処理
ほとんどの場合、フォント オブジェクトの特性がいつ変更したかを確認するコントロールは。各フォント オブジェクトは IFontNotification インターフェイスのメンバー関数を呼び出すことで変更するときに通知を提供できますが、 COleControlによって実装されます。
コントロールがストック フォント プロパティを使用すると、通知は、 COleControlの OnFontChanged のメンバー関数によって処理されます。カスタム フォントのプロパティを追加する場合は、それらを同じ実装を使用することもできます。前述の例では、に渡すこととm_xFontNotification によって m_fontHeading のメンバー変数を初期化するときに実行されました。
複数のフォント オブジェクト インターフェイスの実装
フォント オブジェクトが両方とも同じ IFontNotificationの実装を使用する上の図の実線。これは、フォントが変更された区別する場合は、問題が発生する可能性があります。
コントロールのフォント オブジェクトの通知を区別する 1 とおりの方法は、コントロールの各フォント オブジェクトの IFontNotification インターフェイスの別の実装を作成します。この手法は、最近変更されたフォントを使用し、文字列や、文字列を更新して描画コードを最適化するようにします。以降のセクションでは、 2 番目のフォント プロパティに別の通知インターフェイスを実装するための手順を示します。2 番目のフォント プロパティは、前のセクションで追加した HeadingFont のプロパティと見なされます。
新しいフォントの通知インターフェイスの実装
複数のフォントの通知を区別するには、新しい通知インターフェイスは、コントロールで使用される各フォントに対して実行する必要があります。以降のセクションでは、コントロールのヘッダー ファイルと実装ファイルを変更して、新しいフォントの通知インターフェイスを実装する方法について説明します。
ヘッダー ファイルへの加算
コントロールのヘッダー ファイル。H)はクラス宣言に、次の行を追加します:
protected:
BEGIN_INTERFACE_PART(HeadingFontNotify, IPropertyNotifySink)
INIT_INTERFACE_PART(CMyAxFontCtrl, HeadingFontNotify)
STDMETHOD(OnRequestEdit)(DISPID);
STDMETHOD(OnChanged)(DISPID);
END_INTERFACE_PART(HeadingFontNotify)
これは HeadingFontNotifyという IPropertyNotifySink インターフェイスの実装を作成します。この新しいインターフェイスが OnChangedというメソッドが含まれています。
実装ファイルへの加算
見出しのフォントを初期化するコードでは、コントロールのコンストラクター内)、 &m_xHeadingFontNotifyに &m_xFontNotification を変更します。次のコードを追加します:
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;
}
IPropertyNotifySink インターフェイスの AddRef と Release のメソッドは、 ActiveX コントロールのオブジェクトの参照カウントを追跡します。コントロールがインターフェイス ポインターへのアクセスを取得すると、コントロールは参照カウントをインクリメントするに AddRef をダイヤルします。コントロールは、ポインターが完了したら、グローバル メモリ ブロックを解放するに GlobalFree が呼び出される可能性があります。 Releaseを、ほぼ同様に、ダイヤルします。このインターフェイスの参照カウントがゼロになると、インターフェイスの実装を解放できます。この例では、特定のオブジェクトの IPropertyNotifySink インターフェイスへの QueryInterface 関数の戻り値のポインター。この関数は、 ActiveX コントロールは、インターフェイスをサポートするかを判断するためにオブジェクトを呼び出すことができます。
プロジェクトへの変更が加えられると、プロジェクトを再度ビルドし、インターフェイスをテストするテスト コンテナーを使用します。テスト コンテナーへのアクセス方法については、「テスト コンテナーでのプロパティとイベントのテスト」を参照してください。
参照
関連項目
MFC ActiveX コントロール : ActiveX コントロールにおけるピクチャの使用
MFC ActiveX コントロール : ストック プロパティ ページの使用