//-------------------------------------------------------------------------- // 功能:放置物品 //-------------------------------------------------------------------------- int KWndObjectMatrix::DropObject(int x, int y, bool bTestOnly) { KUiDraggedObject DragObj; m_nPutPosX = NO_MATCHED_PUT_POS; if (m_Style & OBJCONT_S_ACCEPT_FREE) { if (bTestOnly == false) DropObject(x, y, (KUiDraggedObject*)NULL); return true; } Wnd_GetDragObj(&DragObj); if (DragObj.DataW > m_nNumUnitHori || DragObj.DataH > m_nNUmUnitVert) return false; //转换成格子坐标 RECT or; KUiDraggedObject* pOverlaped = NULL; x = (x - m_nAbsoluteLeft) / m_nUnitWidth; y = (y - m_nAbsoluteTop) / m_nUnitHeight; if ((or.right = x + (DragObj.DataW + 1) / 2) > m_nNumUnitHori) or.right = m_nNumUnitHori; if ((or.bottom = y + (DragObj.DataH + 1) / 2) > m_nNUmUnitVert) or.bottom = m_nNUmUnitVert; if (or.right >= DragObj.DataW) or.left = or.right - DragObj.DataW; else { or.left = 0; or.right = DragObj.DataW; } if (or.bottom >= DragObj.DataH) or.top = or.bottom - DragObj.DataH; else { or.top = 0; or.bottom = DragObj.DataH; } if (TryDropObjAtPos(or, pOverlaped)) { if (bTestOnly == false) DropObject(or.left, or.top, pOverlaped); else if (pOverlaped) { m_nPutPosX = REPLACE_ITEM_POS(pOverlaped - m_pObjects); } else { m_nPutPosX = or.left; m_nPutPosY = or.top; m_nPutWidth = DragObj.DataW; m_nPutHeight = DragObj.DataH; } return true; } if (DragObj.DataW == 1 && DragObj.DataH == 1) return false; RECT Try; Try.right = x; Try.bottom = y; if ((Try.left = x - DragObj.DataW + 1) < 0) Try.left = 0; if ((Try.top = y - DragObj.DataH + 1) < 0) Try.top = 0; for (or.left = Try.left; or.left <= Try.right; or.left ++) { or.right = or.left + DragObj.DataW; for (or.top = Try.top; or.top <= Try.bottom; or.top ++) { or.bottom = or.top + DragObj.DataH; if (TryDropObjAtPos(or, pOverlaped)) { if (bTestOnly == false) DropObject(or.left, or.top, pOverlaped); return true; } } } return false; }
//-------------------------------------------------------------------------- // 功能:窗口函数 //-------------------------------------------------------------------------- int KWndObjectBox::WndProc(unsigned int uMsg, unsigned int uParam, int nParam) { int nStallState = g_pCoreShell->GetGameData(GDI_IS_STALL, -1, -1); switch(uMsg) { case WM_LBUTTONDOWN: if (m_pParentWnd && !nStallState && (m_Style & OBJCONT_S_DISABLE_PICKPUT) == 0) { if (Wnd_GetDragObj(NULL)) { DropObject(false); } else if (m_Object.uGenre != CGOG_NOTHING) { ITEM_PICKDROP_PLACE Pick; Pick.pWnd = this; Pick.h = 0; Pick.v = 0; m_pParentWnd->WndProc(WND_N_ITEM_PICKDROP, (unsigned int)&Pick, NULL); } } break; case WM_LBUTTONUP: if (m_pParentWnd && ((m_Style & OBJCONT_S_DISABLE_PICKPUT) || nStallState)) { if (m_Object.uGenre != CGOG_NOTHING) { KUiDraggedObject Obj; Obj = m_Object; m_pParentWnd->WndProc(WND_N_LEFT_CLICK_ITEM, (unsigned int)&Obj, (int)(KWndWindow*)this); } else if (m_Style & OBJCONT_S_ENABLE_CLICK_EMPTY) { m_pParentWnd->WndProc(WND_N_LEFT_CLICK_ITEM, NULL, (int)(KWndWindow*)this); } } break; case WM_RBUTTONUP: if (m_pParentWnd) { if (m_Object.uGenre != CGOG_NOTHING) { KUiDraggedObject Obj; Obj = m_Object; m_pParentWnd->WndProc(WND_N_RIGHT_CLICK_ITEM, (unsigned int)&m_Object, (int)(KWndWindow*)this); } else if (m_Style & OBJCONT_S_ENABLE_CLICK_EMPTY) { m_pParentWnd->WndProc(WND_N_LEFT_CLICK_ITEM, NULL, (int)(KWndWindow*)this); } } break; case WM_MOUSEHOVER: case WM_MOUSEMOVE: m_Style |= OBJCONT_F_MOUSE_HOVER; if (m_Object.uGenre != CGOG_NOTHING && g_MouseOver.IsMoseHoverWndObj(this, 0) == 0) SetMouseHoverObjectDesc(this, 0, m_Object.uGenre, m_Object.uId, m_nContainerId, GET_X_LPARAM(nParam), GET_Y_LPARAM(nParam)); break; case WND_M_MOUSE_LEAVE: m_Style &= ~OBJCONT_F_MOUSE_HOVER; KWndWindow::WndProc(uMsg, uParam, nParam); break; default: return KWndWindow::WndProc(uMsg, uParam, nParam); } return 0; }
//-------------------------------------------------------------------------- // 功能:窗口函数 //-------------------------------------------------------------------------- int KWndObjectMatrix::WndProc(unsigned int uMsg, unsigned int uParam, int nParam) { int nStallState = g_pCoreShell->GetGameData(GDI_IS_STALL, -1, -1); switch(uMsg) { case WM_LBUTTONDOWN: if (!nStallState && (m_Style & OBJCONT_S_DISABLE_PICKPUT)== 0) { if (Wnd_GetDragObj(NULL)) DropObject(GET_X_LPARAM(nParam), GET_Y_LPARAM(nParam), false); else PickUpObjectAt(GET_X_LPARAM(nParam), GET_Y_LPARAM(nParam)); } break; case WM_LBUTTONUP: if ((nStallState || (m_Style & OBJCONT_S_DISABLE_PICKPUT)) && m_pParentWnd) { m_nPutPosX = NO_MATCHED_PUT_POS; int nObj = GetObjectAt(GET_X_LPARAM(nParam), GET_Y_LPARAM(nParam)); if (nObj >= 0) { KUiDraggedObject Obj; Obj = m_pObjects[nObj]; m_pParentWnd->WndProc(WND_N_LEFT_CLICK_ITEM, (unsigned int)&Obj, (int)(KWndWindow*)this); } } break; case WM_RBUTTONUP: m_nPutPosX = NO_MATCHED_PUT_POS; if (m_pParentWnd) { int nObj = GetObjectAt(GET_X_LPARAM(nParam), GET_Y_LPARAM(nParam)); if (nObj >= 0) { KUiDraggedObject Obj; Obj = m_pObjects[nObj]; m_pParentWnd->WndProc(WND_N_RIGHT_CLICK_ITEM, (unsigned int)&Obj, (int)(KWndWindow*)this); } } break; case WM_MOUSEHOVER: case WM_MOUSEMOVE: m_Style |= OBJCONT_F_MOUSE_HOVER; { int x = GET_X_LPARAM(nParam); int y = GET_Y_LPARAM(nParam); int nObj = GetObjectAt(x, y); m_nMouseOverObj = nObj; if (nObj >= 0) { if (g_MouseOver.IsMoseHoverWndObj(this, nObj) == 0) { SetMouseHoverObjectDesc(this, nObj, m_pObjects[nObj].uGenre, m_pObjects[nObj].uId, m_nContainerId, x, y); } } else g_MouseOver.CancelMouseHoverInfo(); if ((m_Style & OBJCONT_S_TRACE_PUT_POS) && Wnd_GetDragObj(NULL)) { DropObject(GET_X_LPARAM(nParam), GET_Y_LPARAM(nParam), true); } } break; case WND_M_MOUSE_LEAVE: m_nPutPosX = NO_MATCHED_PUT_POS; m_Style &= ~OBJCONT_F_MOUSE_HOVER; KWndWindow::WndProc(uMsg, uParam, nParam); break; default: return KWndWindow::WndProc(uMsg, uParam, nParam); } return 0; }
/*============================================================================= -- Drops the active object. =============================================================================*/ void Actor::DropActiveObject() { if (!mInventory->GetActiveObject().expired()) DropObject(mInventory->GetActiveObject().lock()->GetId()); }