Artikel-ID: 307978 - Geändert am: Donnerstag, 11. Mai 2006 - Version: 4.0

Update: MFC-Steuerelemente in überlappenden IFRAMEs empfangen unnötige WM_PAINT-Meldungen

Auf dieser Seite

Alles erweitern | Alles schließen

Problembeschreibung

Wenn ein Microsoft Foundation Classes (MFC) ActiveX-Steuerelement in einem IFRAME angezeigt, die von einem anderen IFRAME auf der gleichen HTML-Seite teilweise abgedeckt ist wird, empfängt das Steuerelement unnötige WM_PAINT -Meldungen. Die unnötigen WM_PAINT -Meldungen auftreten, wenn andere Teile der HTML-Seite aktualisiert werden.

Ursache

MFC-ActiveX-Steuerelemente umfassen zwei Windows: ein untergeordnetes Fenster und ein übergeordnetes Fenster. Das übergeordnete Fenster wird für Benachrichtigungen verwendet. Wenn der IFRAME, die ein MFC-ActiveX-Steuerelement enthält vollständig in eine Dimension behandelt wird, wird das übergeordnete Fenster der Größe des Steuerelements (einschließlich den abgeschnittenen Teil, der außerhalb der Begrenzungen eines IFRAME ist) Größe. Das übergeordnete Fenster zurückgibt der Clip-Bereich Größe, wenn die Seite aktualisiert wird. Die Größenänderung generiert die zusätzlichen WM_PAINT -Meldungen.

Lösung

Installieren Sie das neueste Service Pack für Internet Explorer 6, um dieses Problem zu beheben. Weitere Informationen finden Sie die folgende KB-Artikelnummer:
328548  (http://support.microsoft.com/kb/328548/EN-US/ ) So erhalten Sie das neueste Internet Explorer 6 Service Pack
Um dieses Problem zu umgehen, ändern Sie die OnSetObjectRects -Funktion ignoriert die Größenänderung. Zum Beispiel:
// Code in the header file:
	virtual BOOL OnSetObjectRects(LPCRECT lpRectPos, LPCRECT lpRectClip);

// Code in the implementation file:
#include <afxpriv2.h>
#include <..\src\afximpl.h>
#include <..\src\ctlimpl.h>

void MyGetClippingCoordinates(LPCRECT pPosRect, LPCRECT pClipRect,
	LPRECT pIntersectRect, LPPOINT pOffsetPoint)
{
	int clipLeft = 0;
	int clipTop = 0;

	if ((pClipRect == NULL) || IsRectEmpty(pClipRect))
	{
		CopyRect(pIntersectRect, pPosRect);
	}
	else
	{
		IntersectRect(pIntersectRect, pPosRect, pClipRect);
		clipLeft = pClipRect->left;
		clipTop = pClipRect->top;
	}

	pOffsetPoint->x = min(0, pPosRect->left - clipLeft);
	pOffsetPoint->y = min(0, pPosRect->top - clipTop);
}

BOOL CTmpCtrl::OnSetObjectRects(LPCRECT lprcPosRect, LPCRECT lprcClipRect)
{
//	return COleControl::OnSetObjectRects(lprcPosRect, lprcClipRect);
	ASSERT(lprcPosRect != NULL);

	// Remember the position rectangle.
	m_rcPos = *lprcPosRect;

	// Calculate complete rectangle, include the tracker if it is present.
	CRect rectPos = m_rcPos;
	if (m_bUIActive && m_pRectTracker != NULL)
	{
		// Save new clipping rectangle (for DestroyTracker).
		if (lprcClipRect != NULL)
			m_pRectTracker->m_rectClip = *lprcClipRect;

		// Adjust tracker rectangle to new dimensions.
		CRect rectTmp = rectPos;
		rectTmp.OffsetRect(-rectTmp.left, -rectTmp.top);
		m_pRectTracker->m_rect = rectTmp;

		// Adjust the "true" rectangle to include handles/hatching.
		UINT nHandleSize = m_pRectTracker->m_nHandleSize - 1;
		rectPos.InflateRect(nHandleSize, nHandleSize);
	}

	// Now clip the rectangle as appropriate.
	CRect rectClip;
	MyGetClippingCoordinates(rectPos, lprcClipRect, rectClip, &m_ptOffset);

	// Move the outer window first, and then move the inner window.

	if (!m_bInPlaceSiteWndless)
	{
		CWnd* pWndOuter = GetOuterWindow();
		
		//BEGIN CHANGE.
		if (pWndOuter != NULL)
		{
			static CRect oldClipRect(0, 0, 0, 0);
			if (oldClipRect != rectClip)
				::MoveWindow(pWndOuter->m_hWnd,
					rectClip.left, rectClip.top,
					rectClip.Width(), rectClip.Height(),
					TRUE);
			oldClipRect = rectClip;
		}
		//END CHANGE.
		if (pWndOuter != this)
			MoveWindow(m_ptOffset.x, m_ptOffset.y,
				rectPos.Width(), rectPos.Height());
	}

	return TRUE;
} 
				

Status

Microsoft hat bestätigt, dass es sich hierbei um ein Problem bei den in diesem Artikel Microsoft-Produkten handelt. Dieses Problem wurde erstmals in Internet Explorer 6 Service Pack 1 behoben.

Weitere Informationen

Schritte zum Reproduzieren des Verhaltens

  1. Erstellen Sie ein Standard MFC-ActiveX-Steuerelement.
  2. Verwenden Sie die OnDraw -Funktion ändern möchten, den folgenden Code an die Paint-Anzahl:
    void CTmpCtrl::OnDraw(
    			CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
    {
    	static int count = 0;
    	// TODO: Replace the following code with your own drawing code.
    	pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
    	pdc->Ellipse(rcBounds);
    	CString number;
    	number.Format("%d", count++);
    	pdc->TextOut(10, (rcBounds.bottom - rcBounds.top)/2, number);
    }
    					
  3. Erstellen Sie das MFC-ActiveX-Steuerelement. Das Steuerelement registriert automatisch.
  4. Erstellen Sie eine neue HTML-Datei namens Simple.htm, die den folgenden Code enthält:
    <html>
    <body>
    <textarea style="width: 100%; height: 10%">You can type text in this text area</textarea>
    <iframe src="mfctest.htm" style="top: 300; left: 0; position:absolute"></iframe>
    <iframe src="about:blank" style="top: 300; left: 200; position: absolute"></iframe>
    </body>
    </html>
    					
  5. Erstellen Sie einen anderen neuen HTML-Datei mit dem Namen Mfctest.htm, die den folgenden Code enthält:
    <html>
    <body style="margin:0px;">
    <object
    	classid="clsid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx"
    	height = "100%"
    	width = "100%">
    </object>
    </body>
    </html>
    					
    Hinweis : Verwenden Sie die ID (CLSID)-Klasse aus der ODL-Datei des ActiveX-Steuerelement. Eine der IFRAMEs für Simple.htm, Mfctest.htm ist.
  6. Doppelklicken Sie auf Simple.htm, und geben Sie Text im Textbereich. Jedes Mal Sie eingeben, flackert das ActiveX-Steuerelement. Darüber hinaus jedes sobald Größe des Dokumentfensters im oberen Frame ändert, flackert das ActiveX-Steuerelement.
  7. Um anzuzeigen, wie das Layout für das Problem auswirkt, ändern Sie die wichtigsten Attribute eines IFRAMEs auf einen anderen Wert als 300. Stellen Sie sicher, dass der IFRAME nicht vollständig abgedeckt wird. Aktualisieren oder Ändern der Größe der Seite. Beachten Sie, dass der Rahmen nicht Flimmern.
Hinweis : Dieses Problem tritt auf, wenn eine der Dimensionen (die Breite oder Höhe) von IFRAME mit das MFC-ActiveX-Steuerelement von der anderen IFRAME vollständig abgedeckt wird.

Informationsquellen

Finden Sie weitere Informationen zum Entwickeln von webbasierten Lösungen für Microsoft Internet Explorer auf der folgenden Microsoft-Websites:
http://msdn.microsoft.com/ie/ (http://msdn.microsoft.com/ie/)

http://support.microsoft.com/iep (http://support.microsoft.com/iep)

Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Internet Explorer 5.5
  • Microsoft Internet Explorer (Programming) 6.0
Keywords: 
kbmt kbbug kbctrlcreate kbfix kbie600sp1fix KB307978 KbMtde
Maschinell übersetzter ArtikelMaschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 307978  (http://support.microsoft.com/kb/307978/en-us/ )
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.
Retired KB ArticleDisclaimer zu nicht mehr gepflegten KB-Inhalten
Dieser Artikel wurde für Produkte verfasst, für die Microsoft keinen Support mehr anbietet. Der Artikel wird deshalb in der vorliegenden Form bereitgestellt und nicht mehr weiter aktualisiert.
 

SPRACHE AUSWÄHLEN

 

Related Support Centers