MFC で Edit をサブクラス化した Window なしコントロールとウインドウありコントロールを IE でホストすると描画が乱れる

現象
MFC を使用した Edit コントロールをサブクラス化した Window なしの ActiveX Control と、何らかの Window ありコントロールを、Internet Explorer 8 で同じ画面上でホストした場合、スクロールによる再描画の際にコントロールが適切に描画されない場合があります。
原因
MFC を使用した Edit コントロールをサブクラス化した Window なしの ActiveX Controlでは、CWnd::DoSuperClassPaint() 関数を使用して描画を行います。DoSuperClassPaint() では Window ハンドルが存在しない場合はウインドウを作成しますが、Windowless コントロールの場合は、非表示領域にウインドウを作成しています。DoSuperPaint() 内部では非表示領域に作成したウインドウに、MapMode や ViewPort の座標を変更して描画/移動する処理が行われれています。
本現象発生時には、MFC ActiveX Control で、Window なしで Edit をサブクラス化したコントロールの DoSuperClassPaint() が呼び出されウインドウ座標が変更された状態で、Window ありのコントロールの描画が行われる、という条件があります。これにより、MFC Window ありのコントロールの OnDraw() でクリッピング領域のイメージのもととなる領域が、 Windowless コントロールによって変更された座標をもととしてしまうため、不適切な描画が行われます。
回避策
1. ATL を使用した ActiveX Control を使用する
ATL の Window なしコントロールでは、描画の際に座標系を変更する処理は行わないため現象は発生いたしません。

2. MFC の場合 OnSetObjectRects() をオーバーライドすることで回避できます
OnSetObjectRects() にて SetRedraw() にて描画処理を一時停止することにより、DoSuperClassPaint() での処理と他のコントロールの描画処理が重なることを避けることができます。以下は、CActiveXTextCtrl が COleControl の派生クラスの場合のコード例です。

BOOL CActiveXTestCtrl::OnSetObjectRects(LPCRECT lpRectPos, LPCRECT lpRectClip)
{
    CWnd* pOuter = GetOuterWindow();
    if(pOuter)
    {
        pOuter->SetRedraw(FALSE);
    }
    BOOL bRet = COleControl::OnSetObjectRects(lpRectPos, lpRectClip);
    if(pOuter)
    {
        pOuter->SetRedraw(TRUE);
        pOuter->RedrawWindow();
    }
    return bRet;
}
注意 : これは、マイクロソフトのサポート組織内で直接作成された "緊急公開" の資料です。 この資料には、確認中の問題に関する現状ベースの情報が記載されています。 情報提供のスピードを優先するため、資料には誤植が含まれる可能性があり、予告なしに随時改定される場合があります。 その他の考慮事項については、使用条件を参照してください。
プロパティ

文書番号:2724084 - 最終更新日: 06/14/2012 05:49:00 - リビジョン: 1.0

Microsoft Visual Studio 2008 Academic Edition, Microsoft Visual Studio 2008 Standard Edition, Microsoft Visual Studio 2008 Professional Edition, Microsoft Visual Studio 2008 Tools for Applications Software Development Kit, Microsoft Visual Studio 2010 Professional, Microsoft Visual Studio 2010 Premium with MSDN, Microsoft Visual Studio 2010 Ultimate, Windows Internet Explorer 7, Windows Internet Explorer 8, Windows Internet Explorer 9

  • KB2724084
フィードバック