共用方式為


使用 Visual C++ 變更 MFC 中視窗的滑鼠指標

本文介紹如何使用 Visual C++,在 MFC 中變更視窗的滑鼠指標。 本文中的資訊僅適用於 Unmanaged Visual C++ 程式代碼。

原始產品版本: Visual C++
原始 KB 編號: 131991

摘要

在以 Windows 為基礎的應用程式中,一律會根據窗口類別建立視窗。 窗口類別會根據視窗識別數個特性,包括預設滑鼠指標(游標)。 在某些情況下,應用程式可能會想要變更與它所建立之特定視窗相關聯的指標。 本文說明 MFC 應用程式可用來在不同時間顯示不同指標的三種方法。

MFC 應用程式顯示不同指標的情況

以下是您可能想要 MFC 應用程式在不同時間顯示不同指標的一些情況:

  • 當預設指標不是特定應用程式的良好用戶介面物件時。 例如,I-beam 指標比記事本中文本編輯器視窗的箭號更合適。 這可能牽涉到變更整個應用程式執行的指標。
  • 當應用程式執行冗長的作業時,例如磁碟 I/O,沙漏指標比箭號更合適。 藉由將指標變更為沙漏,您可以為使用者提供良好的視覺回饋。 這可能牽涉到在有限的時間內變更指標。

在視窗中變更滑鼠指標的三種方法

以下是應用程式在視窗中變更滑鼠指標的三種方式:

  • 方法 1:覆寫 函式 CWnd::OnSetCursor() 。 呼叫 Windows API SetCursor() 函式以變更指標。
  • 方法 2:使用所需的滑鼠指標註冊您自己的視窗類別、覆寫 函 CWnd::PreCreateWindow() 式,並使用新註冊的窗口類別來建立視窗。
  • 方法 3:若要顯示標準沙漏指標,應用程式可以呼叫 CCmdTarget::BeginWaitCursor(),以顯示沙漏,並呼叫 CmdTarget::EndWaitCursor() 以還原回預設指標。 此配置僅適用於單一訊息的持續時間。 如果在呼叫 EndWaitCursor 之前移動滑鼠,Windows 會將訊息傳送 WM_SETCURSOR 至指標下方的視窗。 此訊息的默認處理會將指標重設為默認類型、向 類別註冊的指標,因此您必須覆寫 CWnd::OnSetCursor() 該視窗的指標,並將指標重設為沙漏。

下列程式代碼範例示範如何使用三種方法來變更衍生類別視窗的 CView 滑鼠指標。

m_ChangeCursor 是類別的成員 CMyView 變數,且屬於類型 BOOL。 它指出是否需要顯示不同的指標類型。

方法 1 的程式代碼

覆寫CWnd::OnSetCursor()函式來變更物件的滑鼠指標CMyView。 使用 [類別精靈] 建立 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 技術附註 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);
}

在此範例中,在呼叫 之前,將 設定m_ChangeCursorTRUE,並在呼叫 EndWaitCursor()之後將其設定回 FALSEBeginWaitCursor()