Страница: 1 |
Страница: 1 |
Вопрос: Вместо курсора Gifовский рисунок поэтому два вопро
Добавлено: 30.03.06 22:06
Автор вопроса: Nikolai
С Эросом написали код (То есть я писал он диктовал),
но как обычно без проблем не бывает
Первый вопрос:
Почему моргает (мерцает)?
Второй вопрос:
ЦП забит на все 100% почему?
Public Class Form1
Inherits System.Windows.Forms.Form
'После
#Region " Windows Form Designer generated code "
Public Sub New()
MyBase.New()
'Добавить в ручную:
' по идее в GDI+ это для того чтоб не мерцала картинка
'для курсора не действует
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.DoubleBuffer, True)
Me.UpdateStyles()
#End Region
'В папку Bin любой Gifовский рисунок
Public MyGif As Bitmap = New Bitmap("SharStop.gif")
Private Animating As Boolean = False
Private GifRectangle As New Rectangle
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Задаем начальные координаты и размеры прямоугольника для вывода анимации
With GifRectangle
.X = 400
.Y = 30
.Width = MyGif.Width
.Height = MyGif.Height
End With
End Sub
Public Sub StartAnimate()
If Not Animating Then
'Запускаем анимацию только 1 раз
ImageAnimator.Animate(MyGif, New EventHandler(AddressOf Me.NewAnimatedFrame))
'Устанавливаем флаг
Animating = True
End If
End Sub
Private Sub NewAnimatedFrame(ByVal o As Object, ByVal e As EventArgs)
'Инициируем перерисовку экрана в заданной области
Me.Invalidate(GifRectangle)
End Sub
Private Sub frmTany_DoubleClick1(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.DoubleClick
'выход
Me.Close()
End Sub
Private Sub frmShar_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
'Запускаем Анимацию
StartAnimate()
'Меняем кадр анимации
ImageAnimator.UpdateFrames()
'Создаем новую картинку из текущего кадра
Me.Cursor = New Cursor(MyGif.GetHicon)
End Sub
End Class
Ответы
Всего ответов: 12
Номер ответа: 1
Автор ответа:
mich
ICQ: 261800349
Вопросов: 19
Ответов: 148
Web-сайт:
Профиль | | #1
Добавлено: 31.03.06 16:11
Me.SetStyle не поможет. Прорисовка не на форме.
Номер ответа: 2
Автор ответа:
Fever
Вопросов: 60
Ответов: 808
Профиль | | #2
Добавлено: 31.03.06 17:08
Тут надо юзать старый добрый BitBlt со всеми его заморочками при сохранении. Как я понимаю гиф еще и прозрачный...
Ответ на оба вопроса прост: фигня это а не код!
Номер ответа: 3
Автор ответа:
mich
ICQ: 261800349
Вопросов: 19
Ответов: 148
Web-сайт:
Профиль | | #3
Добавлено: 31.03.06 17:14
Нормальный сырой код. Но для этой цели не пойдет
Номер ответа: 4
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #4
Добавлено: 01.04.06 00:43
У тебя тут грубейшай ошибка!! ЗАЧЕМ ПЕРЕРИСОВЫВАТЬ форму при смене курсора???
Тут совершенно не уместна! Достаточно сделать другую процедуру с любым названием и код из Paint перенести в нее. И далее в NewAnimatedFrame
Вызывать эту процедуру.Также при загрузке формы надо будет стартовать анимацию. Я думаю, тебе стоит более детально изучить класс ImageAnimator.
И еще..
Me.SetStyle(ControlStyles.DoubleBuffer, True)
Me.UpdateStyles()
в данном случае абсолютно не нужна.
И впредь,ссылаясь на меня будь добр добавлять,что этот код ты переделал из моего примера предназначенного для совершенно других целей, дабы не вводить людей в заблуждение. Если самостоятельно сделать не получится-дай знать... я приведу полный код, как это можно сделать.
Fever..
А Вам, уважаемый, я бы весьма рекомендовал воздерживаться от подобного рода высказываний:
Либо,раз уж вы позволяете себе подобное, приводить код, который по вашему мнению является более рациональным и правильным. В противном случае ваши слова выглядят не более,чем пустой трёп! Обхаять чужой код много ума не надо, гораздо сложнее помочь делом.
И BitBlt в этом случае абсолютно не нужен.. Тем более для человека с таким уровнем знаний..
Номер ответа: 5
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #5
Добавлено: 01.04.06 01:19
Кстати..
.X = 400
.Y = 30
.Width = MyGif.Width
.Height = MyGif.Height
End With
тут тоже теперь не нужна.. это было необходимо при рисовании на форме..
Номер ответа: 6
Автор ответа:
mich
ICQ: 261800349
Вопросов: 19
Ответов: 148
Web-сайт:
Профиль | | #6
Добавлено: 02.04.06 00:22
Правильно EROS
А зачем делать из Gif курсор?
Номер ответа: 7
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #7
Добавлено: 02.04.06 01:30
ну хочется человеку сделать нестандартный,красивый анимированный курсор.. мало ли для чего.. может для игры.. или еще чего нибудь..
Номер ответа: 8
Автор ответа:
Nikolai
Вопросов: 23
Ответов: 58
Профиль | | #8
Добавлено: 02.04.06 09:32
Ну вот переделал
'В папку Bin любой Gifовский рисунок
Public MyGif As Bitmap = New Bitmap("SharStop.gif"
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Запускаем анимацию только 1 раз
ImageAnimator.Animate(MyGif, New EventHandler(AddressOf Me.NewAnimatedFrame))
End Sub
Private Sub NewAnimatedFrame(ByVal o As Object, ByVal e As EventArgs)
Any()
End Sub
Private Sub frmTany_DoubleClick1(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.DoubleClick
'выход
Me.Close()
End Sub
Private Sub Any()
'Меняем кадр анимации
ImageAnimator.UpdateFrames()
'Создаем новую картинку из текущего кадра
Me.Cursor = New Cursor(MyGif.GetHicon)
End Sub
End Class
ЦП 10%
а мерцает очень сильно
причём В VB6 на APIшках можно сделать нормально
Номер ответа: 9
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #9
Добавлено: 02.04.06 12:53
а мерцает очень сильно
ЦП забит и мерцает потому,что твой SharStop.gif весит около 500 кб.. чего ты хотел с такими размерами? Ты где видел курсоры в 500 кб?
А вот это врядли! Я не думаю, что на APIшках кому-то удастся сделать анимированный курсор из Gif!
Если же тебя интересует использование анимированного курсора (*.ani) то вот код:
Private Declare Function LoadCursorFromFile Lib "user32" Alias "LoadCursorFromFileA" (ByVal lpFileName As String) As Integer
Private Declare Function DestroyCursor Lib "user32" (ByVal hCursor As Integer) As Integer
Dim hCursor As Integer
Private Sub frmCursorTest_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
 estroyCursor(hCursor)
End Sub
Private Sub frmCursorTest_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
hCursor = LoadCursorFromFile("C:\WINDOWS\Cursors\drum.ani"
Me.Cursor = New Cursor(New IntPtr(hCursor))
End Sub
End Class
Номер ответа: 10
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #10
Добавлено: 02.04.06 13:51
И кстати, я проверил твой код на прозрачном Gif'e размером 141х113 и весом 13кб,результаты вполне приличные.. ЦП-0% и мерцания никакого. Молодец!
Номер ответа: 11
Автор ответа:
Nikolai
Вопросов: 23
Ответов: 58
Профиль | | #11
Добавлено: 02.04.06 17:47
Знали бы другие во сколько времени мне это обошлось, а нервов...
Спасибо!!!!!!!!!!!!!!!!!!!!
Номер ответа: 12
Автор ответа:
mich
ICQ: 261800349
Вопросов: 19
Ответов: 148
Web-сайт:
Профиль | | #12
Добавлено: 02.04.06 21:03
Про время программистам можешь не рассказывать