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 APISetCursor()
関数を呼び出してポインターを変更します。 -
方法 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()
呼び出した後に FALSE にEndWaitCursor()
戻します。