Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu makalede, Visual C++ kullanarak MFC'de bir pencerenin fare işaretçisini değiştirme hakkında bilgi verilmektedir. Bu makaledeki bilgiler yalnızca yönetilmeyen Visual C++ kodu için geçerlidir.
Orijinal ürün sürümü: Visual C++
Özgün KB numarası: 131991
Özet
Windows tabanlı bir uygulamada, pencere sınıfı temelinde her zaman bir pencere oluşturulur. Pencere sınıfı, varsayılan fare işaretçisi (imleç) dahil olmak üzere pencereye bağlı olarak pencerelerin çeşitli özelliklerini tanımlar. Bazı durumlarda, bir uygulama oluşturduğu belirli pencerelerle ilişkili işaretçiyi değiştirmek isteyebilir. Bu makalede, bir MFC uygulamasının farklı zamanlarda farklı işaretçileri görüntülemek için kullanabileceği üç yöntem açıklanmaktadır.
MFC uygulamalarının farklı işaretçiler gösterdiği durumlar
Bir MFC uygulamasının farklı zamanlarda farklı işaretçiler görüntülemesini isteyebileceğiniz bazı durumlar şunlardır:
- Varsayılan işaretçi belirli bir uygulama için iyi bir kullanıcı arabirimi nesnesi değilse. Örneğin, I-beam işaretçisi, Not Defteri'ndeki bir metin düzenleyicisi penceresi için oka göre daha uygundur. Bu, uygulamanın tüm çalıştırması için işaretçiyi değiştirmeyi içerebilir.
- Bir uygulama disk G/Ç gibi uzun süren bir işlem gerçekleştirdiğinde, kum saati işaretçisi oktan daha uygundur. İşaretçiyi kum saati olarak değiştirerek kullanıcıya iyi görsel geri bildirim sağlarsınız. Bu, işaretçiyi sınırlı bir süre boyunca değiştirmeyi içerebilir.
Pencerede fare işaretçisini değiştirmek için üç yöntem
Bir uygulamanın penceredeki fare işaretçisini değiştirmesinin üç yolu şunlardır:
-
Yöntem 1: işlevi geçersiz kılar
CWnd::OnSetCursor(). İşaretçiyi değiştirmek için Windows APISetCursor()işlevini çağırın. -
Yöntem 2: kendi pencere sınıfınızı istediğiniz fare işaretçisiyle kaydedin, işlevi geçersiz kılın
CWnd::PreCreateWindow()ve pencereyi oluşturmak için yeni kaydedilen pencere sınıfını kullanın. -
Yöntem 3: Standart kum saati işaretçisini göstermek için, bir uygulama kum saatini görüntüleyen öğesini çağırabilir
CCmdTarget::BeginWaitCursor()ve varsayılan işaretçiye geri dönmek için öğesini çağırabilirCmdTarget::EndWaitCursor(). Bu düzen yalnızca tek bir iletinin süresi boyunca çalışır. ÇağrısıEndWaitCursoryapılmadan önce fare taşınırsa, Windows işaretçinin altındaki pencereye birWM_SETCURSORileti gönderir. Bu iletinin varsayılan işlemesi, işaretçiyi sınıf ile kaydedilmiş olan varsayılan türe sıfırlar. Bu nedenle, bu pencere içinCWnd::OnSetCursor()'yu geçersiz kılmanız ve işaretçiyi tekrar kum saatine sıfırlamanız gerekir.
Aşağıdaki kod örnekleri, üç yöntemi kullanarak türetilmiş bir CView sınıf penceresinin fare işaretçisini nasıl değiştireceğini örnek olarak gösterir.
m_ChangeCursor sınıfının üye değişkenidir CMyView ve türündedir BOOL. Farklı bir işaretçi türünün görüntülenmesi gerekip gerekmediğini gösterir.
Yöntem 1 için kod
CMyView nesnesinin fare işaretçisini CWnd::OnSetCursor() fonksiyonunu geçersiz kılarak değiştirin. Windows iletisi CMyView::OnSetCursor() için ileti eşleme işlevini WM_SETCURSOR oluşturmak ve işlevin gövdesini aşağıdaki gibi sağlamak için Sınıf Sihirbazı'nı kullanın:
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);
}
Yöntem 2 için kod
Kendi pencere sınıfınızı, istediğiniz fare işaretçisini içerecek şekilde, AfxRegisterClass() veya AfxRegisterWndClass() işlevini kullanarak kaydedin. Ardından, kayıtlı pencere sınıfını temel alan görünüm penceresini oluşturun. MFC'de pencere sınıflarını kaydetme hakkında daha fazla bilgi için bkz. MFC Teknik Not 1'de Pencere Sınıfı Kaydı .
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)
}
Yöntem 3 için kod
Fare işaretçisini BeginWaitCursor() değiştirmek için ve EndWaitCursor() işlevlerini çağırın.
Uyarı
CWinApp::DoWaitCursor(1) ve CWinApp::DoWaitCursor(-1), sırasıyla BeginWaitCursor() ve EndWaitCursor() ile benzer şekilde çalışır.
void CMyView::PerformLengthyOperation()
{
BeginWaitCursor(); // or AfxGetApp()->DoWaitCursor(1)
//...
EndWaitCursor(); // or AfxGetApp()->DoWaitCursor(-1)
}
Eğer BeginWaitCursor() ve EndWaitCursor() çağrıları aynı işleyicide değilse, OnSetCursor aşağıdaki gibi geçersiz kılmalısınız:
BOOL CMyView::OnSetCursor(CWnd *pWnd, UINT nHitTest, UINT message)
{
if (m_ChangeCursor)
{
RestoreWaitCursor();
return TRUE;
}
return CView::OnSetCursor(pWnd, nHitTest, message);
}
Bu örnekte, m_ChangeCursor'yi TRUE olarak ayarlayın ve BeginWaitCursor() çağrısından sonra FALSE olarak geri ayarlayın.