Aslında gerek gülmek-bana geliyor. Masaüstüne sahip olmadığınız için doğrudan çizim yapmamalısınız. Bunun yerine, kendinizin oluşturduğu saydam bir formun üzerine yerleştirerek ve sonra üzerine çizim yaparak simüle etmeniz gerekir. Saydam kaplama formuna sahip olduğunuzdan, bunun üzerine çizim yapmak sorun değil. Sadece aslında ne açık bir anlayış olmadan rastgele değerler çalışıyoruz gibi
Fakat bunun ötesinde
, bu sesler. Gözlerin kapalıyken dart atmak gibi bir şey. Çok yüksek bir isabet sayısına sahip olmayacaksın.
Kodunuzun ne yaptığını anlayarak başlayalım. 0x84
sihirli değeri, bu pencerede fare tıklamalarının nasıl ele alınacağını belirlemek için Windows tarafından gönderilen bir pencereye gönderilen WM_NCHITTEST
mesajına karşılık gelir. Bu mesaja cevaben, bağlantılı belgelerde verilen HT*
değerlerinden birine cevap verirsiniz. Bu değerlerin her birinin, belgelerinde de açıklanmış özel bir anlamı vardır. Örneğin: (2 arasında bir değere sahiptir)
HTCAPTION
pencerenin tıklandığında kısmı pencerenin başlık/başlık çubuğu olarak tedavi edilmesi gerektiği anlamına gelir. Windows kullanarak, pencereleri ekran üzerinde sürükleyerek başlık çubuğunu kullanarak açabileceğinizi biliyorsunuz, bu nedenle HTCAPTION
'un fare tıklamalarına yanıt olarak pencerenizin sürüklenmesini sağlayacağını düşünebilirsiniz. Bunu, hareketli olmalarına izin vermek için kenarlıksız formlarda (yani, başlık çubuğu olmayanlar) kullandıklarını göreceksiniz. (-1 arasında bir değere sahiptir)
HTTRANSPARENT
mevcut başka bir değerdir. Bu oldukça basit. Sadece pencerenizin şeffaf görünmesini sağlar. "Bana aldırma, burada pencere yok!" Demek gibi. Fare tıklamaları, siz yokmuşsunuz gibi Z sırasındaki sizinkilerin altında yer alan pencereye aktarılır.Pencerenin istemci alanının herhangi bir yerinde herhangi bir tıklama gerçekleştiğinde, varsayılan sonuç,
HTCLIENT
(1 değeri) 'dir. Her şeyin normal şekilde çalışmasını istediğinizde bunu (veya varsayılan pencere prosedürünü çağırınız) geri verirsiniz. Bu değeri döndüren olayların tıklatılması, çerçeve tarafından normal şekilde işlenecek, formun Click
etkinliğini artıracak veya formda bulunan çocuk denetimlerine geçirilecektir. Eğer değil çizim olduğunuzda
Yani, muhtemelen HTTRANSPARENT
dönmek istiyorum. , çiziminiz olduğunda, HTCLIENT
numarasına dönmek isteyebilirsiniz, böylece çizim kodunuz fare olaylarını görebilir ve sonucu çizebilir.
ardından kodunuzu Tespit: Sadece% 5 veya öylesine mi devreden şeffaf anahtar bırakmak pencerenizin görünürlüğünü ayarlamak isteyebilirsiniz
// Code for allowing clicking through of the form
protected override void WndProc(ref Message m)
{
const uint WM_NCHITTEST = 0x84;
const int HTTRANSPARENT = -1;
const int HTCLIENT = 1;
const int HTCAPTION = 2;
// ... or define an enum with all the values
if (m.Msg == WM_NCHITTEST)
{
// If it's the message we want, handle it.
if (penMode)
{
// If we're drawing, we want to see mouse events like normal.
m.Result = new IntPtr(HTCLIENT);
}
else
{
// Otherwise, we want to pass mouse events on to the desktop,
// as if we were not even here.
m.Result = new IntPtr(HTTRANSPARENT);
}
return; // bail out because we've handled the message
}
// Otherwise, call the base class implementation for default processing.
base.WndProc(ref m);
}
Test olur D
umut zaman fare tıklandı. (İletilerin kaydedilmesinde doğrulanmış ve Spy ++). –
@Cody, vay, bu kadar açık ve eksiksiz bir cevap için çok teşekkür ederim! İyi görünüyor, ama şimdi gördüğüm şey, bir nokta çizdikten sonra, şimdi tekrar mavi, saydam değil, o noktaya tıklarsam tıklamak .. –
Windows 10 üzerinde çalışmıyor. aynı sebepten John bahsetti. –