4

Win32 フォームでマウス カーソルをシミュレートしようとしています。WM_MOUSEMOVE私が持っているすべての

hCursor = LoadCursor(NULL, IDC_ARROW);
////Get device context
hDeviceContext = GetDC(hwnd);
hDCMem = CreateCompatibleDC(hDeviceContext);
hBitmap = CreateCompatibleBitmap(hDCMem, 50, 50);
hbmOld = SelectObject(hDCMem, hBitmap);
DrawIcon(hDCMem, x, y, hCursor);
SelectObject(hDCMem, hbmOld);

しかし、何も描かれていません。ただし、DC に直接描画した場合:

DrawIcon(hDeviceContext, x, y, hCursor);

カーソルは見えますが、カーソルを動かしても画像が消去されず、長い尾が残ります。

4

2 に答える 2

5

でペイントしないでください。WM_MOUSEMOVEそれWM_PAINTが目的です。基本的に、次の 3 つのメッセージを処理する必要があります。

    case WM_CREATE:
        hCursor = LoadCursor(NULL, IDC_ARROW);
        cWidth  = GetSystemMetrics(SM_CXCURSOR); // saving the cursor dimensions
        cHeight = GetSystemMetrics(SM_CYCURSOR);
    break;

    case WM_MOUSEMOVE:
        rcOld = rcNew;
        rcNew.left   = GET_X_LPARAM(lParam);     // saving the mouse coordinates
        rcNew.top    = GET_Y_LPARAM(lParam);
        rcNew.right  = rcNew.left + cWidth;
        rcNew.bottom = rcNew.top + cHeight;
        InvalidateRect(hwnd, &rcOld, TRUE);      // asking to redraw the rectangles
        InvalidateRect(hwnd, &rcNew, TRUE);
        UpdateWindow(hwnd);
    break;

    case WM_PAINT:
        hDC = BeginPaint(hwnd, &ps);
        DrawIcon(hDC, rcNew.left, rcNew.top, hCursor);
        EndPaint(hwnd, &ps);
    break;

注:「マウスカーソルをシミュレートする」とはどういう意味かわかりませんが、おそらく必要なことを行うためのより良い方法があるかもしれません. 機能SetCursor()と を確認してくださいSetWindowLongPtr() with GCL_HCURSOR

于 2012-08-24T15:56:26.557 に答える
3

それが価値があるもののために:

検討する価値のある別のアプローチは、WS_EX_TOPMOST| を使用することです。WS_EX_LAYEREDウィンドウを必要に応じて移動し、Windows に描画/透明度を処理させます。これには、描画メイン ウィンドウをまったく妨げないという利点があり、メイン ウィンドウに子コントロールなどがある場合でも機能します。

また、「マウスポインター」がウィンドウの「端にぶら下がる」こともできます。マウスが一番右下のピクセルを指すように配置されている場合、通常のマウス ポインターの尾と矢印がフレームとその背後にある他のウィンドウの上にあり、独自のウィンドウのクライアント領域を描画するだけではこれを行うことができません。 .

--

そうは言っても、マウスの位置を「偽造」することがここで適切なことかどうかはわかりませんが、それでうまくいくかもしれません。もう 1 つの方法は、マウスを通常どおりに動作させることですが、より高い解像度が必要なアプリの場合は、より正確な値を公開する別の API を用意してください。通常のマウス/キーボード メッセージと API に加えて、Windows には、入力情報を取得したり、追加の入力デバイスを定義したり、メッセージに追加情報を関連付けたりするためのさまざまな手法と API (例: Raw Input ) もあり、それらの手法の 1 つがここではより適切です。もう一度質問する価値はあるかもしれませんが、カーソルの描画ではなく、より高いレベルに焦点を当ててください。

于 2012-08-26T07:40:36.853 に答える