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

本文介紹如何使用 Visual c + + 變更 MFC 中的視窗滑鼠指標。 本文中的資訊僅適用于非受管理的 Visual c + + 程式碼。

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

摘要

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

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

在下列情況下,您可能會想要讓 MFC 應用程式在不同的時間顯示不同的指標:

  • 當預設指標不是特定應用程式的正確使用者介面物件時。 例如,I 形指標比記事本中 [文字編輯器] 視窗的箭號更適合。 這可能包括變更指標以用於整個應用程式的執行。
  • 當應用程式執行冗長的作業(例如磁片 I/O)時,沙漏指標比箭號更適合。 將指標變更為沙漏,可為使用者提供良好的視覺回饋。 這可能需要在有限的時段內變更指標。

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

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

  • 方法 1:覆寫 CWnd::OnSetCursor() 函數。 呼叫 Windows API SetCursor() 函數來變更指標。
  • 方法 2:以所需的滑鼠指標註冊您自己的視窗類別、覆寫該 CWnd::PreCreateWindow() 函數,然後使用新註冊的 window 類別來建立視窗。
  • 方法 3:若要顯示標準沙漏指標,應用程式可以呼叫 CCmdTarget::BeginWaitCursor() ,它會顯示沙漏,並會 CmdTarget::EndWaitCursor() 回復回預設指標。 此模式僅適用于單一郵件的持續時間。 如果在進行呼叫之前移動滑鼠 EndWaitCursor ,Windows 就會將 WM_SETCURSOR 郵件傳送至指標下方的視窗。 此郵件的預設處理會將指標重設為預設類型的指標,該指標會以類進行註冊,所以您需要覆寫 CWnd::OnSetCursor() 該視窗,並將指標重設回沙漏。

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

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

方法1的程式碼

透過覆 CMyView 寫函數變更物件的滑鼠指標 CWnd::OnSetCursor() 。 使用類別嚮導建立 Windows 訊息的郵件對應函式功能 CMyView::OnSetCursor() WM_SETCURSOR ,並提供函數本文,如下所示:

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的程式碼

使用 or 函數,註冊您自己的視窗類別,包含所需的滑鼠指標 AfxRegisterClass() AfxRegisterWndClass() 。 然後根據已註冊的視窗類別建立 view 視窗。 如需在 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的程式碼

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

在此範例中,在 m_ChangeCursor 呼叫之前設定為TRUE BeginWaitCursor() ,並在呼叫之後將其設回FALSE EndWaitCursor()