305 lines
7.1 KiB
C
305 lines
7.1 KiB
C
/*******************************************************************************
|
|
*
|
|
* (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);
|
|
|
|
}
|