次の方法で共有


Visual C++ を使用して MFC のウィンドウのマウス ポインターを変更する

この記事では、Visual C++ を使用して MFC のウィンドウのマウス ポインターを変更する方法について説明します。 この記事の情報は、アンマネージド Visual C++ コードにのみ適用されます。

元の製品バージョン: Visual C++
元の KB 番号: 131991

概要

Windows ベースのアプリケーションでは、ウィンドウ は常にウィンドウ クラスに基づいて作成されます。 ウィンドウ クラスは、既定のマウス ポインター (カーソル) など、それに基づいてウィンドウのいくつかの特性を識別します。 場合によっては、アプリケーションが作成する特定のウィンドウに関連付けられているポインターを変更したい場合があります。 この記事では、MFC アプリケーションで異なるポインターを異なる時刻に表示するために使用できる 3 つの方法について説明します。

MFC アプリケーションが異なるポインターを表示する状況

MFC アプリケーションで異なるポインターを異なるタイミングで表示したい場合は、次のような状況があります。

  • 既定のポインターが特定のアプリケーションに適したユーザー インターフェイス オブジェクトでない場合。 たとえば、I ビーム ポインターは、NotePad のテキスト エディター ウィンドウの矢印よりも適しています。 これには、アプリケーションの実行全体のポインターを変更する必要があります。
  • アプリケーションがディスク I/O などの長い操作を実行する場合は、矢印よりも砂時計ポインターが適しています。 砂時計へのポインターを変更することで、ユーザーに適切な視覚的フィードバックを提供できます。 これには、ポインターを一定期間変更する必要があります。

ウィンドウでマウス ポインターを変更する 3 つの方法

アプリケーションがウィンドウ内のマウス ポインターを変更する 3 つの方法を次に示します。

  • 方法 1: 関数をオーバーライドします CWnd::OnSetCursor() 。 Windows API SetCursor() 関数を呼び出してポインターを変更します。
  • 方法 2: 目的のマウス ポインターで独自のウィンドウ クラスを登録し、関数を CWnd::PreCreateWindow() オーバーライドし、新しく登録されたウィンドウ クラスを使用してウィンドウを作成します。
  • 方法 3: 標準の砂時計ポインターを表示するには、 を呼び出して砂時計を表示し、 を呼び出CCmdTarget::BeginWaitCursor()CmdTarget::EndWaitCursor()して既定のポインターに戻します。 このスキームは、1 つのメッセージの期間中にのみ機能します。 への呼び出しが行われる前に EndWaitCursor マウスを移動した場合、Windows はポインターの下のウィンドウにメッセージを送信 WM_SETCURSOR します。 このメッセージの既定の処理では、クラスに登録されている既定の型へのポインターがリセットされるため、そのウィンドウをオーバーライド CWnd::OnSetCursor() し、ポインターを砂時計にリセットする必要があります。

次のコード サンプルは、3 つのメソッドを使用して派生クラス ウィンドウのマウス ポインターを CView 変更する方法の例を示しています。

m_ChangeCursor は クラスの CMyView メンバー変数で、型 BOOLは です。 別のポインター型を表示する必要があるかどうかを示します。

メソッド 1 のコード

関数をオーバーライドして、オブジェクトの CMyView マウス ポインターを CWnd::OnSetCursor() 変更します。 クラス ウィザードを使用して、Windows メッセージWM_SETCURSORのメッセージ マップ関数CMyView::OnSetCursor()を確立し、関数の本文を次のように指定します。

BOOL CMyView::OnSetCursor(CWnd *pWnd, UINT nHitTest, UINT message)
{
    if (m_ChangeCursor)
    {
        ::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
        return TRUE;
    }
    return CView::OnSetCursor(pWnd, nHitTest, message);
}

メソッド 2 のコード

または AfxRegisterWndClass() 関数を使用して、目的のマウス ポインターを含む独自のウィンドウ クラスをAfxRegisterClass()登録します。 次に、登録されたウィンドウ クラスに基づいてビュー ウィンドウを作成します。 MFC でのウィンドウ クラスの登録の詳細については、「MFC Tech Note 1 での ウィンドウ クラスの登録 」を参照してください。

BOOL CMyView::PreCreateWindow(CREATESTRUCT &cs)
{
    cs.lpszClass = AfxRegisterWndClass(
        CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW, // use any window styles
        AfxGetApp()->LoadStandardCursor(IDC_WAIT),
        (HBRUSH)(COLOR_WINDOW + 1)); // background brush
    return CView::PreCreateWindow(cs)
}

メソッド 3 のコード

EndWaitCursor() 関数をBeginWaitCursor()呼び出して、マウス ポインターを変更します。

注:

CWinApp::DoWaitCursor(1)CWinApp::DoWaitCursor(-1) 同様にBeginWaitCursor()EndWaitCursor()動作します。

void CMyView::PerformLengthyOperation()
{
    BeginWaitCursor(); // or AfxGetApp()->DoWaitCursor(1)
    //...
    EndWaitCursor(); // or AfxGetApp()->DoWaitCursor(-1)
}

と の BeginWaitCursor() 呼び出し EndWaitCursor() が同じハンドラーにない場合は、次のようにオーバーライド OnSetCursor する必要があります。

BOOL CMyView::OnSetCursor(CWnd *pWnd, UINT nHitTest, UINT message)
{
    if (m_ChangeCursor)
    {
        RestoreWaitCursor();
        return TRUE;
    }
    return CView::OnSetCursor(pWnd, nHitTest, message);
}

この例では、 を 呼び出す直前に TRUE に設定m_ChangeCursorし、 を にBeginWaitCursor()呼び出した後に FALSEEndWaitCursor()戻します。