📄 flashwnd.h
字号:
if (!OnBeforeShowingContent())
return FALSE;
hr = m_lpO->DoVerb(OLEIVERB_SHOW, NULL, (IOleClientSite *)this, 0, NULL, NULL);
if (FAILED(hr))
return FALSE;
if (!OnAfterShowingContent())
return FALSE;
return TRUE;
}
//interface methods
//IUnknown
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::QueryInterface(REFIID riid, void ** ppvObject)
{
if (IsEqualGUID(riid, IID_IUnknown))
*ppvObject = (void*)(this);
else if (IsEqualGUID(riid, IID_IOleInPlaceSite))
*ppvObject = (void*)dynamic_cast<IOleInPlaceSite *>(this);
else if (IsEqualGUID(riid, IID_IOleInPlaceSiteEx))
*ppvObject = (void*)dynamic_cast<IOleInPlaceSiteEx *>(this);
else if (IsEqualGUID(riid, IID_IOleInPlaceSiteWindowless))
*ppvObject = (void*)dynamic_cast<IOleInPlaceSiteWindowless *>(this);
else if (IsEqualGUID(riid, IID_IOleInPlaceFrame))
*ppvObject = (void*)dynamic_cast<IOleInPlaceFrame *>(this);
else if (IsEqualGUID(riid, IID_IStorage))
*ppvObject = (void*)dynamic_cast<IStorage *>(this);
else
{
*ppvObject = 0;
return E_NOINTERFACE;
}
if (!(*ppvObject))
return E_NOINTERFACE; //if dynamic_cast returned 0
m_iRef++;
return S_OK;
}
OLECONTAINER(ULONG STDMETHODCALLTYPE)::AddRef()
{
m_iRef++;
return m_iRef;
}
OLECONTAINER(ULONG STDMETHODCALLTYPE)::Release()
{
m_iRef--;
return m_iRef;
}
//IOleClientSite
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::SaveObject() { NOTIMPLEMENTED; }
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker ** ppmk) { NOTIMPLEMENTED; }
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::GetContainer(LPOLECONTAINER FAR* ppContainer)
{
*ppContainer = 0;
return E_NOINTERFACE;
}
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::ShowObject()
{
return S_OK;
}
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::OnShowWindow(BOOL fShow) { NOTIMPLEMENTED; }
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::RequestNewObjectLayout() { NOTIMPLEMENTED; }
//IOleInPlaceSite
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::GetWindow(HWND FAR* lphwnd)
{
*lphwnd = GetHWND();
return S_OK;
}
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::ContextSensitiveHelp(BOOL fEnterMode) { NOTIMPLEMENTED; }
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::CanInPlaceActivate()
{
return(S_OK);
}
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::OnInPlaceActivate()
{
return(S_OK);
}
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::OnUIActivate()
{
return(S_OK);
}
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::GetWindowContext(LPOLEINPLACEFRAME FAR* lplpFrame, LPOLEINPLACEUIWINDOW FAR* lplpDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
{
*lplpFrame = (LPOLEINPLACEFRAME)this;
*lplpDoc = 0;
lpFrameInfo->fMDIApp = FALSE;
lpFrameInfo->hwndFrame = GetHWND();
lpFrameInfo->haccel = 0;
lpFrameInfo->cAccelEntries = 0;
RECT r;
::GetClientRect(GetHWND(), &r);
*lprcPosRect = r;
*lprcClipRect = r;
return(S_OK);
}
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::Scroll(SIZE scrollExtent) { NOTIMPLEMENTED; }
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::OnUIDeactivate(BOOL fUndoable)
{
return(S_OK);
}
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::OnInPlaceDeactivate()
{
return(S_OK);
}
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::DiscardUndoState() { NOTIMPLEMENTED; }
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::DeactivateAndUndo() { NOTIMPLEMENTED; }
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::OnPosRectChange(LPCRECT lprcPosRect)
{
return(S_OK);
}
//IOleInPlaceSiteEx
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::OnInPlaceActivateEx(BOOL __RPC_FAR *pfNoRedraw, DWORD dwFlags)
{
if (pfNoRedraw)
*pfNoRedraw = FALSE;
return S_OK;
}
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::OnInPlaceDeactivateEx(BOOL fNoRedraw)
{
return S_FALSE;
}
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::RequestUIActivate(void)
{
return S_FALSE;
}
//IOleInPlaceSiteWindowless
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::CanWindowlessActivate( void)
{
return S_OK;
}
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::GetCapture( void)
{
return S_FALSE;
}
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::SetCapture(
/* [in] */ BOOL fCapture)
{
return S_FALSE;
}
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::GetFocus( void)
{
return S_OK;
}
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::SetFocus(
/* [in] */ BOOL fFocus)
{
return S_OK;
}
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::GetDC(
/* [in] */ LPCRECT pRect,
/* [in] */ DWORD grfFlags,
/* [out] */ HDC __RPC_FAR *phDC)
{
return S_FALSE;
}
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::ReleaseDC(
/* [in] */ HDC hDC)
{
return S_FALSE;
}
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::InvalidateRect(
/* [in] */ LPCRECT pRect,
/* [in] */ BOOL fErase)
{
Draw(NULL, pRect, fErase);
return S_OK;
}
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::InvalidateRgn(
/* [in] */ HRGN hRGN,
/* [in] */ BOOL fErase)
{
return S_OK;
}
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::ScrollRect(
/* [in] */ INT dx,
/* [in] */ INT dy,
/* [in] */ LPCRECT pRectScroll,
/* [in] */ LPCRECT pRectClip)
{
NOTIMPLEMENTED;
}
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::AdjustRect(
/* [out][in] */ LPRECT prc)
{
return S_FALSE;
}
OLECONTAINER(HRESULT STDMETHODCALLTYPE)::OnDefWindowMessage(
/* [in] */ UINT msg,
/* [in] */ WPARAM wParam,
/* [in] */ LPARAM lParam,
/* [out] */ LRESULT __RPC_FAR *plResult)
{
return S_FALSE;
}
OLECONTAINER(void)::Draw(HDC hdcDraw, const RECT *rcDraw, BOOL bErase)
{
HWND hwnd = GetHWND();
HRESULT hr;
RECT r;
IOleObject *lpO = m_lpO;
IViewObject *lpV = m_lpViewObjectEx ? (IViewObject *)m_lpViewObjectEx : m_lpViewObject;
if (!m_bTransparent)
{
RECT rTotal;
::GetClientRect(hwnd, &rTotal);
if (lpV)
{
if (!hdcDraw)
{
hdcDraw = ::GetDC(hwnd);
hr = OleDraw(lpV, DVASPECT_CONTENT, hdcDraw, &rTotal);
::ReleaseDC(hwnd, hdcDraw);
}
else
{
hr = OleDraw(lpV, DVASPECT_CONTENT, hdcDraw, &rTotal);
}
}
return;
}
::GetWindowRect(hwnd, &r);
if (!m_hdcBack || !EqualRect(&r, &m_rcBounds))
{
if (m_hdcBack)
::DeleteDC(m_hdcBack);
if (m_bmpBack)
::DeleteObject(m_bmpBack);
if (m_hdcBackW)
::DeleteDC(m_hdcBackW);
if (m_bmpBackW)
::DeleteObject(m_bmpBackW);
m_rcBounds = r;
HDC hdc = ::GetDC(hwnd);
BITMAPINFOHEADER bih = {0};
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biBitCount = 32;
bih.biCompression = BI_RGB;
bih.biPlanes = 1;
bih.biWidth = r.right - r.left;
bih.biHeight = -(r.bottom - r.top);
m_hdcBack = CreateCompatibleDC(hdc);
m_bmpBack = CreateDIBSection(hdc, (BITMAPINFO *)&bih, DIB_RGB_COLORS, (void **)&m_lpBitsOnly, NULL, 0x0);
SelectObject(m_hdcBack, m_bmpBack);
if (m_bFixTransparency)
{
m_hdcBackW = CreateCompatibleDC(hdc);
m_bmpBackW = CreateDIBSection(hdc, (BITMAPINFO *)&bih, DIB_RGB_COLORS, (void **)&m_lpBitsOnlyW, NULL, 0x0);
SelectObject(m_hdcBackW, m_bmpBackW);
}
::ReleaseDC(hwnd, hdc);
if (m_iBPP == 0)
m_iBPP = GetDeviceCaps(m_hdcBack, BITSPIXEL);
}
POINT p = {r.left, r.top};
POINT p2 = {0, 0};
SIZE sz = {r.right-r.left, r.bottom-r.top};
if (lpO && lpV)
{
RECT rTotal;
::GetClientRect(hwnd, &rTotal);
RECTL rcBounds = {rTotal.left, rTotal.top, rTotal.right, rTotal.bottom};
BYTE *dst = m_lpBitsOnly, *dstW;
if (m_iBPP == 32)
{
if (!m_bFixTransparency) //if flash player version is other than 8, do usual painting
{
memset(m_lpBitsOnly, 0, sz.cx * sz.cy * 4);
hr = OleDraw(lpV, DVASPECT_TRANSPARENT, m_hdcBack, &rTotal);
}
else //if player version is 8, we need to fix flash player 8 control transparency bug
{
memset(m_lpBitsOnly, 0, sz.cx * sz.cy * 4);
memset(m_lpBitsOnlyW, 255, sz.cx * sz.cy * 4);
hr = OleDraw(lpV, DVASPECT_TRANSPARENT, m_hdcBack, &rTotal);
hr = OleDraw(lpV, DVASPECT_TRANSPARENT, m_hdcBackW, &rTotal);
dst = m_lpBitsOnly;
dstW = m_lpBitsOnlyW;
BYTE r, g, b, a, rw, gw, bw, aw, alpha_r, alpha_g, alpha_b, alpha;
for (int y = 0; y < sz.cy; y++)
{
for (int x = 0; x < sz.cx; x++)
{
//the idea is that we draw the same data onto black and white DC's
//and then calculate per pixel alpha based on difference, produced by alpha blending
r = *dst++;
g = *dst++;
b = *dst++;
a = *dst++;
rw = *dstW++;
gw = *dstW++;
bw = *dstW++;
aw = *dstW++;
alpha_r = rw-r;
alpha_g = gw-g;
alpha_b = bw-b;
//division by 3 is for accuracy and can be replaced by
//alpha = alpha_g; for example
alpha = (alpha_r + alpha_g + alpha_b) / 3;
*(dst - 1) = 255 - alpha;
//this algorithm should be optimized for MMX to achieve best performance
}
}
}
}
else //in 8/16/24 bit screen depth UpdateLayeredWindow produces wrong results - we use underlaying DC to paint to
{
HWND hwndParent = ::GetParent(hwnd);
HDC hdcParent = ::GetWindowDC(hwndParent);
BOOL bRet = BitBlt(m_hdcBack, 0, 0, rTotal.right, rTotal.bottom, hdcParent, 0, 0, SRCCOPY);
::ReleaseDC(hwndParent, hdcParent);
hr = OleDraw(lpV, DVASPECT_TRANSPARENT, m_hdcBack, &rTotal);
dst = m_lpBitsOnly;
}
}
BLENDFUNCTION bf;
bf.BlendOp = AC_SRC_OVER;
bf.AlphaFormat = AC_SRC_ALPHA;
bf.BlendFlags = 0;
bf.SourceConstantAlpha = 255;
BOOL bRet = UpdateLayeredWindow(hwnd, NULL, &p, &sz, m_hdcBack, &p2, 0, &bf, m_iBPP == 32 ? ULW_ALPHA : ULW_OPAQUE);
}
//IStorage
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -