windows-nt/Source/XPSP1/NT/base/fs/utils/regedit/regdrag.c

305 lines
7.1 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*******************************************************************************
*
* (C) COPYRIGHT MICROSOFT CORP., 1993-1994
*
* TITLE: REGDRAG.C
*
* VERSION: 4.01
*
* AUTHOR: Tracy Sharpe
*
* DATE: 05 Mar 1994
*
* Drag and drop routines for the Registry Editor.
*
********************************************************************************
*
* CHANGE LOG:
*
* DATE REV DESCRIPTION
* ----------- --- -------------------------------------------------------------
* 05 Mar 1994 TCS Original implementation.
*
*******************************************************************************/
#include "pch.h"
#include "regedit.h"
typedef struct _REGDRAGDRATA {
POINT DragRectPoint;
POINT HotSpotPoint;
HWND hLockWnd;
PRECT pDragRectArray;
int DragRectCount;
} REGDRAGDATA;
REGDRAGDATA s_RegDragData;
VOID
PASCAL
DrawDragRects(
VOID
);
/*******************************************************************************
*
* RegEdit_DragObjects
*
* DESCRIPTION:
*
* PARAMETERS:
* hWnd, handle of RegEdit window.
* hSourceWnd, handle of window initiating the drag.
* hDragImageList, image used during drag operation, assumed to be at image
* index 0. May be NULL if pDragRectArray is valid.
* pDragRectArray, array of rectangles to draw during drag operation. May
* be NULL if hDragImageList is valid.
* DragRectCount, number of rectangles pointed to be pDragRectArray.
* HotSpotPoint, offset of the cursor hotpoint relative to the image.
*
*******************************************************************************/
VOID
PASCAL
RegEdit_DragObjects(
HWND hWnd,
HIMAGELIST hDragImageList,
PRECT pDragRectArray,
int DragRectCount,
POINT HotSpotPoint
)
{
RECT CurrentDropRect;
HCURSOR hDropCursor;
HCURSOR hNoDropCursor;
HCURSOR hDragCursor;
HCURSOR hNewDragCursor;
POINT Point;
BOOL fContinueDrag;
MSG Msg;
MSG PeekMsg;
HTREEITEM hCurrentDropTreeItem = NULL;
GetWindowRect(g_RegEditData.hKeyTreeWnd, &CurrentDropRect);
GetCursorPos(&Point);
Point.x -= CurrentDropRect.left;
Point.y -= CurrentDropRect.top;
if (hDragImageList != NULL) {
if ( ImageList_BeginDrag(hDragImageList, 0, HotSpotPoint.x, HotSpotPoint.y) ) {
ImageList_DragEnter(g_RegEditData.hKeyTreeWnd, Point.x, Point.y );
}
}
s_RegDragData.hLockWnd = g_RegEditData.hKeyTreeWnd;
LockWindowUpdate(s_RegDragData.hLockWnd);
if (hDragImageList != NULL) {
ShowCursor(FALSE);
ImageList_DragShowNolock(TRUE);
}
else {
s_RegDragData.HotSpotPoint = HotSpotPoint;
s_RegDragData.pDragRectArray = pDragRectArray;
s_RegDragData.DragRectCount = DragRectCount;
s_RegDragData.DragRectPoint = Point;
DrawDragRects();
}
hDropCursor = LoadCursor(NULL, IDC_ARROW);
hDragCursor = hDropCursor;
hNoDropCursor = LoadCursor(NULL, IDC_NO);
SetCapture(hWnd);
fContinueDrag = TRUE;
while (fContinueDrag && GetMessage(&Msg, NULL, 0, 0)) {
switch (Msg.message) {
case WM_MOUSEMOVE:
//
// If we have another WM_MOUSEMOVE message in the queue
// (before any other mouse message), don't process this
// mouse message.
//
if (PeekMessage(&PeekMsg, NULL, WM_MOUSEFIRST, WM_MOUSELAST,
PM_NOREMOVE) && PeekMsg.message == WM_MOUSEMOVE)
break;
if (!PtInRect(&CurrentDropRect, Msg.pt)) {
hNewDragCursor = hNoDropCursor;
}
else {
hNewDragCursor = hDropCursor;
}
if (hNewDragCursor != hDragCursor) {
if (hDragImageList != NULL) {
if (hNewDragCursor == hDropCursor) {
ImageList_DragShowNolock(TRUE);
ShowCursor(FALSE);
}
else {
ImageList_DragShowNolock(FALSE);
ShowCursor(TRUE);
SetCursor(hNewDragCursor);
}
}
else
SetCursor(hNewDragCursor);
hDragCursor = hNewDragCursor;
}
Msg.pt.x -= CurrentDropRect.left;
Msg.pt.y -= CurrentDropRect.top;
{
TV_HITTESTINFO TVHitTestInfo;
HTREEITEM hTreeItem;
TVHitTestInfo.pt = Msg.pt;
hTreeItem = TreeView_HitTest(g_RegEditData.hKeyTreeWnd, &TVHitTestInfo);
if (hTreeItem != hCurrentDropTreeItem) {
ImageList_DragShowNolock(FALSE);
// DbgPrintf(("Got a drop target!!!\n"));
// SetWindowRedraw(g_RegEditData.hKeyTreeWnd, FALSE);
TreeView_SelectDropTarget(g_RegEditData.hKeyTreeWnd, hTreeItem);
// SetWindowRedraw(g_RegEditData.hKeyTreeWnd, TRUE);
hCurrentDropTreeItem = hTreeItem;
ImageList_DragShowNolock(TRUE);
}
}
if (hDragImageList != NULL)
ImageList_DragMove(Msg.pt.x, Msg.pt.y);
else {
DrawDragRects();
s_RegDragData.DragRectPoint = Msg.pt;
DrawDragRects();
}
break;
case WM_KEYDOWN:
if (Msg.wParam != VK_ESCAPE)
break;
// FALL THROUGH
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
fContinueDrag = FALSE;
break;
case WM_LBUTTONUP:
case WM_RBUTTONUP:
fContinueDrag = FALSE;
break;
default:
TranslateMessage(&Msg);
DispatchMessage(&Msg);
break;
}
}
ReleaseCapture();
if (hDragImageList != NULL) {
ImageList_DragShowNolock(FALSE);
ImageList_EndDrag();
if (hDragCursor == hDropCursor)
ShowCursor(TRUE);
}
else
DrawDragRects();
LockWindowUpdate(NULL);
}
/*******************************************************************************
*
* DragDragRects
*
* DESCRIPTION:
*
* PARAMETERS:
* (none).
*
*******************************************************************************/
VOID
PASCAL
DrawDragRects(
VOID
)
{
HDC hDC;
int Index;
RECT Rect;
hDC = GetDCEx(s_RegDragData.hLockWnd, NULL, DCX_WINDOW | DCX_CACHE |
DCX_LOCKWINDOWUPDATE);
for (Index = s_RegDragData.DragRectCount; Index >= 0; Index--) {
Rect = s_RegDragData.pDragRectArray[Index];
OffsetRect(&Rect, s_RegDragData.DragRectPoint.x -
s_RegDragData.HotSpotPoint.x, s_RegDragData.DragRectPoint.y -
s_RegDragData.HotSpotPoint.y);
DrawFocusRect(hDC, &Rect);
}
ReleaseDC(s_RegDragData.hLockWnd, hDC);
}