3

ウィンドウのまばたきカーソルの形状をデフォルトの垂直 ( | ) から dos で使用されているような水平 ( _ ) に変更する方法。

それを気にする良い機能はありますか?

OS:win7

4

1 に答える 1

3

これは実際にはカーソルではなくキャレットと呼ばれます。それがおそらく混乱の元であり、解決策を探してもあまり役に立たなかった理由です。NullPonyPointer のコメントは、この一般的な混乱も反映しています。関数は確かにマウスカーソルを変更したいものですが、キャレットを変更するには機能しません。SetCursor

幸いなことに、キャレットで動作する Windows 関数のグループ全体があります: CreateCaret、、、、および. まばたき時間を操作する方法は他にもありますが、ユーザーの現在の設定 (これがデフォルトになります) に固執することをお勧めします。ShowCaretHideCaretSetCaretPosDestroyCaret

まず、背景を少し。キャレットとキャレットの使用に関する 2 つの MSDN の紹介記事を読むことを強くお勧めします。しかし、ここに簡単な要約があります: キャレットはウィンドウによって所有されています。特に、現在フォーカスがあるウィンドウ。このウィンドウは、テキスト ボックス コントロールのようなものになる可能性があります。ウィンドウがフォーカスを受け取ると、使用するキャレットを作成し、フォーカスを失うと、そのキャレットを破棄します。明らかに、これを手動で行わなければ、デフォルトの実装を受け取ります。

では、サンプルコードです。私はキャンディ マシンのインターフェイスが好きなので、関数でラップします。

bool CreateCustomCaret(HWND hWnd, int width, int height, int x, int y)
{
    // Create the caret for the control receiving the focus.
    if (!CreateCaret(hWnd,    /* handle to the window that will own the caret */
                     NULL,    /* create a solid caret using specified size    */
                     width,   /* width of caret, in logical units             */
                     height)) /* height of caret, in logical units            */
        return false;

    // Set the position of the caret in the window.
    if (!SetCaretPos(x, y))
        return false;

    // Show the caret. It will begin flashing automatically.
    if (!ShowCaret(hWnd))
        return false;

    return true;
}

次に、WM_SETFOCUSEN_SETFOCUS、または同様の通知に応答して、CreateCustomCaret関数を呼び出します。WM_KILLFOCUSEN_KILLFOCUS、または別の同様の通知に応答して、 を呼び出しますDestroyCaret()

または、CreateCustomCaretビットマップからキャレットを作成することもできます。次のオーバーロードを提供する場合があります。

bool CreateCustomCaret(HWND hWnd, HBITMAP hbmp, int x, int y)
{
    // Create the caret for the control receiving the focus.
    if (!CreateCaret(hWnd,   /* handle to the window that will own the caret   */
                     hBmp,   /* create a caret using specified bitmap          */
                     0, 0))  /* width and height parameters ignored for bitmap */
        return false;

    // Set the position of the caret in the window.
    if (!SetCaretPos(x, y))
        return false;

    // Show the caret. It will begin flashing automatically.
    if (!ShowCaret(hWnd))
        return false;

    return true;
}
于 2013-04-04T00:28:58.037 に答える