次の方法で共有


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 はクラスのメンバー変数 CMyViewBOOL型です。 これは、別のポインター型を表示する必要があるかどうかを示します。

メソッド 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 のコード

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

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 のコード

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

Note

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);
}

この例では、BeginWaitCursor()の呼び出しの直前にm_ChangeCursorTRUE に設定し、EndWaitCursor()の呼び出しの後FALSE に戻します。