質問
仕事で開発中のマテリアル システムにドラッグ アンド ドロップ機能を実装しようとしています。このシステムの一部には、ユーザーのハード ドライブに保存されたマテリアルのグループに分割されたリポジトリとして機能する「マテリアル ライブラリ」が含まれています。
UI の改良の一環として、「ハイライト」タイプの機能を実装したいと考えていました。ドラッグ アンド ドロップすると、マテリアルを合法的にドロップできるウィンドウの色が微妙に変わり、これが有効なアクションであるというユーザーへのフィードバックが向上します。
「基本マテリアル」(CStic を使用した CWnd) のバーを、強調表示されていないときの中間の灰色の背景から、カーソルを置いたときの青色の背景に変更しています。すべて正常に動作し、OnDragEnter メッセージと OnDragExit メッセージは堅牢であるように見え、ハイライト ステータスを示すフラグを設定します。次に、OnCtrlColor でこれを実行します。
if (!m_bHighlighted) {
pDC->FillSolidRect(0, 0, m_SizeX, kGroupHeaderHeight, kBackgroundColour);
}
else {
pDC->FillSolidRect(0, 0, m_SizeX, kGroupHeaderHeight, kHighlightedBackgroundColour);
}
ただし、スクリーンショットでわかるように、ドラッグされたオブジェクトの下でペイントが「グリッチ」し、元のグレーがそのまま残ります。見た目は非常に醜く、基本的に全体の効果が台無しになります。
これを回避する方法はありますか?
解決 3
答えてくれてありがとう、ajryan、いつも私の質問に答えてくれて、本当にありがとう。
ありがたいことに、今回の答えはかなり簡単でした...
ImageList_DragShowNolock(FALSE);
m_pDragDropTargetWnd->SendMessage(WM_USER_DRAG_DROP_OBJECT_DRAG_ENTER, (WPARAM)pDragDropObject, (LPARAM)(&dragDropPoint));
ImageList_DragShowNolock(TRUE);
これにより、ドラッグされたイメージの描画がオフになり、入力中のウィンドウにメッセージが送信されて、強調表示された状態で再描画され、最後にドラッグ イメージが上に再描画されます。どうやらうまくいったようだ。
他のヒント
リモート デバッグは、視覚的な問題をデバッグするための天の恵みです。セットアップは面倒ですが、VM をリモート デバッグ用に準備しておくことは確実に効果があります。
私がやりたいのは、ペイント処理とフレームワークのペイント コード自体に大量のブレークポイントを設定することです。これにより、devenv に反転してペイントをぼかさずに効果的に「フレームをフリーズ」することができます。こうすることで、誰がどのような順序でペイントしているのか、また必要な方法で塗りつぶしを開始できる場所がどこにあるのかを正確に把握できます。
CStatic は自身を再描画する必要があることを認識していないように見えるため、ドラッグ可能なオブジェクトの背景色が残されます。CStatic を無効にしてみて、それが役立つかどうかを確認してみてはいかがでしょうか?