使用 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 APISetCursor()
函式以變更指標。 - 方法 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_ChangeCursor
為 TRUE,並在呼叫 EndWaitCursor()
之後將其設定回 FALSE。BeginWaitCursor()