使用 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 的程式代碼
藉由覆寫 函式來變更物件的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 的程式代碼
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_ChangeCursor
為 TRUE,並在呼叫 EndWaitCursor()
之後將其設回 FALSE。