#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; }