Chapter 32

チュートリアル 28 | ドラッグ&ドロップ

Ryo Suzuki
Ryo Suzuki
2021.09.11に更新

28. ドラッグ&ドロップ

この章では、ドラッグ&ドロップされたファイルの情報を取得する方法を学びます。

28.1 ドロップされたファイルの情報を取得する

ドラッグ&ドロップされたファイルがあるかを DragDrop::HasNewFilePaths() で取得できます。この関数が true を返したら、DragDrop::GetDroppedFilePaths() を呼ぶと、そのファイルの一覧を Array<DroppedFilePath> 型で取得できます。

DroppedFilePath のメンバ変数は次の通りです。

メンバ変数 説明
FilePath path ファイルまたはディレクトリの絶対パス
Point pos ドロップされた位置(シーン座標)
uint64 timeMillisec ドロップされたタイミング (Time::GetMillisec() で計測されるアプリ起動時間)
# include <Siv3D.hpp>

void Main()
{
	while (System::Update())
	{		
		if (DragDrop::HasNewFilePaths())
		{
			for (const auto& dropped : DragDrop::GetDroppedFilePaths())
			{
				Print << dropped.path // ファイルやディレクトリの絶対パス
					<< U" @" << dropped.pos // ドロップされた座標
					<< U" :" << dropped.timeMillisec; // ドロップされたタイミング(Time::GetMillisec())
			}
		}
	}
}

28.2 ファイルのドロップを禁止する

ウィンドウにファイルをドロップできないようにするには DragDrop::AcceptFilePaths(false) を呼びます。

# include <Siv3D.hpp>

void Main()
{
	// ファイルパスのドロップを受け付けないようにする
	DragDrop::AcceptFilePaths(false);

	while (System::Update())
	{		
		// 受け付けないので何もドロップされない
		if (DragDrop::HasNewFilePaths())
		{
			for (const auto& dropped : DragDrop::GetDroppedFilePaths())
			{
				Print << dropped.path
					<< U" @" << dropped.pos
					<< U" :" << dropped.timeMillisec;
			}
		}
	}
}

28.3 ドロップされたファイルの情報を消去する

ドロップされたファイルの情報は DragDrop::GetDroppedFilePaths() を呼ぶと消去されますが、DragDrop::Clear() を使って消去することもできます。

# include <Siv3D.hpp>

void Main()
{
	while (System::Update())
	{		
		if (DragDrop::HasNewFilePaths())
		{
			// ドロップされたアイテムの情報を消去
			DragDrop::Clear();

			// 消去されているので、何も取得されない
			for (const auto& dropped : DragDrop::GetDroppedFilePaths())
			{
				Print << dropped.path
					<< U" @" << dropped.pos
					<< U" :" << dropped.timeMillisec;
			}
		}
	}
}

28.4 ドラッグ中のアイテムの情報を得る

ウィンドウ上でドラッグ中のアイテムの情報を取得するには DragDrop::DragOver() を使います。この関数は Optional<DragStatus> を返します。ドラッグ中のアイテムが無い場合は none を返します。

DragStatus のメンバ変数は次の通りです。

メンバ変数 説明
DragItemType itemType ドラッグしているアイテムの種類。DragItemType::FilePaths または DragItemType::Text
Point cursorPos ドラッグ中のカーソルの位置(シーン座標)

Siv3D はテキスト (DragItemType::Text) のドラッグ&ドロップもサポートしていますが、この章のサンプルでは扱いません。

# include <Siv3D.hpp>

void Main()
{
	const Texture icon{ 0xf15b_icon, 40 };

	while (System::Update())
	{
		// ウィンドウ上でドラッグ中のアイテムがある
		if (const auto status = DragDrop::DragOver())
		{
			if (status->itemType == DragItemType::FilePaths)
			{
				// アイコンを表示
				icon.drawAt(status->cursorPos, ColorF{ 0.5 });
			}
		}

		if (DragDrop::HasNewFilePaths())
		{
			for (const auto& dropped : DragDrop::GetDroppedFilePaths())
			{
				Print << dropped.path
					<< U" @" << dropped.pos
					<< U" :" << dropped.timeMillisec;
			}
		}
	}
}