ActiveX 闪烁问题

解决办法:重写Ctrl类的虚函数OnSetObjectRects()。

Ctrl类向导中添加虚函数OnSetObjectRects重写。

OnSetObjectRects具体代码如下

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 CPqtelPlatformShowCtrl::OnSetObjectRects(LPCRECT lpRectPos, LPCRECT lpRectClip)
{
	// TODO: 在此添加专用代码和/或调用基类
	//return COleControl::OnSetObjectRects(lpRectPos, lpRectClip);
	ASSERT(lpRectClip != NULL);
	// Remember the position rectangle.
	m_rcPos = *lpRectPos;
	// 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 (lpRectClip != NULL)
			m_pRectTracker->m_rectClip = *lpRectClip;
		// 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, lpRectClip, 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值