Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu konu, ağaç görünümü öğelerinin sürüklenip bırakılmasını işleyen kodu göstermektedir. Örnek kod üç işlevden oluşur. İlk işlev sürükleme işlemini başlatır, ikinci işlev görüntüyü sürükler ve üçüncü işlev sürükleme işlemini sonlandırır.
Not
Ağaç görünümü öğesini sürüklemek genellikle TVN_BEGINDRAG (veya TVN_BEGINRDRAG) bildirim kodunu, WM_MOUSEMOVE iletisini ve WM_LBUTTONUP (veya WM_RBUTTONUP) iletisini işlemeyi içerir. Öğenin sürüklenirken çizilmesi için ayrıca Görüntü Listeleri işlevlerinin kullanılmasını da içerir.
Bilmeniz gerekenler
Teknolojileri
Önkoşullar
- C/C++
- Windows Kullanıcı Arabirimi Programlama
Talimatlar
1. Adım: Ağaç görünümü sürükleme işlemini başlatın
Ağaç görünümü denetimi, kullanıcı bir öğeyi sürüklemeye başladığında üst pencereye bir TVN_BEGINDRAG (veya TVN_BEGINRDRAG) bildirim kodu gönderir. Ebeveyn pencere, lParam parametresi NMTREEVIEW yapısının adresi olan bir WM_NOTIFY iletisi biçiminde bildirim alır. Bu yapının üyeleri, fare işaretçisinin ekran koordinatlarını ve sürüklenecek öğe hakkında bilgi içeren TVITEM yapısını içerir.
Aşağıdaki örnekte, TVN_BEGINDRAGalmak için WM_NOTIFY iletisinin nasıl işlendiği gösterilmektedir.
case WM_NOTIFY:
switch (((LPNMHDR)lParam)->code)
{
case TVN_BEGINDRAG:
Main_OnBeginDrag(((LPNMHDR)lParam)->hwndFrom, (LPNMTREEVIEW)lParam);
break;
// Handle other cases here.
}
break;
Sürükleme işleminin başlatılması, ImageList_BeginDrag işlevinin kullanılmasını içerir. İşlevin parametreleri, sürükleme işlemi sırasında kullanılacak görüntüyü içeren görüntü listesinin tutamacı ve görüntünün dizinini içerir. Kendi görüntü listenizi ve görüntünüzü sağlayabilir veya TVM_CREATEDRAGIMAGE iletisini kullanarak ağaç görünümü denetiminin bunları sizin için oluşturmasını sağlayabilirsiniz.
Sürükleme görüntüsü, sürükleme işlemi süresi boyunca fare işaretçisinin yerini alır, bu yüzden ImageList_BeginDrag, görüntü içerisinde bir sıcak nokta belirtmenizi gerektirir. Etkin noktanın koordinatları görüntünün sol üst köşesine göredir. ImageList_BeginDrag, sürükleme görüntüsünün ilk konumunu belirtmenizi de gerektirir. Bir uygulama genellikle başlangıç konumunu, sürükleme imgesinin sıcak noktasının, kullanıcı sürükleme işlemine başladığı sırada fare işaretçisine karşılık gelen konumuyla ayarlar.
Aşağıdaki işlev, ağaç görünümü öğesini sürüklemeye nasıl başlayacağını gösterir. Ağaç görünümü denetimi tarafından sağlanan sürükleme çizimini kullanır ve sıcak nokta için uygun noktayı belirlemek amacıyla öğenin sınırlayıcı dikdörtgenini elde eder. Sınırlayıcı dikdörtgenin boyutları, görüntünün boyutlarıyla aynıdır.
İşlev fare girişini yakalar ve fare iletilerinin üst pencereye gönderilmesine neden olur. Üst pencere, görüntünün nereye sürükleneceğini belirlemek için sonraki WM_MOUSEMOVE iletilerine ve sürükleme işleminin ne zaman biteceğini belirlemek için WM_LBUTTONUP iletisine ihtiyaç duyar.
// 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;
}
2. Adım: Ağaç görünümü öğesini sürükleme
Aşağıdaki örnekte gösterildiği gibi, üst pencere bir WM_MOUSEMOVE iletisi aldığında ImageList_DragMove işlevini çağırarak ağaç görünümü öğesini sürüklersiniz. Örnek ayrıca sürükle ve bırak işleminin hedefleri olarak ağaç görünümündeki diğer öğelerin vurgulanıp vurgulanmayacağını belirlemek için sürükleme işlemi sırasında isabet testinin nasıl gerçekleştirileceğini gösterir.
// 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;
}
3. Adım: Ağaç görünümü sürükleme işlemini sonlandırma
Aşağıdaki örnekte bir sürükleme işleminin nasıl sonlandırılası gösterilmektedir. Ana pencere bir WM_LBUTTONUP iletisi aldığında ImageList_EndDrag işlevi çağrılır. Ağaç görünümü denetiminin tutamacı işleve geçirilir.
// 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;
}
İlgili konular
- Tree-View Denetimlerini Kullanma