2010-05-27 16 views
13

मैं सुंदरता (अनुवाद, फीका) नियंत्रण (लगभग एक ही समय में एक से अधिक समय) को एनिमेट करने के लिए एक तरीका लागू करने की कोशिश कर रहा हूं। उदाहरण के लिए, मान लें कि मेरे पास ऊपरी बाएं कोने में एक तस्वीर है, और निचले दाएं कोने में एक टेक्स्टबॉक्स है, मैं उन्हें खिड़की में आसानी से स्लाइड करने और स्थान स्विच करने में सक्षम होना चाहता हूं। मैं थोड़ी देर के लिए काम कर रहा हूं लेकिन यह आसानी से या आसानी से प्राप्त कुछ भी नहीं आया है।एनिमेशन: एक सी # फॉर्म (Winforms) पर स्लाइडिंग और फ्डिंग नियंत्रण

उत्तर

18

01 देखें Google Code परप्रोजेक्ट। अब Github here. पर एक क्लोन है यह dot-net-transitions के रूप में nuget पर भी उपलब्ध है। यह विभिन्न संक्रमणों सहित विभिन्न रैखिक/गैर-रैखिक संक्रमणों का समर्थन करता है जिनका उपयोग अधिक जटिल प्रभाव जैसे कि लहर के लिए किया जा सकता है।

यहाँ एक काम नमूना है कि अपने वांछित व्यवहार को दर्शाता है है:

var pictureBox = new PictureBox 
    { 
     ImageLocation = "http://icons2.iconarchive.com/icons/klukeart/summer/128/hamburger-icon.png", 
     SizeMode = PictureBoxSizeMode.AutoSize 
    }; 
var textBox = new TextBox 
    { 
     Text = "Hello World", 
     Location = new Point(140, 140) 
    }; 
var form = new Form 
    { 
     Controls = 
     { 
      textBox, 
      pictureBox 
     } 
    }; 
form.Click += (sender, e) => 
    { 
     // swap the Left and Top properties using a transition 
     var t = new Transition(new TransitionType_EaseInEaseOut(1000)); 
     t.add(pictureBox, "Left", textBox.Left); 
     t.add(pictureBox, "Top", textBox.Top); 
     t.add(textBox, "Left", pictureBox.Left); 
     t.add(textBox, "Top", pictureBox.Top); 
     t.run(); 
    }; 
form.ShowDialog(); 
6

मैं अनुशंसा करता हूं कि आप WPF पर स्विच करें; जो इसे बहुत आसान बना देगा।

WinForms में नियंत्रण को फीका करना पूरी तरह असंभव है; विंडोज नियंत्रण में अस्पष्टता नहीं हो सकती है।
निकटतम आप प्राप्त कर सकते हैं नियंत्रण और उसके क्षेत्र को फॉर्म पर बिटमैप्स की एक जोड़ी में प्रस्तुत करना होगा, फिर कलरमैट्रिक्स का उपयोग करके पिक्चरबॉक्स में बिटमैप्स को क्रॉसफ़ेड करें।

WinForms में नियंत्रण स्लाइड करने के लिए, आप नियंत्रण के गुणों को Top और/या Left धीरे-धीरे बदलने के लिए टाइमर का उपयोग कर सकते हैं और उन्हें फ़ॉर्म में ले जा सकते हैं। हालांकि, आपको एक परेशान झिलमिलाहट मिलेगी, जो (AFAIK) को हटाने के लिए असंभव है।

+1

भविष्य में संदर्भ के लिए: 'this.Update();' सिर्फ moveControl विधि आपके द्वारा बनाए गए नाटकीय रूप से अस्थिर कम हो जाएगा के बाहर, व्यावहारिक रूप से उस बिंदु पर जहां यह उल्लेखनीय नहीं है जब तक कि आप एक बार में एक अरब ऐप्स की तरह नहीं चल रहे हों। – bendr

0

प्रत्येक आइटम 'x और y मानों की एक प्रतिलिपि को एक फ्लोट के रूप में सहेजें।

टाइमर का उपयोग करें, और प्रत्येक टिक पर शीर्ष बाएं आइटम की एक्स और वाई स्थिति में कोई मान जोड़ें। नीचे दाएं आइटम के एक्स और वाई से वही मान घटाएं।

सुनिश्चित करें कि आप यहां कैश किए गए फ्लोट मानों का उपयोग करें, अन्यथा जब आप फ़ॉर्म पर स्थानांतरित हो जाते हैं तो आपको गोल त्रुटियां मिल सकती हैं।

यदि आप छवियों/नियंत्रणों के लिए जो भी सतह उपयोग कर रहे हैं, उस पर चित्रित कर रहे हैं, तो प्रत्येक टिक के लिए इसे अमान्य करें।

आसान-चोटी होना चाहिए।

संपादित करें:

पारदर्शी नियंत्रण के लिए, बॉब पावेल के टिप्स & सुझाव देखें:

http://www.bobpowell.net/transcontrols.htm

और यहाँ कैसे अर्द्धपारदर्शी नियंत्रण बनाने के लिए अपने ही जवाब है:

http://www.mofeel.net/67-microsoft-public-dotnet-framework-windowsforms-controls/4860.aspx

+0

हू? न तो लिंक दिखाता है कि semitransparent नियंत्रण कैसे करें। – MusiGenesis

+0

पहला लिंक पूरी तरह से पारदर्शी नियंत्रण बनाने के तरीके पर एक महान ट्यूटोरियल है। दूसरा लिंक अल्फा मूल्य के साथ ब्रश के साथ अपनी खुद की कस्टम पेंटिंग का उपयोग करके सेमिट्रैस्परेंट नियंत्रण कैसे बना सकता है, इस बारे में एक छोटी सी चर्चा है। यह चेतावनी का भी उल्लेख करता है कि इस तरह के समाधान झिलमिलाहट का कारण बन सकता है। बॉब पॉवेल आगे निर्देश में संकेत देता है कि लेयरविंडो एपीआई का उपयोग करके इस तरह का नियंत्रण हासिल किया जा सकता है। किसी भी मामले में, टॉमी की आवश्यकताओं के आधार पर, WinForms में ऐसा करना मुश्किल हो सकता है। – Pedery

1

आप प्रयास के एक महान सौदा के साथ WinForms में ऐसा कर सकता है, तो मैं करने के लिए दूसरा सिफारिशों WPF (का उपयोग करना होगा जो अनिवार्य रूप से इस तरह की चीज के लिए बनाया गया है)।

WinForms में ऐसा करने में आपकी मुख्य बाधा यह तथ्य है कि एक नियंत्रण स्थान पूर्णांक द्वारा निर्दिष्ट किया गया है, जिसका अर्थ है कि आप नियंत्रण के Left संपत्ति को 45.3425 पर सेट नहीं कर सकते हैं।यह मूल रूप से नियंत्रण की चिकनी एनीमेशन बनाता है (माना जाता है कि आप आंदोलन चाहते हैं जो गति और दिशाओं को बदलता है) पूरी तरह असंभव है - आपको इस तरह से आंदोलन की अपरिहार्य झटके मिल जाएगी (मैंने कोशिश की है, इसलिए मुझे पता है)।

जैसा कि स्लैक्स ने सुझाव दिया था, WinForms में ऐसा करने का एकमात्र तरीका प्रत्येक नियंत्रण के "स्नैपशॉट" ले कर "नकली" होगा। असल में, आप फॉर्म के बैककॉलर के साथ खींचे गए अपने फॉर्म के आकार को अदृश्य बिटमैप से शुरू करेंगे। इसके बाद आप प्रत्येक नियंत्रण पर DrawToBitmap() को कॉल करके "स्नैपशॉट्स" बनायेंगे, जिसे आप एनिमेट करना चाहते हैं, और कैनवास पर स्नैपशॉट्स खींचकर आंदोलन प्रभाव बनाते हैं (System.Drawing पूर्णांक स्थानों की झटके से परहेज करते हुए फ़्लोटिंग-पॉइंट निर्देशांक वाली छवियां खींच सकते हैं)।

हालांकि यह बहुत अधिक काम है। बस WPF का उपयोग करें। :)

संपादित करें: मैं उल्लेख करना चाहिए कि यह वास्तव में आसान WinForms में कुछ इस तरह करते हैं, जब तक है के रूप में आप यह भयानक और झटकेदार और शौकिया देख आपत्ति नहीं है। मेरी उपरोक्त टिप्पणियां इस अच्छी तरह से करने की कठिनाइयों का संदर्भ देती हैं।

0

मुझे विश्वास है कि अंतर्निहित AnimateWindow का उपयोग करने का क्या यह उत्तर बहुत इस उद्देश्य के लिए बेहतर है: How can I add moving effects to my controls in C#?

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