2013-06-10 5 views
12

मुझे System.Windows.Forms नामस्थान में यह मणि (आईएमओ) मिला। मैं यह समझने के लिए संघर्ष कर रहा हूं कि यह ऐसा क्यों है। बाइनरी मेंविंडोज़ में अजीब enum मान। Forms.MouseButtons

public enum MouseButtons 
{ 
    None = 0, 
    Left = 1,  // 2^0 
    Right = 2,  // 2^1 
    Middle = 4, // 2^2 
    XButton1 = 8, // 2^3 
    XButton2 = 16, // 2^4 
} 

पहले मूल्य है 100000000000000000000 है, जो एक और 20 बिट के लिए अंतरिक्ष छोड़ देता है:

[Flags] 
public enum MouseButtons 
{ 
    None = 0, 
    Left = 1048576, 
    Right = 2097152, 
    Middle = 4194304, 
    XButton1 = 8388608, 
    XButton2 = 16777216, 
} 

किसी कारण है कि यह इन मूल्यों (2^20 की शक्ति 2^24 करने के लिए) का उपयोग करता है व्याख्या कर सकते हैं बजाय इस बात का! हमें ऐसी जगह क्यों चाहिए और इसे इस तरह संरक्षित क्यों किया जाता है?

+2

शायद यह Win32 से कुछ संगतता समस्या के कारण है। –

+1

@newStackExchangeInstance मन एक लिंक या स्पष्टीकरण साझा करना जो इस तरह कुछ पैदा कर सकता है? – Odys

+0

मेरे पास इस विशेष मामले पर कोई जानकारी नहीं है, लेकिन मुझे क्या पता है कि Win32 के कारण .NET में enums में बहुत सारे अजीब मान हैं। –

उत्तर

3

विनफॉर्म में उपयोग किए गए एनम मान Winapi में संबंधित बिट्स से मेल खाते हैं लेकिन यह माउस बटन के लिए बिल्कुल भी मामला नहीं है। इसे समझाते हुए एक सुंदर जंगली अनुमान की आवश्यकता होती है।

मेरे पास एक है, जिस तरह से आप विंडोज़ बटन पर भरोसा किए बिना माउस बटन की स्थिति पुनर्प्राप्त करते हैं, यह बहुत अजीब है। आप GetAsyncKeyState() को कॉल करते हैं, VK_LBUTTON को VK_XBUTTON2 के माध्यम से पास करते हैं। नकली आभासी कुंजी जो वास्तव में माउस कुंजी का प्रतिनिधित्व करती हैं और कीबोर्ड कुंजी नहीं। यह रास्ता बहुत पहले मुझे अनुमान लगाया गया कि उन्होंने उचित GetMouseButtonState() winapi फ़ंक्शन प्रदान करने के बजाय ऐसा क्यों किया।

कुंजी गणना में उन मानों के साथ-साथ Keys.LButton आदि। कुंजी के बारे में कुछ और खास है कि यह एक संशोधक कुंजी की स्थिति को भी एन्कोड कर सकता है। उदाहरण के लिए Keys.Control और Keys.ControlKey हैं। और Keys.Shift बनाम Keys.ShiftKey, आदि। पहला व्यक्ति कुंजी की स्थिति को इंगित करता है, दूसरा वास्तविक कुंजी इंगित करता है। जो Ctrl + F दबाया गया था या नहीं, यह जांचने के लिए कि keydata == (Keys.Control | Keys.F) जैसे दोस्ताना कोड की अनुमति देता है।

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

अच्छा लगता है, है ना? एकमात्र हिचकिचाहट यह है कि यह Winforms ऑब्जेक्ट मॉडल के भीतर कभी भी इस तरह से संयुक्त नहीं है। लेकिन एक शॉर्टकट को परिभाषित करने के लिए आपके कोड में हो सकता है जो माउस स्टेटस का भी उपयोग करता है।

1

मेरा अनुमान है कि यह अंतर्निहित विंडोज एपीआई माउस जानकारी को .NET को कैसे पास कर रहा है।

विंडोज़ पैकेज जो माउस बटन क्लिक किए जाते हैं, साथ ही जानकारी के एक ब्लॉक में पॉइंटर स्थिति (पुराने MOUSE_EVENT संरचना के बारे में सोचें)। .NET में एनमेट्स जिस तरह से कुशल हैं, वे सेटअप कर रहे हैं, इसलिए वे शायद अंतर्निहित विंडोज संदेश के साथ अच्छी तरह से लाइन करें।

तो, निचले स्तर के संदेश को प्राप्त करने और इसे मूल्यों के एक नए सेट में बदलने के बजाय, .NET केवल निम्न-स्तरीय संदेश में बिट्स को लक्षित करता है जिसमें कोई रुचि है, कोई रूपांतरण नहीं, कोई गणित नहीं है, बस दक्षता।

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