Visual C++ kullanarak MFC'de bir pencerenin fare işaretçisini değiştirme
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ına göre her zaman bir pencere oluşturulur. Pencere sınıfı, varsayılan fare işaretçisi (imleç) dahil olmak üzere buna 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çileri görüntülediği durumlar
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üzenleyici penceresi için oka göre daha uygundur. Bu, uygulamanın tüm çalıştırması için işaretçinin değiştirilmesini içerebilir.
- Bir uygulama disk G/Ç gibi uzun 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çinin sınırlı bir süre boyunca değiştirilmesini 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ılın
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 çağrısıCmdTarget::EndWaitCursor()
yapabilir. Bu düzen yalnızca tek bir iletinin süresi boyunca çalışır. Fare çağrısıEndWaitCursor
yapılmadan önce taşınırsa, Windows işaretçinin altındaki pencereye birWM_SETCURSOR
ileti gönderir. Bu iletinin varsayılan işlemesi, işaretçiyi sınıfına kayıtlı olan varsayılan türe sıfırlar, bu nedenle bu pencere için geçersiz kılmanızCWnd::OnSetCursor()
ve işaretçiyi kum saati olarak sıfırlamanız gerekir.
Aşağıdaki kod örnekleri, üç yöntemi kullanarak türetilmiş bir CView
sınıf penceresinin fare işaretçisinin nasıl değiştireceğini örnek olarak gösterir.
m_ChangeCursor
sınıfının bir ü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
İşlevi geçersiz kılarak CWnd::OnSetCursor()
nesnenin CMyView
fare işaretçisini değiştirin. Windows iletisi WM_SETCURSOR
için ileti eşleme işlevini CMyView::OnSetCursor()
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);
}
2 yöntemi için kod
veya AfxRegisterWndClass()
işlevini kullanarak AfxRegisterClass()
istenen fare işaretçisini içeren kendi pencere sınıfınızı 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 Tech Note 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.
Not
CWinApp::DoWaitCursor(1)
ve CWinApp::DoWaitCursor(-1)
sırasıyla ve EndWaitCursor()
ile BeginWaitCursor()
benzer şekilde çalışın.
void CMyView::PerformLengthyOperation()
{
BeginWaitCursor(); // or AfxGetApp()->DoWaitCursor(1)
//...
EndWaitCursor(); // or AfxGetApp()->DoWaitCursor(-1)
}
ve EndWaitCursor()
çağrıları BeginWaitCursor()
aynı işleyicide değilse, aşağıdaki gibi geçersiz kılmanız OnSetCursor
gerekir:
BOOL CMyView::OnSetCursor(CWnd *pWnd, UINT nHitTest, UINT message)
{
if (m_ChangeCursor)
{
RestoreWaitCursor();
return TRUE;
}
return CView::OnSetCursor(pWnd, nHitTest, message);
}
Bu örnekte, çağrısından hemen önce TRUE olarak ayarlayın m_ChangeCursor
ve çağrısından BeginWaitCursor()
EndWaitCursor()
sonra false olarak ayarlayın.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin