3

説明するのはかなり難しい問題ですが、最善を尽くします。win32GUIベースのアプリケーションにカスタムドラッグアンドドロップ実装を作成しました。プログラムの制限により、適切なOLEドラッグアンドドロップメカニズムを使用できません。それは大丈夫です、私はマウスキートラッキングで自分で作りました、そしてそれはとてもうまくいきます。私が今解決できない唯一の問題は、血まみれの無効な(スラッシュの付いた円)-IDC_NOカーソルです。

私のウィンドウはドロップできないと判断し、何かがドロップしようとするとカーソルを無効に変更します。私はそれを変えるためにすべてを試みました、しかしそれはそこにとどまるように主張します。

case WM_SETCURSOR:
{
    //SetSystemCursor(CopyCursor(LoadCursor(NULL, IDC_CROSS)), 32648);
    //DestroyCursor();
    SetCursor(LoadCursor(NULL, IDC_CROSS));
    SetWindowLong(hwnd, DWL_MSGRESULT, TRUE);
    return TRUE;
}
break;

コールバック関数を呼び出すたびに実行されるメッセージ交換の外側のアイコンを変更しようとさえしました。少しは機能しましたが、うまくいきませんでした。IDC_CROSSカーソルに設定しているようですが、IDC_NOに戻ります。

この無効なカーソルを取り除くにはどうすればよいですか?IDC_CROSSに設定したい。

または、OLEまたはMFCクラスを使用せずにドラッグアンドドロップを実装して、アプリケーションをドロップ可能にし、無効なカーソルを表示しないようにするにはどうすればよいですか。

かなり複雑ですが、私の質問を読んでも、お時間をいただきありがとうございます;)

4

3 に答える 3

2

カスタムアイコンを描くことができます。これを試して:

ScreenToClient(hwnd, &point);

RECT clearRect;
clearRect.left = point.x - 128;
clearRect.top = point.y - 128;
clearRect.right = point.x + 128;
clearRect.bottom = point.y + 128;
InvalidateRect(hwnd, &clearRect, TRUE);

UpdateWindow(hwnd);

DrawIcon(GetDC(hwnd), point.x, point.y, LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(YOUR_RESOURCE_ID)));
于 2011-11-23T15:34:16.400 に答える
1

あなたはこれで間違った方向に進んでいます。D + Dの進行中は、カーソルの形状はWM_SETCURSORによって制御されなくなりますウィンドウが「ドロップしても大丈夫」というフィードバックを与えると、COMが引き継ぎ、形状を変更します。これはおそらくあなたのコードに欠けているものです。

'OLE'またはそれを容易にするMFCラッパーをバイパスすることはできません。ドラッグのソースはそれを使用します。IDropTarget :: DragEnterを検索して、正しく取得します。クラスラッパーを使用することは確かに最良のアプローチであり、自分でそれを正しくすることはそれほど簡単ではありません。

于 2010-09-01T14:08:07.847 に答える
1

ドラッグされたファイルを受け入れるようにウィンドウを登録していDragAcceptFilesますか?(http://msdn.microsoft.com/en-us/library/bb776406%28VS.85%29.aspx)OLEに入らずに非常に基本的なドラッグドロップ機能を取得するのに便利ですが、それほど汎用性はありません。 、WM_DROPFILESマウスボタンを離した後にのみメッセージが表示されるためです。

于 2010-09-01T23:25:07.253 に答える