Aracılığıyla paylaş


Fare Tıklamalarına Yanıt Verme

kullanıcı, imleç bir pencerenin istemci alanının üzerindeyken fare düğmesine tıklarsa, pencere aşağıdaki iletilerden birini alır.

İleti Anlam
WM_LBUTTONDOWN Sol düğme aşağı
WM_LBUTTONUP Sol düğme yukarı
WM_MBUTTONDOWN Orta düğme aşağı
WM_MBUTTONUP Orta düğme yukarı
WM_RBUTTONDOWN Sağ düğme aşağı
WM_RBUTTONUP Sağ düğme yukarı
WM_XBUTTONDOWN XBUTTON1 veya XBUTTON2 basılı
WM_XBUTTONUP XBUTTON1 veya XBUTTON2 yukarı

 

İstemci alanının pencerenin çerçevesiz bölümü olduğunu hatırlayın. İstemci alanları hakkında daha fazla bilgi için bkz. Pencere Nedir?

Fare Koordinatları

Bu iletilerin tümlerinde lParam parametresi, fare işaretçisinin x ve y koordinatlarını içerir. en düşük 16 bit lParam x koordinatını, sonraki 16 bit ise y koordinatını içerir. lParamkoordinatlarını açmak için GET_X_LPARAM ve GET_Y_LPARAM makrolarını kullanın.

int xPos = GET_X_LPARAM(lParam); 
int yPos = GET_Y_LPARAM(lParam);

Bu makrolar WindowsX.h üst bilgi dosyasında tanımlanır.

64 bit Windows'ta lParam 64 bit değerdir. lParam'ın üst 32 biti kullanılmaz. Windows belgelerinde "düşük sıralı sözcük" ve "yüksek sıralı sözcük" ifadeleri lParam için geçtiğinde, 64-bitlik durumda bu, alt 32 bitin düşük ve yüksek sıralı sözcükleri anlamına gelir. Makrolar doğru değerleri ayıklar, bu nedenle bunları kullanırsanız güvende olursunuz.

Fare koordinatları cihazdan bağımsız piksellerle (DIP) değil piksel cinsinden verilir ve pencerenin istemci alanına göre ölçülür. Koordinatlar imzalı değerlerdir. İstemci alanının üstündeki ve solundaki konumların negatif koordinatları vardır. Bu, farenin pencerenin dışındaki konumunu izlemeniz durumunda önemlidir. Bunu daha sonraki bir konu başlığında göreceğiz, Pencere Dışında Fare Hareketini Yakalama.

Ek Bayraklar

wParam parametresi, diğer fare düğmelerinin ve SHIFT ve CTRL tuşlarının durumunu gösteren bit düzeyinde bir VEYA bayrak içerir.

Bayrak Anlam
MK_CONTROL CTRL tuşu çalışmıyor.
MK_LBUTTON Sol fare düğmesi çalışmıyor.
MK_MBUTTON Ortadaki fare düğmesi çalışmıyor.
MK_RBUTTON Sağ fare düğmesi çalışmıyor.
MK_SHIFT SHIFT tuşu çalışmıyor.
MK_XBUTTON1 XBUTTON1 düğmesi çalışmıyor.
MK_XBUTTON2 XBUTTON2 düğmesi çalışmıyor.

 

Bayrağın olmaması, ilgili düğmeye veya tuşa basılmadığını gösterir. Örneğin, CTRL tuşunun basılı olup olmadığını test etmek için:

if (wParam & MK_CONTROL) { ...

CTRL ve SHIFT dışındaki diğer tuşların durumunu bulmanız gerekiyorsa, Klavye Girişi'nde açıklanan GetKeyStateişlevini kullanın.

WM_XBUTTONDOWN ve WM_XBUTTONUP pencere iletileri hem XBUTTON1 hem de XBUTTON2 için geçerlidir. wParam parametresi hangi düğmeye tıklandığını gösterir.

UINT button = GET_XBUTTON_WPARAM(wParam);  
if (button == XBUTTON1)
{
    // XBUTTON1 was clicked.
}
else if (button == XBUTTON2)
{
    // XBUTTON2 was clicked.
}

Çift Tıklama

Pencere varsayılan olarak çift tıklama bildirimleri almaz. Çift tıklama almak için, pencere sınıfını kaydederken WNDCLASS yapısında CS_DBLCLKS bayrağını ayarlayın.

    WNDCLASS wc = { };
    wc.style = CS_DBLCLKS;

    /* Set other structure members. */

    RegisterClass(&wc);

CS_DBLCLKS bayrağını gösterildiği gibi ayarlarsanız pencere çift tıklama bildirimleri alır. Çift tıklama, adında "DBLCLK" bulunan bir pencere iletisiyle gösterilir. Örneğin, sol fare düğmesine çift tıklamak aşağıdaki ileti dizisini oluşturur:

WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDBLCLK
WM_LBUTTONUP

Aslında, normalde oluşturulacak ikinci WM_LBUTTONDOWN iletisi WM_LBUTTONDBLCLK bir iletiye dönüşür. Sağ, orta ve XBUTTON düğmeleri için eşdeğer iletiler tanımlanır.

Çift tıklama iletisini alıncaya kadar, ilk fare tıklamasının çift tıklamanın başlangıcı olduğunu anlamanın hiçbir yolu yoktur. Bu nedenle, çift tıklama eylemi ilk fare tıklamasıyla başlayan bir eyleme devam etmelidir. Örneğin, Windows Kabuğu'nda tek tıklamayla bir klasör seçilirken çift tıklama klasörü açar.

Müşteri Dışı Fare Mesajları

Pencerenin istemci olmayan alanında gerçekleşen fare olayları için ayrı bir ileti kümesi tanımlanır. Bu iletilerin adında "NC" harfleri bulunur. Örneğin, WM_NCLBUTTONDOWN, WM_LBUTTONDOWNişleminin istemci dışı karşılığıdır. DefWindowProc işlevi bu iletileri doğru işlediğinden tipik bir uygulama bu iletileri kesmez. Ancak, bazı gelişmiş işlevler için yararlı olabilir. Örneğin, başlık çubuğunda özel davranış uygulamak için bu iletileri kullanabilirsiniz. Bu iletileri işlerseniz, bunları genellikle DefWindowProc'e geçirmeniz önerilir. Aksi takdirde, uygulamanız pencereyi sürükleme veya en aza indirme gibi standart işlevleri bozar.

Sonraki

fare hareketi