2013-04-07 12 views
7

tıklanır.önleme fare Ben 'kalem' düğmesine yüzer kenar çubuğunda duruma getirildiğinden sonra fare ile ekrana çizim için biraz aracı yapıyorum şeffaf Windows Form

Ben en üstteki pencereler onun şeffaflık anahtar kapağı olarak arka planından tüm ekran ile meydana alarak (gülme ediniz) yapmış. . Bunu izleyen fare ben "çizim modunda m ı çalıştığımızda aşağıdaki şeyler üzerine forma tıklanmaz yapmak gerekir: başarıyla fare durur Windows form with a transparent background that cannot be clicked through How to disable click through on transparent control?

aynı zamanda formu-un maksimize ve (HTCAPTION IntPtr (2) kullanarak bu fare ile sürükler) Bu, MSDN'de listelenen diğer değerlerin bazılarını kullanmayı denedim, ancak şanssız

Derinlikten çıkıyorum, herhangi bir yardım büyük beğeni topluyor (lütfen acemi dostu!), bunu şimdi kullanıyorum

PS ..

 //code for allowing clicking through of menus 
     protected override void WndProc(ref Message m) 
     {    
      if (penMode && m.Msg == 0x84) 
      { 
       m.Result = new IntPtr(2);  
      } 
      else 
       base.WndProc(ref m); 
     } 

GÜNCELLEME: Şimdi sorunu tamamen başka bir şekilde yaklaşarak çözdünüz. WndProc çalışacak gibi görünmüyor, bu yüzden tüm ekran üzerinde sadece boş bir form oluşturdum, ana formumu (form.Show (this)) bunun içinden gösterdi. Ardından, tıklamaya izin vermek/engellemek için% 0'dan% 1'e kadar olan boş formun opaklığını ayarlayın. Eserleri! Tüm cevaplar sayesinde bana çok şey öğretti. Bu zaten doğru yolu yapıyoruz gibi

cevap

5

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); 
} 
+1

Test olur D

umut zaman fare tıklandı. (İletilerin kaydedilmesinde doğrulanmış ve Spy ++). –

+0

@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 .. –

+0

Windows 10 üzerinde çalışmıyor. aynı sebepten John bahsetti. –

1

.

temelde bunu fark olmayacak ve jet orada olduğunu: 8 makinesi, pencerenin şeffaf kısmı ana pencereye mesajlar göndermez bu pencerelerde

+0

Teşekkür ederim @Chronos, ancak düğmeler ve daha da önemlisi kalem modu ile çizdiğim şeyler% 5 görünür değil mi? –

+1

Sanırım bu problemi hafife aldım. Şimdi üç formu kullanarak bir çözüm var. Şeffaflık anahtarı sayesinde sadece gui beeing'i ilk kez görünmez kılıyor. ikincisi sadece girişi% 5'lik bir görünürlük ile kontrol ediyor. ve üçüncü şeffaflık anahtarını tekrar kullanmaya başladı. Sry, bunu daha önce düşünmedim. Bu sefer burada test edilen dosyaların hepsi de içeren bir .rar. Https://drive.google.com/folderview?id=0B-5Qr5swDDp8ZV9CMUVrVHloeWc&usp=sharing – ChronosMOT

+0

Teşekkürler, ben de benzer bir çözüm kullanarak geldim. iki form - UI ile aynı olanı çiziyorum, henüz henüz tüm hedef makinelerde test edemediğim için çözümü güncellemedim. Gördüğüme sevindim başkasıyla aynı çizgide düşünüyorum! –

İlgili konular