Windows2003-3790/windows/advcore/duser/engine/lava/dxcontainer.cpp
2020-09-30 16:53:55 +02:00

269 lines
7.0 KiB
C++

#include "stdafx.h"
#include "Lava.h"
#include "DxContainer.h"
#include "MsgHelp.h"
/***************************************************************************\
*****************************************************************************
*
* API Implementation
*
*****************************************************************************
\***************************************************************************/
//------------------------------------------------------------------------------
DxContainer *
GetDxContainer(DuVisual * pgad)
{
DuContainer * pcon = pgad->GetContainer();
AssertReadPtr(pcon);
DxContainer * pconDX = CastDxContainer(pcon);
return pconDX;
}
//------------------------------------------------------------------------------
HRESULT
GdCreateDxRootGadget(
IN const RECT * prcContainerPxl,
IN CREATE_INFO * pci, // Creation information
OUT DuRootGadget ** ppgadNew)
{
HRESULT hr;
DxContainer * pconNew;
hr = DxContainer::Build(prcContainerPxl, &pconNew);
if (FAILED(hr)) {
return hr;
}
hr = DuRootGadget::Build(pconNew, TRUE, pci, ppgadNew);
if (FAILED(hr)) {
pconNew->xwUnlock();
return hr;
}
//
// Don't setup an initial brush when using DirectX
//
return S_OK;
}
/***************************************************************************\
*****************************************************************************
*
* class DxContainer
*
*****************************************************************************
\***************************************************************************/
//------------------------------------------------------------------------------
DxContainer::DxContainer()
{
}
//------------------------------------------------------------------------------
DxContainer::~DxContainer()
{
//
// Need to destroy the gadget tree before this class is destructed since
// it may need to make calls to the container during its destruction. If
// we don't do this here, it may end up calling pure-virtual's on the base
// class.
//
xwDestroyGadget();
}
//------------------------------------------------------------------------------
HRESULT
DxContainer::Build(const RECT * prcContainerPxl, DxContainer ** ppconNew)
{
AssertReadPtr(prcContainerPxl);
DxContainer * pconNew = ClientNew(DxContainer);
if (pconNew == NULL) {
return E_OUTOFMEMORY;
}
pconNew->m_rcContainerPxl = *prcContainerPxl;
pconNew->m_rcClientPxl.left = 0;
pconNew->m_rcClientPxl.top = 0;
pconNew->m_rcClientPxl.right = pconNew->m_rcContainerPxl.right - pconNew->m_rcContainerPxl.left;
pconNew->m_rcClientPxl.bottom = pconNew->m_rcContainerPxl.bottom - pconNew->m_rcContainerPxl.top;
*ppconNew = pconNew;
return S_OK;
}
//------------------------------------------------------------------------------
void
DxContainer::OnGetRect(RECT * prcDesktopPxl)
{
AssertWritePtr(prcDesktopPxl);
*prcDesktopPxl = m_rcContainerPxl;
}
//------------------------------------------------------------------------------
void
DxContainer::OnInvalidate(const RECT * prcInvalidContainerPxl)
{
UNREFERENCED_PARAMETER(prcInvalidContainerPxl);
}
//------------------------------------------------------------------------------
void
DxContainer::OnStartCapture()
{
}
//------------------------------------------------------------------------------
void
DxContainer::OnEndCapture()
{
}
//------------------------------------------------------------------------------
BOOL
DxContainer::OnTrackMouseLeave()
{
return FALSE;
}
//------------------------------------------------------------------------------
void
DxContainer::OnSetFocus()
{
}
//------------------------------------------------------------------------------
void
DxContainer::OnRescanMouse(POINT * pptContainerPxl)
{
pptContainerPxl->x = -20000;
pptContainerPxl->y = -20000;
}
//------------------------------------------------------------------------------
BOOL
DxContainer::xdHandleMessage(UINT nMsg, WPARAM wParam, LPARAM lParam, LRESULT * pr, UINT nMsgFlags)
{
if (m_pgadRoot == NULL) {
return FALSE; // If don't have a root, there is nothing to handle.
}
//
// NOTE: All messages that come into the DxContainer are coming through the
// ForwardGadgetMessage() API which has already taken a Context lock.
// Therefore, we don't need to take the Context lock in this function again.
// Other Containers do NOT necessarily have this behavior.
//
POINT ptContainerPxl;
*pr = 0;
switch (nMsg)
{
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_MBUTTONDOWN:
case WM_LBUTTONDBLCLK:
case WM_RBUTTONDBLCLK:
case WM_MBUTTONDBLCLK:
case WM_LBUTTONUP:
case WM_RBUTTONUP:
case WM_MBUTTONUP:
{
GMSG_MOUSECLICK msg;
GdConvertMouseClickMessage(&msg, nMsg, wParam);
ptContainerPxl.x = GET_X_LPARAM(lParam);
ptContainerPxl.y = GET_Y_LPARAM(lParam);
ContextLock cl;
if (cl.LockNL(ContextLock::edDefer)) {
return m_pgadRoot->xdHandleMouseMessage(&msg, ptContainerPxl);
}
break;
}
case WM_MOUSEWHEEL:
{
ptContainerPxl.x = GET_X_LPARAM(lParam);
ptContainerPxl.y = GET_Y_LPARAM(lParam);
GMSG_MOUSEWHEEL msg;
GdConvertMouseWheelMessage(&msg, wParam);
ContextLock cl;
if (cl.LockNL(ContextLock::edDefer)) {
return m_pgadRoot->xdHandleMouseMessage(&msg, ptContainerPxl);
}
break;
}
case WM_MOUSEMOVE:
case WM_MOUSEHOVER:
{
GMSG_MOUSE msg;
GdConvertMouseMessage(&msg, nMsg, wParam);
ptContainerPxl.x = GET_X_LPARAM(lParam);
ptContainerPxl.y = GET_Y_LPARAM(lParam);
ContextLock cl;
if (cl.LockNL(ContextLock::edDefer)) {
return m_pgadRoot->xdHandleMouseMessage(&msg, ptContainerPxl);
}
break;
}
case WM_MOUSELEAVE:
{
ContextLock cl;
if (cl.LockNL(ContextLock::edDefer)) {
m_pgadRoot->xdHandleMouseLeaveMessage();
return TRUE;
}
break;
}
case WM_CHAR:
case WM_KEYDOWN:
case WM_KEYUP:
case WM_SYSCHAR:
case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
{
GMSG_KEYBOARD msg;
GdConvertKeyboardMessage(&msg, nMsg, wParam, lParam);
BOOL fResult = m_pgadRoot->xdHandleKeyboardMessage(&msg, nMsgFlags);
return fResult;
}
}
return FALSE;
}