1

この TCanvas を使用して、マウスのカーソルを描画しています

Canv := TCanvas.Create;
Canv.Handle := GetWindowDC(0);

....すべてのマウスイベントに対して、次のことを行います

Bitmap:=TBitmap.Create;
CursorInfo.cbSize := sizeof(CursorInfo);
GetCursorInfo(CursorInfo);

Bitmap.Width := 32;
Bitmap.Height := 32;
Bitmap.Transparent:=true;

DrawIconEx(Bitmap.Canvas.Handle, 0,0, CursorInfo.hCursor, 32,32, 0,0, DI_NORMAL) ;

Bitmap.Canvas.Brush.Color := RGB(250,250,250);
Bitmap.Canvas.FloodFill(31,0, clWhite, fsSurface);
Bitmap.Canvas.FloodFill(0,0, clWhite, fsSurface);

currentX:=getcurrentxpos;
currentY:=getcurrentypos;

Canv.Draw(currentX,currentY,Bitmap);
Bitmap.Free;

問題は、個々のカーソルを表示するだけでなく、マウスの軌跡を作ることです。マウスが動くたびにキャンバス全体をクリアできますか? (しかし、良い考えのようには聞こえません)。たぶんCanv.Draw、そのコードの逆を実行することで以前をクリアできますか(可能であれば)?カーソルを表示する方法について何か提案はありますか?

Canv.Draw(currentX,currentY,Bitmap);編集:ビットマップの幅と高さを設定した直後に別のものを挿入しようとしました...そして今、問題は(マウスの軌跡ではなく)白い軌跡があり、はるかにきれいですが、まだ良くありません。

4

3 に答える 3

4

あなたはデスクトップを利用していますが、信頼性が低いため、絶対にやるべきではありません。私が理解しているように、あなたはデスクトップ上でマウスカーソルをペイントする方法を見つけたいと思っています。マウスが再び動いたら、最後のペイントを「元に戻し」、新しい座標でマウスを再ペイントします。これを想像してみてください。マウスをメモボックスのどこかに移動し、手をキーボードに移動し、何かを入力してから、もう一度マウスを移動します。マウスの下の画像が変わりました!

できること:マウスカーソルの形をしたフォームを作成します。これを行うための既知の手法があります。疑似カーソルを上に置いたままにします(Windowsは上にとどまることが好きではなくなったため、これについても少し問題が発生します)。これは簡単なことではありませんが、管理しやすく、ルールに従ってプレイしています。


私はそれが間違いだと思うものを見つけたので、あなたがこれまでに得たものについての少しのコードレビュー、そしてあなたは知っておくべきです。これを修正するだけでは問題を修正するのに十分ではありません。デスクトップへの描画を停止する必要があります。

透明なカーソル画像を保持しているビットマップを解放しないでください。アプリケーションの存続期間中は保持してください。RAMとCPUの両方を節約できます。これは、マウスの動きに反応する必要があるものでは重要です。

于 2010-07-12T08:08:31.260 に答える
2

以前に提案した方法とは異なる方法を 1 つ紹介します。一時的な
キャンバスを使用してキャンバスを保存します。Canvas.CopyRectマウスが最初にキャンバス上に置かれたとき。
次に、マウスを動かしたら、まず一時キャンバスを目的のキャンバスにコピーしてから、カーソルを描画します。

于 2010-07-12T07:04:04.683 に答える
1

参照イメージ (マウス カーソルがペイントされていない場合のキャンバスの外観) を用意し、それを一時ビットマップにコピーしてから、その一時ビットマップにカーソルを描画します。最後に、キャンバスにイメージを描きます。

また、より複雑な一時オーバーレイを非常に簡単に作成することもできます。Z オーダーに従って参照ビットマップの上にオーバーレイを描画するだけです。背景に触れていないので、ゴーストのクリアについて心配する必要はありません。

于 2010-07-12T08:00:48.337 に答える