2#include <core/SHostPresenter.h>
3#include <core/SHostWnd.h>
7struct S_UPDATELAYEREDWINDOWINFO
16 BLENDFUNCTION *pblend;
21typedef BOOL(WINAPI *FunUpdateLayeredWindow)(HWND hwnd, HDC hdcDst,
const POINT *pptDst,
const SIZE *psize, HDC hdcSrc,
const POINT *pptSrc, COLORREF crKey,
const BLENDFUNCTION *pblend, DWORD dwflags);
22typedef BOOL(WINAPI *FunUpdateLayeredWindowIndirect)(HWND hwnd,
const S_UPDATELAYEREDWINDOWINFO *pULWInfo);
24static FunUpdateLayeredWindow s_funUpdateLayeredWindow = NULL;
25static FunUpdateLayeredWindowIndirect s_funUpdateLayeredWindowIndirect = NULL;
27BOOL WINAPI _SUpdateLayeredWindowIndirect(HWND hWnd,
const S_UPDATELAYEREDWINDOWINFO *info)
29 SASSERT(s_funUpdateLayeredWindow);
30 return (*s_funUpdateLayeredWindow)(hWnd, info->hdcDst, info->pptDst, info->psize, info->hdcSrc, info->pptSrc, info->crKey, info->pblend, info->dwFlags);
33BOOL SWndSurface::Init()
35 HMODULE hUser32 = GetModuleHandle(_T(
"user32"));
41 s_funUpdateLayeredWindow = (FunUpdateLayeredWindow)GetProcAddress(hUser32,
"UpdateLayeredWindow");
42 if (!s_funUpdateLayeredWindow)
49 s_funUpdateLayeredWindowIndirect = _SUpdateLayeredWindowIndirect;
51 s_funUpdateLayeredWindowIndirect = (FunUpdateLayeredWindowIndirect)GetProcAddress(hUser32,
"UpdateLayeredWindowIndirect");
52 if (!s_funUpdateLayeredWindowIndirect)
53 s_funUpdateLayeredWindowIndirect = _SUpdateLayeredWindowIndirect;
58BOOL SWndSurface::SUpdateLayeredWindowIndirect(HWND hWnd,
const S_UPDATELAYEREDWINDOWINFO *pULWInfo)
60 BOOL bRet = s_funUpdateLayeredWindowIndirect(hWnd, pULWInfo);
66 : m_pHostWnd(pHostWnd)
88 if (m_pHostWnd->IsTranslucent())
94 BOOL bGetDC = hdc == 0;
96 hdc = m_pHostWnd->GetDC();
97 HDC memdc = pMemRT->
GetDC(1);
98 ::BitBlt(hdc, rcInvalid->left, rcInvalid->top, rcInvalid->right - rcInvalid->left, rcInvalid->bottom - rcInvalid->top, memdc, rcInvalid->left, rcInvalid->top, SRCCOPY);
101 m_pHostWnd->ReleaseDC(hdc);
108 ((SNativeWnd *)m_pHostWnd)->GetWindowRect(&rc);
109 RECT rcDirty = { 0 };
116 rcDirty.right = rc.right - rc.left;
117 rcDirty.bottom = rc.bottom - rc.top;
119 BLENDFUNCTION bf = { AC_SRC_OVER, 0, byAlpha, AC_SRC_ALPHA };
121 POINT ptDst = { rc.left, rc.top };
122 SIZE szDst = { rc.right - rc.left, rc.bottom - rc.top };
125 HDC hdc = pRT->
GetDC(1);
126 S_UPDATELAYEREDWINDOWINFO info = {
sizeof(info), NULL, &ptDst, &szDst, hdc, &ptSrc, 0, &bf, ULW_ALPHA, &rcDirty };
127 SWndSurface::SUpdateLayeredWindowIndirect(m_pHostWnd->GetNative()->GetHwnd(), &info);
133 : m_pHostWnd(pHostWnd)
155 BOOL bGetDC = hdc == 0;
157 hdc = m_pHostWnd->GetDC();
158 HDC memdc = pMemRT->
GetDC(1);
159 ::BitBlt(hdc, rcInvalid->left, rcInvalid->top, rcInvalid->right - rcInvalid->left, rcInvalid->bottom - rcInvalid->top, memdc, rcInvalid->left, rcInvalid->top, SRCCOPY);
160 if (m_pHostWnd->GetHostAttr().m_bTranslucent && m_pHostWnd->GetHostAttr().m_bAutoShape)
162 HBITMAP hBmp = GetCurrentObject(memdc, OBJ_BITMAP);
163 HRGN hRgn = CreateRegionFromBitmap(hBmp, 0, 0xFF000000);
164 SetWindowRgn(m_pHostWnd->m_hWnd, hRgn, FALSE);
170 m_pHostWnd->ReleaseDC(hdc);
void UpdateLayerFromRenderTarget(IRenderTarget *pRT, BYTE byAlpha, LPCRECT prcDirty=NULL)
Updates the layer from the render target.
void OnHostPresent(HDC hdc, IRenderTarget *pMemRT, LPCRECT rcDirty, BYTE byAlpha) OVERRIDE
Called to present the host window.
void OnHostResize(SIZE szHost) OVERRIDE
Called when the host window is resized.
SHostPresenter(SHostWnd *pHostWnd)
Constructor for SHostPresenter.
void OnHostCreate() OVERRIDE
Called when the host window is created.
void OnHostDestroy() OVERRIDE
Called when the host window is destroyed.
~SHostPresenter(void)
Destructor for SHostPresenter.
The main host window class responsible for managing the layout, events, and rendering of SOUI windows...
Interface for rendering target objects.
HDC GetDC(UINT uFlag) PURE
Retrieves a device context (DC) compatible with the render target.
void ReleaseDC(HDC hdc, LPCRECT pRc=NULL) PURE
Releases a previously retrieved device context (DC).