Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Thema wird Code zum Behandeln des Ziehens und Ablegens von Strukturansichtselementen veranschaulicht. Der Beispielcode besteht aus drei Funktionen. Die erste Funktion beginnt den Ziehvorgang, die zweite Funktion zieht das Bild, und die dritte Funktion beendet den Ziehvorgang.
Hinweis
Das Ziehen eines Strukturansichtselements umfasst in der Regel die Verarbeitung des TVN_BEGINDRAG (oder TVN_BEGINRDRAG) Benachrichtigungscodes, der WM_MOUSEMOVE Nachricht und der WM_LBUTTONUP (oder WM_RBUTTONUP) Nachricht. Es umfasst auch die Verwendung der Bildlistenfunktionen , um das Element zu zeichnen, während es gezogen wird.
Was Sie wissen müssen
Technologieen
Voraussetzungen
- C/C++
- Programmierung der Windows-Benutzeroberfläche
Anweisungen
Schritt 1: Starten des Ziehvorgangs für die Strukturansicht
Ein Strukturansicht-Steuerelement sendet dem übergeordneten Fenster einen TVN_BEGINDRAG (oder TVN_BEGINRDRAG) Benachrichtigungscode, wenn der Benutzer mit dem Ziehen eines Elements beginnt. Das übergeordnete Fenster empfängt die Benachrichtigung in Form einer WM_NOTIFY Nachricht, deren lParam-Parameter die Adresse einer NMTREEVIEW-Struktur ist. Die Elemente dieser Struktur umfassen die Bildschirmkoordinaten des Mauszeigers und eine TVITEM-Struktur , die Informationen zu dem element enthält, das gezogen werden soll.
Das folgende Beispiel zeigt, wie die WM_NOTIFY Nachricht verarbeitet wird, um TVN_BEGINDRAG abzurufen.
case WM_NOTIFY:
switch (((LPNMHDR)lParam)->code)
{
case TVN_BEGINDRAG:
Main_OnBeginDrag(((LPNMHDR)lParam)->hwndFrom, (LPNMTREEVIEW)lParam);
break;
// Handle other cases here.
}
break;
Beim Starten des Ziehvorgangs wird die ImageList_BeginDrag-Funktion verwendet. Die Parameter der Funktion enthalten den Ziehpunkt der Bildliste, die das Bild enthält, das während des Ziehvorgangs und des Indexes des Bilds verwendet werden soll. Sie können entweder eine eigene Bildliste und ein eigenes Bild bereitstellen, oder Sie können das Strukturansichtssteuerelement für Sie erstellen lassen, indem Sie die TVM_CREATEDRAGIMAGE Nachricht verwenden.
Da das Ziehbild den Mauszeiger für die Dauer des Ziehvorgangs ersetzt, müssen Sie ImageList_BeginDrag einen Hotspot innerhalb des Bilds angeben. Die Koordinaten des Hotspots sind relativ zur oberen linken Ecke des Bilds. ImageList_BeginDrag müssen Sie auch die anfängliche Position des Ziehbilds angeben. Eine Anwendung legt in der Regel die ausgangsposition fest, sodass der Hotspot des Ziehbilds dem des Mauszeigers entspricht, wenn der Benutzer den Ziehvorgang gestartet hat.
Die folgende Funktion veranschaulicht, wie Sie mit dem Ziehen eines Strukturansichtselements beginnen. Es verwendet das vom Strukturansicht-Steuerelement bereitgestellte Ziehbild und ruft das umgebende Rechteck des Elements ab, um den geeigneten Punkt für den Hotspot zu bestimmen. Die Abmessungen des umgebenden Rechtecks entsprechen denen des Bilds.
Die Funktion erfasst Mauseingaben, wodurch Mausnachrichten an das übergeordnete Fenster gesendet werden. Das übergeordnete Fenster benötigt die nachfolgenden WM_MOUSEMOVE Nachrichten, um zu bestimmen, wo das Bild und die WM_LBUTTONUP Nachricht gezogen werden sollen, um zu bestimmen, wann der Ziehvorgang beendet werden soll.
// Begin dragging an item in a tree-view control.
// hwndTV - handle to the image list.
// lpnmtv - address of information about the item being dragged.
//
// g_fDragging -- global BOOL that specifies whether dragging is underway.
void Main_OnBeginDrag(HWND hwndTV, LPNMTREEVIEW lpnmtv)
{
HIMAGELIST himl; // handle to image list
RECT rcItem; // bounding rectangle of item
// Tell the tree-view control to create an image to use
// for dragging.
himl = TreeView_CreateDragImage(hwndTV, lpnmtv->itemNew.hItem);
// Get the bounding rectangle of the item being dragged.
TreeView_GetItemRect(hwndTV, lpnmtv->itemNew.hItem, &rcItem, TRUE);
// Start the drag operation.
ImageList_BeginDrag(himl, 0, 0, 0);
ImageList_DragEnter(hwndTV, lpnmtv->ptDrag.x, lpnmtv->ptDrag.x);
// Hide the mouse pointer, and direct mouse input to the
// parent window.
ShowCursor(FALSE);
SetCapture(GetParent(hwndTV));
g_fDragging = TRUE;
return;
}
Schritt 2: Ziehen des Strukturansichtselements
Sie ziehen ein Strukturansichtselement, indem Sie die ImageList_DragMove-Funktion aufrufen, wenn das übergeordnete Fenster eine WM_MOUSEMOVE Nachricht empfängt, wie im folgenden Beispiel gezeigt. Das Beispiel veranschaulicht außerdem, wie Treffertests während des Ziehvorgangs ausgeführt werden, um zu bestimmen, ob andere Elemente in der Strukturansicht als Ziele eines Drag-and-Drop-Vorgangs hervorgehoben werden sollen.
// Drag an item in a tree-view control,
// highlighting the item that is the target.
// hwndParent - handle to the parent window.
// hwndTV - handle to the tree-view control.
// xCur and yCur - coordinates of the mouse pointer,
// relative to the parent window.
//
// g_fDragging - global BOOL that specifies whether dragging is underway.
void Main_OnMouseMove(HWND hwndParent, HWND hwndTV, LONG xCur, LONG yCur)
{
HTREEITEM htiTarget; // Handle to target item.
TVHITTESTINFO tvht; // Hit test information.
if (g_fDragging)
{
// Drag the item to the current position of the mouse pointer.
// First convert the dialog coordinates to control coordinates.
POINT point;
point.x = xCur;
point.y = yCur;
ClientToScreen(hwndParent, &point);
ScreenToClient(hwndTV, &point);
ImageList_DragMove(point.x, point.y);
// Turn off the dragged image so the background can be refreshed.
ImageList_DragShowNolock(FALSE);
// Find out if the pointer is on the item. If it is,
// highlight the item as a drop target.
tvht.pt.x = point.x;
tvht.pt.y = point.y;
if ((htiTarget = TreeView_HitTest(hwndTV, &tvht)) != NULL)
{
TreeView_SelectDropTarget(hwndTV, htiTarget);
}
ImageList_DragShowNolock(TRUE);
}
return;
}
Schritt 3: Beenden des Ziehvorgangs für die Strukturansicht
Das folgende Beispiel zeigt, wie ein Ziehvorgang beendet wird. Die ImageList_EndDrag-Funktion wird aufgerufen, wenn das übergeordnete Fenster eine WM_LBUTTONUP Nachricht empfängt. Das Handle des Strukturansicht-Steuerelements wird an die Funktion übergeben.
// Stops dragging a tree-view item, releases the
// mouse capture, and shows the mouse pointer.
//
// g_fDragging - global BOOL that specifies whether dragging is underway.
void Main_OnLButtonUp(HWND hwndTV)
{
if (g_fDragging)
{
// Get destination item.
HTREEITEM htiDest = TreeView_GetDropHilight(hwndTV);
if (htiDest != NULL)
{
// To do: handle the actual moving of the dragged node.
}
ImageList_EndDrag();
TreeView_SelectDropTarget(hwndTV, NULL);
ReleaseCapture();
ShowCursor(TRUE);
g_fDragging = FALSE;
}
return;
}