0

仕事で開発中のマテリアル システムにドラッグ アンド ドロップ機能を実装しようとしています。このシステムの一部には、ユーザーのハード ドライブに保存されたマテリアルのグループに分割されたリポジトリとして機能する「マテリアル ライブラリ」が含まれています。

UI の改良の一環として、「ハイライト」タイプの機能を実装したいと考えていました。ドラッグ アンド ドロップ時に、合法的にマテリアルをドロップできるウィンドウの色が非常に微妙に変化し、これが有効なアクションであるというユーザーへのフィードバックを改善します。

「基本マテリアル」(CStatic を使用した単なる CWnd) を含むバーを、ハイライトされていないときの中間の灰色の背景から、ホバーしたときの青色の背景に変更しています。すべてうまく機能し、OnDragEnter および OnDragExit メッセージは堅牢に見え、ハイライト ステータスを示すフラグを設定します。次に、OnCtrlColor でこれを行います。

    if (!m_bHighlighted) {
    pDC->FillSolidRect(0, 0, m_SizeX, kGroupHeaderHeight, kBackgroundColour);
}
else {
    pDC->FillSolidRect(0, 0, m_SizeX, kGroupHeaderHeight, kHighlightedBackgroundColour);
}

ただし、スクリーンショットでわかるように、ドラッグされたオブジェクトの下でペイントが「グリッチ」し、元のグレーがそのまま残ります。それは本当に醜く見え、基本的に全体の効果を台無しにします.

これを回避する方法はありますか?

4

3 に答える 3

1

リモート デバッグは、視覚的な問題をデバッグするための天の恵みです。セットアップは面倒ですが、VM をリモート デバッグ用に準備しておくと、確実に成果が得られます。

私が好きなことは、フレームワークのペイント コード自体だけでなく、ペイント処理にも大量のブレークポイントを設定することです。これにより、devenv にフリップして絵を壊すことなく、絵を効果的に「フレームを固定」することができます。このようにして、誰がどの順序でペイントしているか、必要な方法で塗りつぶしを中断するチャンスがある場所を正確に把握できます。

于 2008-09-16T22:03:43.850 に答える
0

答えてくれてありがとう、ajryan、あなたはいつも私の質問の助けを思いついているようですので、特別な感謝を。

ありがたいことに、今回の答えはかなり簡単でした。

ImageList_DragShowNolock(FALSE);
m_pDragDropTargetWnd->SendMessage(WM_USER_DRAG_DROP_OBJECT_DRAG_ENTER, (WPARAM)pDragDropObject, (LPARAM)(&dragDropPoint));
ImageList_DragShowNolock(TRUE);

これにより、ドラッグされた画像の描画がオフになり、入力中のウィンドウにメッセージが送信され、強調表示された状態で再描画され、最後にドラッグ画像が上に再描画されます。トリックをしたようです。

于 2008-09-17T10:05:47.687 に答える
0

CStatic は自分自身を再描画する必要があることを認識していないように見えるため、ドラッグ可能なオブジェクトの背景色が取り残されています。おそらく、CStatic を無効にしてみて、それがまったく役立つかどうかを確認してください。

于 2008-09-16T16:55:11.530 に答える