269 lines
7.0 KiB
C++
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;
|
||
|
}
|
||
|
|
||
|
|