Share via


Ziehen eines Tree-View Elements

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). Dies umfasst auch die Verwendung der Bildlistenfunktionen , um das Element zu zeichnen, während es gezogen wird.

 

Wichtige Informationen

Technologien

Voraussetzungen

  • C/C++
  • Programmierung der Windows-Benutzeroberfläche

Anweisungen

Schritt 1: Starten des Ziehvorgangs für die Strukturansicht

Ein Strukturansichtssteuerelement sendet dem übergeordneten Fenster einen TVN_BEGINDRAG (oder TVN_BEGINRDRAG) Benachrichtigungscode, wenn der Benutzer beginnt, ein Element zu ziehen. 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 über das zu ziehende Element enthält.

Das folgende Beispiel zeigt, wie sie die WM_NOTIFY-Nachricht verarbeiten, um TVN_BEGINDRAG zu erhalten.

    case WM_NOTIFY: 
        switch (((LPNMHDR)lParam)->code) 
        {
            case TVN_BEGINDRAG:
                Main_OnBeginDrag(((LPNMHDR)lParam)->hwndFrom, (LPNMTREEVIEW)lParam);
                break;
        
            // Handle other cases here. 
        }
        break; 

Das Starten des Ziehvorgangs umfasst die Verwendung der ImageList_BeginDrag-Funktion . Die Parameter der Funktion umfassen den Handle für die Bildliste, die das bild enthält, das während des Ziehvorgangs verwendet werden soll, und den Index des Bilds. Sie können entweder Eine eigene Bildliste und ein eigenes Image bereitstellen, oder Sie können diese mithilfe der TVM_CREATEDRAGIMAGE Nachricht vom Strukturansichtssteuerelement erstellen lassen.

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 linken oberen Ecke des Bilds. ImageList_BeginDrag müssen Sie auch die anfängliche Position des Bilds zum Ziehen angeben. Eine Anwendung legt in der Regel die Anfangsposition so fest, dass der Hotspot des Ziehbilds dem des Mauszeigers zum Zeitpunkt entspricht, an dem der Benutzer mit dem Ziehvorgang begonnen 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 sind identisch mit denen des Bilds.

Die Funktion erfasst Mauseingaben, sodass 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 zeigt auch, wie Sie während des Ziehvorgangs Treffertests durchführen, 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 Vorgangs zum Ziehen der Strukturansicht

Das folgende Beispiel zeigt, wie sie einen Ziehvorgang beenden. Die ImageList_EndDrag-Funktion wird aufgerufen, wenn das übergeordnete Fenster eine WM_LBUTTONUP Nachricht empfängt. Das Handle des Strukturansichtssteuerelements 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; 
} 

Verwenden von Tree-View-Steuerelementen

CustDTv-Beispiel veranschaulicht benutzerdefiniertes Zeichnen in einem Tree-View-Steuerelement