このトピックでは、画面上で画像をドラッグする方法について説明します。 ドラッグ関数により、画像はカラーで滑らかに、カーソルが点滅することなく移動します。 マスクされた画像とマスクされていない画像のどちらでもドラッグできます。
知っておくべきこと
テクノロジ
前提条件
- C/C++
- Windows ユーザー インターフェイス プログラミング
手順
手順 1: ドラッグ操作を開始します。
ImageList_BeginDrag 関数を使用して、ドラッグ操作を開始します。
次の C++ コード例のユーザー定義関数は、WM_LBUTTONDOWN などのマウス ボタン押下メッセージに応答して呼び出されることを意図しています。 この関数は、ユーザーが画像の四角形領域内をクリックしたかどうかを判別します。 ユーザーがクリックした場合、関数はマウス入力をキャプチャし、クライアント領域から画像を消去して、画像内のホット スポットの位置を計算します。 関数は、マウス カーソルのホット スポットと一致するようにホット スポットを設定します。 次に、この関数は ImageList_BeginDrag を呼び出すことでドラッグ操作を開始します。
// StartDragging - begins dragging a bitmap.
// Returns TRUE if successful, or FALSE otherwise.
// hwnd - handle to the window in which the bitmap is dragged.
// ptCur - coordinates of the cursor.
// himl - handle to the image list.
//
// Global variables
// g_rcImage - bounding rectangle of the image to drag.
// g_nImage - index of the image.
// g_ptHotSpot - location of the image's hot spot.
// g_cxBorder and g_cyBorder - width and height of border.
// g_cyCaption and g_cyMenu - height of title bar and menu bar.
extern RECT g_rcImage;
extern int g_nImage;
extern POINT g_ptHotSpot;
BOOL StartDragging(HWND hwnd, POINT ptCur, HIMAGELIST himl)
{
// Return if the cursor is not in the bounding rectangle of
// the image.
if (!PtInRect(&g_rcImage, ptCur))
return FALSE;
// Capture the mouse input.
SetCapture(hwnd);
// Erase the image from the client area.
InvalidateRect(hwnd, &g_rcImage, TRUE);
UpdateWindow(hwnd);
// Calculate the location of the hot spot, and save it.
g_ptHotSpot.x = ptCur.x - g_rcImage.left;
g_ptHotSpot.y = ptCur.y - g_rcImage.top;
// Begin the drag operation.
if (!ImageList_BeginDrag(himl, g_nImage,
g_ptHotSpot.x, g_ptHotSpot.y))
return FALSE;
// Set the initial location of the image, and make it visible.
// Because the ImageList_DragEnter function expects coordinates to
// be relative to the upper-left corner of the given window, the
// width of the border, title bar, and menu bar need to be taken
// into account.
ImageList_DragEnter(hwnd, ptCur.x + g_cxBorder,
ptCur.y + g_cyBorder + g_cyCaption + g_cyMenu);
g_fDragging = TRUE;
return TRUE;
}
手順 2: イメージを移動します。
ImageList_DragMove 関数は、画像を新しい位置に移動します。
次の C++ コード例のユーザー定義関数は、WM_MOUSEMOVE メッセージに応答して呼び出されることを意図しています。 この関数は、画像を新しい場所にドラッグします。
// MoveTheImage - drags an image to the specified coordinates.
// Returns TRUE if successful, or FALSE otherwise.
// ptCur - new coordinates for the image.
BOOL MoveTheImage(POINT ptCur)
{
if (!ImageList_DragMove(ptCur.x, ptCur.y))
return FALSE;
return TRUE;
}
手順 3: ドラッグ操作を終了します。
次の C++ コード例のユーザー定義関数は、ImageList_EndDrag 関数を呼び出して、ドラッグ操作を終了します。 次に、ImageList_DragLeave 関数を呼び出して、ウィンドウのロックを解除し、ドラッグ画像を非表示にして、ウィンドウが更新されるようにします。
// StopDragging - ends a drag operation and draws the image
// at its final location.
// Returns TRUE if successful, or FALSE otherwise.
// hwnd - handle to the window in which the bitmap is dragged.
// himl - handle to the image list.
// ptCur - coordinates of the cursor.
//
// Global variable
// g_ptHotSpot - location of the image's hot spot.
extern POINT g_ptHotSpot;
BOOL StopDragging(HWND hwnd, HIMAGELIST himl, POINT ptCur)
{
ImageList_EndDrag();
ImageList_DragLeave(hwnd);
g_fDragging = FALSE;
DrawTheImage(hwnd, himl, ptCur.x - g_ptHotSpot.x,
ptCur.y - g_ptHotSpot.y);
ReleaseCapture();
return TRUE;
}
関連トピック