/******************************************************************************* * * (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); }