पर ओवरराइड विधि मेरे पास दो प्रश्न हैं।सी # रनटाइम
1) मुझे how to make a control scroll smoothly के लिए कोड का एक छोटा मणि मिला।
ग्रेट। लेकिन यह WndProc विधि को ओवरराइड करता है, इसलिए इसका उपयोग करने के लिए, मुझे फ्लोलायआउट पैनेल को फाड़ना पड़ा था जिसे मैं डिज़ाइन समय, सबक्लास फ्लोलाउट पैनेल पर फॉर्म पर छोड़ देता था, और फिर आखिरकार मेरी नई कक्षा को तुरंत चालू करता था और सभी गुण मैन्युअल रूप से बना देता था और सभी संदर्भों को बदलता था इसे नियंत्रित करने के लिए। नियंत्रण ["नियंत्रण नाम"]। (या मुझे लगता है कि मैं एक क्लास-स्तरीय वैरिएबल बना सकता हूं जो अनिवार्य रूप से नियंत्रण था, हालांकि, जब भी इसे कहीं भी घोषित नहीं किया जाता है, तो वे इंटेलिजेंस का उपयोग कैसे करते हैं?)
तो अब मैं सोच रहा हूं कि क्या वास्तव में ऐसा करने के लिए एक रनटाइम तरीका था।
मैं कुछ इस रूप में सरल कर सकते हैं, जहां MainPanel नियंत्रण का नाम है:
MainPanel = (SmoothScrollingFlowLayoutPanel)MainPanel
यह इतना आसान है, यह नहीं कर सकते हो सकता है? फिर भी, यह कष्टप्रद है क्योंकि मुझे अभी भी सबक्लास होना है (जो एक अच्छा डिजाइन निर्णय हो सकता है लेकिन मैं इसे एक-दूसरे से मुक्त करने की स्वतंत्रता चाहता हूं)। तो यह इस तरह FlowLayoutPanel कुछ की मूल में कोड डाल करने के लिए संभव हो जाएगा:
private Delegate void WndProcHandler(ref Message m);
private WndProcHandler w;
public void SomeCode() {
w = MainPanel.WndProc; // get reference to existing wndproc method
MainPanel.WndProc = WndProcSmoothScroll; //replace with new method
}
private void WndProcSmoothScroll(ref Message m) { // make smooth scrolling work
if (
(m.Msg == WM_HSCROLL || m.Msg == WM_VSCROLL)
&& (((int)m.WParam & 0xFFFF) == 5)
) {
m.WParam = (IntPtr)(((int)m.WParam & ~0xFFFF) | 4);
}
if (w != null) { w(); }
base.WndProc(ref m);
}
मुझे पता है यह शायद बहुत भोली है। मैं WndProc विधि का इलाज कर रहा हूं जैसे कि यह एक घटना है, और यह नहीं है।
2) तो फिर मेरे दूसरे प्रश्न, अगर WndProc था एक विधि के बजाय एक घटना, मैं कैसे एक घटना के लिए एक ही बात-स्टोर संचालकों की मूल सूची की एक प्रति क्या करना होगा, मेरे अपने घटना को स्थापित कर रहा है पहले चलाने के लिए हैंडलर, फिर सभी मूल घटना हैंडलर को कॉल करें?
स्वादिष्ट बिट्स
मामले में किसी को भी मैं आसान स्क्रॉलिंग कोड में एक अनुकूलन संभव देखा रुचि रखता है:
//m.WParam = (IntPtr)(((int)m.WParam & ~0xFFFF) | 4);
m.WParam = (IntPtr)((int)m.WParam^1);
के बाद से हम 4 5 से पिछले 16 बिट चालू करना चाहते हैं, हम और फिर या फिर के बजाय अंतिम बिट (एक्सओआर) फ्लिप कर सकते हैं।
धन्यवाद जैच, लेकिन मैं पहले से ही अपने विंडोज़ स्क्रॉल को आसानी से पूरा कर चुका हूं। मुझे बस इतना नफरत है कि मुझे डिजाइनर से नियंत्रण कैसे निकालना था और सब कुछ गतिशील रूप से करना था। – ErikE
@Emtucifor: कोई समस्या नहीं, मैं बस आपको यह बताने के लिए चाहता था कि आपको 'फ़्लोलाउट पैनेल' से अपने 'WndProc' को ओवरराइड करने के लिए उत्तराधिकारी नहीं होना पड़ेगा। –
ओह, अब मुझे मिल गया। धन्यवाद। मैं कबूल करता हूं कि मैंने सावधानी से पढ़ा नहीं था जैसा कि मेरे पास होना चाहिए। यह उपयोगी है! वास्तव में, आप 100% सही हैं, यह वह जवाब है जिसे मैं ढूंढ रहा था। (माथे smacks) – ErikE