Astonish Arts  > AADS  > MFC  > CHtmlView

Astonish Arts Developer Section

MFC

CHtmlView

画像の表示を無効(表示・ダウンロードをしない)にする

画像の表示を無効(表示・ダウンロードをしない)にする
この方法を使えば、動画の再生・ActiveXの実行(FLASHの実行)・サウンド(音)の再生などを制御することができます。
CHtmlViewの派生クラス(関連付けられたCHtmlViewのクラス)にOnAmbientProperty関数をオーバーライドします。
OnAmbientProperty関数内に、以下のコードを追加することで画像・音声・ActiveX(FLASH等)・動画の再生(ダウンロード)を制御することができます。
BOOL CHtmlViewSample::OnAmbientProperty(
    COleControlSite* pSite,
    DISPID dispid, VARIANT* pvar
)
{
    // +--- ダウンロードするものの制御
    if ( dispid == DISPID_AMBIENT_DLCONTROL )
    {
        pvar->vt	= VT_I4;
        pvar->lVal	= 0;

        // +--- イメージをダウンロードの許可をする
        pvar->lVal |= DLCTL_DLIMAGES;
        
        // +--- サウンドをダウンロードの許可をする
        pvar->lVal |= DLCTL_BGSOUNDS;
        
        // +--- 動画をダウンロードの許可をする
        pvar->lVal |= DLCTL_VIDEOS;
        
        // +--- FLASHをダウンロードの許可をする(ActiveX全般)
        pvar->lVal |= DLCTL_NO_RUNACTIVEXCTLS;
        pvar->lVal |= DLCTL_NO_DLACTIVEXCTLS;
        
        // +--- エラーメッセージボックス(スクリプトエラー)を表示しない
        pvar->lVal |= DLCTL_SILENT;

        // +--- ジャバスクリプトを無効にする
        pvar->lVal |= DLCTL_NO_JAVA;
        pvar->lVal |= DLCTL_NO_SCRIPTS;

        return TRUE;
    }

    return CHtmlView::OnAmbientProperty(pSite, dispid, pvar);
}
			
DISPID_AMBIENT_DLCONTROL は CHtmlViewが作成されるタイミング(実際はどうなのかわかりませんが...)で最初に1度だけ呼び出されます。
なぜかわかりませんが、この設定だけで実行し続けているとジャバスクリプトが無効になったり、スタイルシートが読み込めなくなったり、原因不明の現象が多発しました。
解決策として正しいかどうかわかりませんが Navigate2 を呼び出す直前で、DISPID_AMBIENT_DLCONTROL を再度送信することで問題は回避できます。
以下がそのための追加コードです。
void CHtmlViewSample::OnChangeAmbient( void )
{
    LPOLECONTROL  pOleControl = NULL;
    LPDISPATCH    pDisp       = NULL;

    pDisp = GetApplication();
    ASSERT( pDisp );

    pDisp->QueryInterface( IID_IOleControl, (LPVOID*)&pOleControl );
    ASSERT( pOleControl );

    // +--- DISPID_AMBIENT_DLCONTROL を再送信。設定をしなおす。
    pOleControl->OnAmbientPropertyChange( DISPID_AMBIENT_DLCONTROL );

    // +--- Oleコントロール等を解放します。
    if ( pOleControl )  pOleControl->Release();
    if ( pDisp )        pDisp->Release();
}
			
OnChangeAmbient は独自の関数です。適当なわかりやすい名前をつけてもらって構いません。
この関数を任意のタイミングで(Navigate2 関数を呼び出す前)呼び出すことで、ジャバスクリプトが無効になる等の問題を回避することができます。
コピーライト