2008-11-25 14 views
9

एक ऐप में मैं कोडिंग कर रहा हूं, मैं एक चेतावनी संदेश दिखाना चाहता हूं जो उपयोगकर्ताओं के काम को प्रभावित किए बिना एक बड़ा अर्ध-पारदर्शी चेतावनी संदेश प्रदर्शित करता है। असल में मैं संदेश में फीका होगा लेकिन कभी इसकी अस्पष्टता को 1 तक सेट नहीं करूंगा और मैं चाहता हूं कि उपयोगकर्ता संदेश के माध्यम से 'क्लिक' करने में सक्षम हो जैसे कि यह वहां नहीं है।पारदर्शी विंडो (या स्क्रीन पर ड्रा) कोई माउस कैप्चर

मैंने हमेशा शीर्ष विंडो पर उपयोग करके और विंडो शैली को किसी के साथ सेट करके और पृष्ठभूमि को पृष्ठभूमि और पारदर्शिता कुंजी सेट करके शुरू किया है। इस विंडो पर एक बड़े फ़ॉन्ट वाले एक लेबल हैं जिसमें अलर्ट संदेश होता है (बाद में मैं शायद पेंट इवेंट ओवरराइड करूँगा और जीडीआई का उपयोग करके संदेश पेंट करूँगा)। मैं इसे फिर से डायल करने से पहले इसकी अस्पष्टता को डायल करके संदेश में फीका करने के लिए टाइमर का उपयोग करता हूं। यह ठीक काम करता है कि फोकस किसी भी ऐप से चोरी नहीं होता है लेकिन पारदर्शी रूप माउस घटनाओं को कैप्चर करता है, न कि नीचे दिया गया फॉर्म (वास्तव में अधिकांश रूप जो पारदर्शी है, माउस ईवेंट को कैप्चर नहीं करता है, केवल लेबल टेक्स्ट करता है)।

मुझे भी यकीन नहीं है कि यह इष्टतम दृष्टिकोण है, शायद मुझे किसी भी तरह स्क्रीन पर सीधे पेंटिंग करना चाहिए।

मुझे चीजों को कैसे सुधारना चाहिए।

उत्तर

10

अपनी फॉर्म क्लास पर CreateParams प्रॉपर्टी को ओवरराइड करें और सुनिश्चित करें कि WS_EX_NOACTIVATE विस्तारित शैली सेट है। मेरा इस तरह दिखता है: ऊपर उपयोग ExtendedWindowStyles के लिए

protected override CreateParams CreateParams 
{ 
    get 
    { 
    CreateParams baseParams = base.CreateParams; 

    baseParams.ExStyle |= (int)(
     Win32.ExtendedWindowStyles.WS_EX_LAYERED | 
     Win32.ExtendedWindowStyles.WS_EX_TRANSPARENT | 
     Win32.ExtendedWindowStyles.WS_EX_NOACTIVATE | 
     Win32.ExtendedWindowStyles.WS_EX_TOOLWINDOW); 

    return baseParams; 
    } 
} 

मान रहे हैं:

WS_EX_LAYERED = 0x00080000, 
WS_EX_NOACTIVATE = 0x08000000, 
WS_EX_TOOLWINDOW = 0x00000080, 
WS_EX_TRANSPARENT = 0x00000020, 
+1

धन्यवाद, स्लिम कोड। यह मेरे लिए बहुत अच्छा काम करता है। –

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