共用方式為


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

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

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

摘要

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

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

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

  • 當預設指標不是特定應用程式的良好用戶介面物件時。 例如,I 型波指標比 [記事本] 中文本編輯器視窗的箭號更適合。 這可能牽涉到變更整個應用程式執行的指標。
  • 當應用程式執行冗長的作業,例如磁碟 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 的程式代碼

藉由覆寫 函式來變更物件的CMyViewCWnd::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 的程式代碼

BeginWaitCursor()呼叫 和 EndWaitCursor() 函式以變更滑鼠指標。

注意事項

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