मुझे a fun program मिला जो आपको overlay snowflakes over your desktop and windows पर अनुमति देता है। एक प्रोग्रामिंग चुनौती के रूप में मुझे यह समझने में दिलचस्पी है कि इसे स्वयं कैसे करें। उल्लेख नहीं है कि यह प्रोग्राम एक मेमोरी हॉग का थोड़ा सा है (यदि इसमें स्मृति रिसाव नहीं है)। मेरे पास शुरुआत है। मैं मूलभूत छवियों को एक छवि के साथ प्राप्त करने की कोशिश कर रहा हूं और फिर विस्तार करूंगा।गिरने वाले बर्फ फ्लेक जैसे तत्व ले जाएं
छवि को और अधिक आसानी से और स्वाभाविक रूप से स्थानांतरित करने के लिए मुझे वास्तव में क्या मदद मिलेगी।
संपादित करें:
मैं जवाब अनुभाग में नीचे नीचे एक समाधान तैनात लेकिन इसे और अधिक सीपीयू गहन जो मुझे पसंद नहीं होता है, किसी भी विचार?
WPF XAML कोड:
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
AllowsTransparency="True"
WindowStyle="None"
Title="MainWindow" Height="350" Width="525" Background="Transparent" Topmost="True" WindowState="Maximized" ResizeMode="NoResize">
<Grid Name="grid1">
<Image Height="26" HorizontalAlignment="Left" Margin="{Binding flakeMargin}" Name="Image1" Stretch="Fill" VerticalAlignment="Top" Width="28" Source="/snowTest;component/Images/blue-pin-md.png" />
</Grid>
</Window>
वीबी कोड:
Imports System.ComponentModel
Class MainWindow
Dim bw As BackgroundWorker = New BackgroundWorker
Dim flake0 As New flake
Private Sub Window_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
grid1.DataContext = flake0
AddHandler bw.DoWork, AddressOf backgroundMover
bw.RunWorkerAsync()
End Sub
Private Sub backgroundMover(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs)
While (True)
flake0.move()
System.Threading.Thread.Sleep(100)
End While
End Sub
End Class
परत वर्ग:
Imports System.ComponentModel
Public Class flake
Implements INotifyPropertyChanged
Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
Private Sub NotifyPropertyChanged(ByVal info As String)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
End Sub
Private Property startLeft As Integer = 300
Private Property left As Integer = left
Private Property top As Integer = 100
Private Property speed As Integer = 1
Public ReadOnly Property flakeMargin As Thickness
Get
Return New Thickness(left, top, 0, 0)
End Get
End Property
Public Sub move()
top += speed
left = (Math.Cos(top - 100)) * 6 + startLeft
NotifyPropertyChanged("flakeMargin")
End Sub
End Class
सुनिश्चित नहीं हैं कि क्यों यह बंद कर दिया गया है, यह की तरह लगता है मेरे लिए एक असली सवाल है। मेरा उत्तरदाता होगा: चूंकि आप WPF में प्रति फ्रेम एनीमेशन करने की कोशिश कर रहे हैं, इसलिए आपको अपनी खुद की घड़ी के बजाय CompositionTarget.Redering ईवेंट का उपयोग करना चाहिए। प्रतिपादन ईवेंट पर आप अपना "ड्रा" कोड कह सकते हैं, जो छवि को चारों ओर ले जाना होगा। आप शायद ग्रिड के बजाय कैनवास का उपयोग करना चाहते हैं क्योंकि मेजबान तत्व –