2013-04-07 6 views
7

के माध्यम से माउस क्लिक को रोकना मैं एक फ्लोटिंग साइडबार में 'पेन' बटन को टॉगल करने के बाद माउस के साथ स्क्रीन पर ड्राइंग के लिए थोड़ा टूल बना रहा हूं।एक पारदर्शी विंडोज फॉर्म

मैंने अपनी पृष्ठभूमि के साथ सबसे अधिक खिड़कियों के रूप में इसे (कृपया हंसो मत) किया है क्योंकि इसकी पारदर्शिता कुंजी पूरी स्क्रीन को कवर करती है। । मैं इस निम्नलिखित माउस नीचे जब मैं "ड्राइंग मोड में मीटर मैंने कोशिश की सामान पर फार्म के माध्यम से क्लिक नहीं बनाने की जरूरत है: Windows form with a transparent background that cannot be clicked through How to disable click through on transparent control?

जो सफलतापूर्वक माउस बंद हो जाता है, लेकिन यह भी रूप अन-अधिकतम और माउस के साथ इसे ड्रैग करता है (एचटीसीएपीटीओएन इंटिप्रेट (2) का उपयोग करके) मैंने एमएसडीएन पर सूचीबद्ध कुछ अन्य मूल्यों का उपयोग करने की कोशिश की, लेकिन बिना किसी किस्मत के।

मैं अपनी गहराई से बाहर हूं, किसी भी मदद की बहुत सराहना की (नौसिखिया दोस्ताना कृपया!)

पीएस मैं अभी इसका उपयोग कर रहा हूं ..

 //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); 
     } 

अद्यतन: अब इसे किसी अन्य तरीके से पूरी तरह से पहुंचकर समस्या हल हो गई। ऐसा लगता है कि WndProc काम करेगा इसलिए मैंने पूरी स्क्रीन पर एक खाली रूप बनाया है जिसमें मैंने अपना मुख्य रूप दिखाया है (फॉर्म। शो (यह)) उसमें से। फिर रिक्त रूप की अस्पष्टता को समायोजित करें जो क्लिक करने/रोकने के लिए 0% से 1% के नीचे बैठता है। काम करता है! सभी उत्तरों के लिए धन्यवाद, मुझे बहुत कुछ सिखाया।

उत्तर

5

वास्तव में, हंसने की कोई ज़रूरत नहीं है - यह मुझे लगता है जैसे आप इसे पहले से ही सही तरीके से कर रहे हैं। चूंकि आपके पास डेस्कटॉप का स्वामित्व नहीं है, इसलिए आपको सीधे उस पर आकर्षित नहीं करना चाहिए। इसके बजाय, आपको स्वयं के पारदर्शी रूप को ओवरले करके इसे अनुकरण करने की आवश्यकता है, और फिर उस पर चित्रण करें। चूंकि आप पारदर्शी ओवरले फॉर्म के स्वामी हैं, इसलिए इसे आकर्षित करने में कोई समस्या नहीं है।

लेकिन उससे परे, ऐसा लगता है कि आप वास्तव में क्या करते हैं इसकी स्पष्ट समझ के बिना यादृच्छिक रूप से मूल्यों की कोशिश कर रहे हैं। यह आपकी आंखों के साथ डार्ट फेंकने जैसा है। आपके पास बहुत अधिक हिट गिनती नहीं होगी।

चलो समझें कि आपका कोड क्या करता है। जादू मान 0x84WM_NCHITTEST संदेश से मेल खाता है, जिसे विंडोज द्वारा खिड़की पर भेजा जाता है यह निर्धारित करने के लिए कि उस विंडो पर माउस क्लिक कैसे किया जाना चाहिए। उस संदेश के जवाब में, आप लिंक किए गए दस्तावेज़ों में दिए गए HT* मानों में से एक के साथ जवाब देते हैं। उन मानों में से प्रत्येक का एक विशेष अर्थ है, दस्तावेज़ीकरण में भी समझाया गया है। उदाहरण के लिए:

  • HTCAPTION (जो 2 के एक मूल्य है) का अर्थ है कि विंडो के क्लिक किया भाग खिड़की के कैप्शन/शीर्षक पट्टी के रूप में व्यवहार किया जाना चाहिए। आप विंडोज का उपयोग करने से जानते हैं कि आप टाइटल बार का उपयोग कर स्क्रीन पर चारों ओर खिड़कियां खींच सकते हैं, इसलिए यह समझ में आता है कि माउस क्लिक के जवाब में HTCAPTION लौटने से आपकी विंडो ड्रैग करने योग्य हो जाएगी। आप इसे जंगम रूपों पर इस्तेमाल करेंगे (यानी, बिना किसी शीर्षक पट्टी वाले) जिन्हें उन्हें चलने योग्य होने की अनुमति मिलती है।

  • HTTRANSPARENT (जिसमें -1 का मान है) एक और उपलब्ध मूल्य है। यह एक बहुत आसान है। यह सिर्फ आपकी खिड़की पारदर्शी दिखता है। यह कहने जैसा है "मुझे बुरा मत मानो, यहां कोई खिड़की नहीं है!" माउस क्लिक बस उस विंडो पर पास किए जाते हैं जो आपके आदेश के नीचे ज़ेड ऑर्डर में होता है जैसे कि आप वहां नहीं थे।

  • HTCLIENT (1 का मान) डिफ़ॉल्ट परिणाम होता है जब क्लिक विंडो के क्लाइंट क्षेत्र पर कहीं भी होता है। जब आप सब कुछ सामान्य रूप से काम करना चाहते हैं तो आप इसे वापस कर देंगे (या बस डिफ़ॉल्ट विंडो प्रक्रिया को कॉल करें)। उन घटनाओं पर क्लिक करें जो इस मान को सामान्य रूप से ढांचे द्वारा संसाधित किए जाएंगे, या तो फॉर्म के Click ईवेंट को बढ़ाएंगे, या फॉर्म पर स्थित बाल नियंत्रणों को पारित करेंगे।

इसलिए, जब आप नहीं ड्राइंग कर रहे हैं, तो आप शायद HTTRANSPARENT वापस जाने के लिए चाहते हैं। जब आप ड्राइंग हैं, तो आप शायद HTCLIENT वापस लौटना चाहते हैं ताकि आपका ड्राइंग कोड माउस ईवेंट देख सके और परिणाम खींच सके।

अपने कोड फिक्सिंग, तो:

// 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

परीक्षण 8 मशीन, विंडो के पारदर्शी भाग जनक विंडो पर संदेश नहीं भेजता जब माउस क्लिक किया गया है। (संदेशों को लॉग इन करने और Spy ++ में सत्यापित)। –

+0

@ कोडी, वाह, इस तरह के स्पष्ट और पूर्ण उत्तर के लिए बहुत बहुत धन्यवाद! यह अच्छा लग रहा है, लेकिन अब मैं जो देख रहा हूं वह यह है कि एक बिंदु खींचने के बाद, यदि मैं फिर से उस बिंदु पर क्लिक करता हूं, जो अब नीला है, पारदर्शी नहीं है, तो क्लिक ... –

+0

विंडोज 10 पर काम नहीं करता है उसी कारण जॉन ने उल्लेख किया। –

1

तुम सिर्फ 5% या तो पसंद है और निष्क्रिय पारदर्शी कुंजी छोड़ने के लिए अपनी विंडो की दृश्यता सेट कर सकते हैं।

आप मूल रूप से यह नोटिस नहीं होगा और जेट यह नहीं है: डी

आशा है कि यह एक खिड़कियों पर मदद करता है

+0

धन्यवाद @Chronos, लेकिन ऐसा करने का कोई तरीका है जहां बटन और अधिक महत्वपूर्ण बात यह है कि मैं कलम मोड के साथ खींचना सामान 5% दिखाई नहीं दे रहा है? –

+1

मुझे लगता है कि मैं इस समस्या को कम से कम समझता हूं। मेरे पास अब तीन रूपों का उपयोग कर समाधान है। सबसे पहले पारिवारिक कुंजी के लिए सबसे अधिक अदृश्य धन्यवाद gui beeing दिखा रहा है। दूसरा एक केवल 5% की दृश्यता के साथ इनपुट को नियंत्रित करता है। और तीसरा पारदर्शी कुंजी का उपयोग करने पर फिर से खींचा जा रहा है। श्रीमान मैंने पहले इसे नहीं सोचा था। इस बार परीक्षण किया गया है कि फाइलें और साथ ही एक .rar हैं जिनमें से सभी https://drive.google.com/folderview?id=0B-5Qr5swDDp8ZV9CMUVrVHloeWc&usp=sharing – ChronosMOT

+0

धन्यवाद, मैं तब से एक समान समाधान के साथ आया हूं दो रूपों - मैं यूआई के समान ही आकर्षित करता हूं, मैंने अभी तक समाधान को अपडेट नहीं किया है क्योंकि मैं अभी तक सभी लक्षित मशीनों पर पूरी तरह से परीक्षण करने में सक्षम नहीं हूं। देखकर खुशी हुई कि मैं किसी और के समान सोच रहा हूं! –

संबंधित मुद्दे