Спасибо, ВиниПур
Отредактировано Bandit (15.06.2011 20:09:42)
PureBasic - форум |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка (продолжение…)
Спасибо, ВиниПур
Отредактировано Bandit (15.06.2011 20:09:42)
Мне необходимо сделать анимацию, для примера попробовал в видя стрелки
If OpenWindow(0, 0, 0, 500, 500, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) Repeat n.d+0.1 CreateImage(0, 500, 500) StartDrawing(ImageOutput(0)) a=100*Cos(n)+200 b=100*Sin(n)+200 Sleep_(100) Line(200, 200, a-200, b-200, RGB(15, 51, 15)) StopDrawing() ImageGadget(0, 0, 0, 500, 500, ImageID(0)) Until n=100 EndIf
Но черный экранчик мигает, скорее всего сделано довольно не рационально, подскажите пожалуйста, как сделать более рационально?
Procedure Draw() Static n.d n.d+0.1 If StartDrawing(ImageOutput(0)) Box(0,0,500,500) a=100*Cos(n)+200 b=100*Sin(n)+200 Line(200, 200, a-200, b-200, RGB(15, 51, 15)) StopDrawing() SetGadgetState(0, ImageID(0)) EndIf EndProcedure CreateImage(0, 500, 500) If OpenWindow(0, 0, 0, 500, 500, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered|#PB_Window_Invisible) ImageGadget(0, 0, 0, 500, 500, ImageID(0)) Draw() HideWindow(0,0) SetTimer_(WindowID(0),2,100,@Draw()) Repeat Event = WaitWindowEvent() Until Event = #PB_Event_CloseWindow EndIf
И будет зависать и моргать:
В главном цикле 1000 раз создаётся один и тот-же ImageGadget() и CreateImage()
их надо в данном варианте кода создать один раз. И вызывать StartDrawing() по таймеру.
И вызывать StartDrawing() по таймеру.
С таймером конечно правильнее, но всё же не так однозначно обязательно. Можно и без таймера обойтись при желании:
If OpenWindow(0, 0, 0, 500, 500, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) CreateImage(0, 500, 500) ImageGadget(0, 0, 0, 500, 500, ImageID(0)) Repeat Event = WaitWindowEvent(10) n.d+0.1 StartDrawing(ImageOutput(0)) Box(0,0,500,500) a=100*Cos(n)+200 b=100*Sin(n)+200 Sleep_(100) Line(200, 200, a-200, b-200, RGB(15, 51, 15)) StopDrawing() SetGadgetState(0, ImageID(0)) Until Event = #PB_Event_CloseWindow EndIf
С таймером конечно правильнее, но всё же не так однозначно обязательно.
Зачем экономить на спичках?
Смотри, проведешь мышкой по окну (или возникнут другие события) и прорисовка начнёт выполнятся быстрее, а если попытаться перетащить окно за заголовок, так и вовсе прекратится!
С таймером этого не будет.
Одна строка не сильно усложнит программу, но избавит от нескольких глюков.
Вопрос не в экономии, а в многообразии решений на Пурике, некоторые из которых несомненно являются хуже других, но имеют место быть как вариант, который нельзя отбрасывать в силу его принципиальной работоспособности.
Можно ещё запустить отдельный поток или использовать встроенный таймер вместо API или придумать что то ещё. Вариантов море - ведь за это мы и любим Пурик?
Скажите пожалуйста, нет ли способа проконтролировать толщину линии LineXY? Я знаю что можно конечно и 2 линии рядом нарисовать, но меня интересует именно толщина линии.
Скажите пожалуйста, нет ли способа проконтролировать толщину линии LineXY?
С помощью WinAPI можно сделать.
Здесь обсуждалось.
Спасибо, со всем этим я разобрался. Но вопрос про 2D графику еще остался. Всего один. Вот фрагмент программы - часов:
OpenWindow(0, 0, 0, 200, 200, "Часы", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) UseJPEGImageDecoder() Repeat houra.s=hour.s mina.s=min.s seka.s=sek.s date.s=FormatDate("%hh:%ii:%ss", Date()) hour.s=Mid(date,1,2) min.s=Mid(date,4,2) sek.s=Mid(date,7,2) If Val(min)<>Val(mina) Or Val(sek)<>Val(seka) Or Val(houra)<>Val(hour) If LoadImage(0, "фон22.jpg") StartDrawing(ImageOutput(0)) Select Val(sek) Case 0 LineXY(99,19,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(99-100)/3,100-(19-100)/3,RGB(181, 26, 19)) Case -1+2 LineXY(108,19,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(108-100)/3,100-(19-100)/3,RGB(181, 26, 19)) Case -1+3 LineXY(117,22,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(117-100)/3,100-(22-100)/3,RGB(181, 26, 19)) Case -1+4 LineXY(124,24,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(124-100)/3,100-(24-100)/3,RGB(181, 26, 19)) Case -1+5 LineXY(133,26,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(133-100)/3,100-(26-100)/3,RGB(181, 26, 19)) Case -1+6 LineXY(141,30,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(141-100)/3,100-(30-100)/3,RGB(181, 26, 19)) Case -1+7 LineXY(148,36,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(148-100)/3,100-(36-100)/3,RGB(181, 26, 19)) Case -1+8 LineXY(155,41,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(155-100)/3,100-(41-100)/3,RGB(181, 26, 19)) Case -1+9 LineXY(160,47,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(160-100)/3,100-(47-100)/3,RGB(181, 26, 19)) Case -1+10 LineXY(166,54,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(166-100)/3,100-(54-100)/3,RGB(181, 26, 19)) Case -1+11 LineXY(171,61,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(171-100)/3,100-(61-100)/3,RGB(181, 26, 19)) Case -1+12 LineXY(174,69,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(174-100)/3,100-(69-100)/3,RGB(181, 26, 19)) Case -1+13 LineXY(178,77,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(178-100)/3,100-(77-100)/3,RGB(181, 26, 19)) Case -1+14 LineXY(180,86,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(180-100)/3,100-(86-100)/3,RGB(181, 26, 19)) Case -1+15 LineXY(181,93,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(181-100)/3,100-(93-100)/3,RGB(181, 26, 19)) Case -1+16 LineXY(181,102,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(181-100)/3,100-(102-100)/3,RGB(181, 26, 19)) Case -1+17 LineXY(180,111,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(180-100)/3,100-(111-100)/3,RGB(181, 26, 19)) Case -1+18 LineXY(178,118,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(178-100)/3,100-(118-100)/3,RGB(181, 26, 19)) Case -1+19 LineXY(177,128,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(177-100)/3,100-(128-100)/3,RGB(181, 26, 19)) Case -1+20 LineXY(173,135,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(173-100)/3,100-(135-100)/3,RGB(181, 26, 19)) Case -1+21 LineXY(170,141,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(170-100)/3,100-(141-100)/3,RGB(181, 26, 19)) Case -1+22 LineXY(164,149,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(164-100)/3,100-(149-100)/3,RGB(181, 26, 19)) Case -1+23 LineXY(159,155,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(159-100)/3,100-(155-100)/3,RGB(181, 26, 19)) Case -1+24 LineXY(154,161,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(154-100)/3,100-(161-100)/3,RGB(181, 26, 19)) Case -1+25 LineXY(147,167,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(147-100)/3,100-(167-100)/3,RGB(181, 26, 19)) Case -1+26 LineXY(140,172,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(140-100)/3,100-(172-100)/3,RGB(181, 26, 19)) Case -1+27 LineXY(132,176,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(132-100)/3,100-(176-100)/3,RGB(181, 26, 19)) Case -1+28 LineXY(126,177,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(126-100)/3,100-(177-100)/3,RGB(181, 26, 19)) Case -1+29 LineXY(116,181,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(116-100)/3,100-(181-100)/3,RGB(181, 26, 19)) Case -1+30 LineXY(109,181,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(109-100)/3,100-(181-100)/3,RGB(181, 26, 19)) Case -1+31 LineXY(98,183,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(98-100)/3,100-(183-100)/3,RGB(181, 26, 19)) Case -1+32 LineXY(91,182,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(91-100)/3,100-(182-100)/3,RGB(181, 26, 19)) Case -1+33 LineXY(83,182,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(83-100)/3,100-(182-100)/3,RGB(181, 26, 19)) Case -1+34 LineXY(73,179,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(73-100)/3,100-(179-100)/3,RGB(181, 26, 19)) Case -1+35 LineXY(66,177,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(66-100)/3,100-(177-100)/3,RGB(181, 26, 19)) Case -1+36 LineXY(58,172,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(58-100)/3,100-(172-100)/3,RGB(181, 26, 19)) Case -1+37 LineXY(52,169,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(52-100)/3,100-(169-100)/3,RGB(181, 26, 19)) Case -1+38 LineXY(45,163,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(45-100)/3,100-(163-100)/3,RGB(181, 26, 19)) Case -1+39 LineXY(39,157,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(39-100)/3,100-(157-100)/3,RGB(181, 26, 19)) Case -1+40 LineXY(33,150,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(33-100)/3,100-(150-100)/3,RGB(181, 26, 19)) Case -1+41 LineXY(29,142,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(29-100)/3,100-(142-100)/3,RGB(181, 26, 19)) Case -1+42 LineXY(25,135,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(25-100)/3,100-(135-100)/3,RGB(181, 26, 19)) Case -1+43 LineXY(23,128,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(23-100)/3,100-(128-100)/3,RGB(181, 26, 19)) Case -1+44 LineXY(19,120,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(19-100)/3,100-(120-100)/3,RGB(181, 26, 19)) Case -1+45 LineXY(18,111,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(18-100)/3,100-(111-100)/3,RGB(181, 26, 19)) Case -1+46 LineXY(17,103,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(17-100)/3,100-(103-100)/3,RGB(181, 26, 19)) Case -1+47 LineXY(18,96,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(18-100)/3,100-(96-100)/3,RGB(181, 26, 19)) Case -1+48 LineXY(20,86,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(20-100)/3,100-(86-100)/3,RGB(181, 26, 19)) Case -1+49 LineXY(21,78,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(21-100)/3,100-(78-100)/3,RGB(181, 26, 19)) Case -1+50 LineXY(23,70,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(23-100)/3,100-(70-100)/3,RGB(181, 26, 19)) Case -1+51 LineXY(27,60,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(27-100)/3,100-(60-100)/3,RGB(181, 26, 19)) Case -1+52 LineXY(32,53,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(32-100)/3,100-(53-100)/3,RGB(181, 26, 19)) Case -1+53 LineXY(37,48,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(37-100)/3,100-(48-100)/3,RGB(181, 26, 19)) Case -1+54 LineXY(44,42,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(44-100)/3,100-(42-100)/3,RGB(181, 26, 19)) Case -1+55 LineXY(51,36,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(51-100)/3,100-(36-100)/3,RGB(181, 26, 19)) Case -1+56 LineXY(58,30,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(58-100)/3,100-(30-100)/3,RGB(181, 26, 19)) Case -1+57 LineXY(66,27,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(66-100)/3,100-(27-100)/3,RGB(181, 26, 19)) Case -1+58 LineXY(73,23,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(73-100)/3,100-(23-100)/3,RGB(181, 26, 19)) Case -1+59 LineXY(83,21,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(83-100)/3,100-(21-100)/3,RGB(181, 26, 19)) Case -1+60 LineXY(91,19,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(91-100)/3,100-(19-100)/3,RGB(181, 26, 19)) EndSelect StopDrawing() ImageGadget(0, 0, 0, 200, 200, ImageID(0)) EndIf EndIf Event = WindowEvent() Until Event = #PB_Event_CloseWindow
Как видно, я загружаю изображение циферблата, рисую на нем стрелку и вывожу на экран. Проблема в том что так как я вывожу новое изображение каждую секунду совсем немножко моргает. Но в моей программе 3 стрелки и графика (выше приведен только фрагмент) и мигает довольно часто. Можно ли сделать так чтобы изображение "циферблат1.jpg" не выводить каждый раз, а вывести его один раз. Например сначала. Чтобы если уж мигало, то пусть не все мигает, а только стрелки. Это как нибудь можно сделать?
Отредактировано Иван (28.06.2011 04:19:17)
Как видно, я загружаю изображение циферблата, рисую на нем стрелку и вывожу на экран. Проблема в том что так как я вывожу новое изображение каждую секунду совсем немножко моргает.
Не нужно пересоздавать ImageGadget каждый раз.
Тогда мигать не будет.
Procedure Timer1() date=Date() hour=Hour(date) min=Minute(date) sek=Second(date) If CopyImage(1,0) StartDrawing(ImageOutput(0)) Select sek Case 0 LineXY(99,19,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(99-100)/3,100-(19-100)/3,RGB(181, 26, 19)) Case -1+2 LineXY(108,19,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(108-100)/3,100-(19-100)/3,RGB(181, 26, 19)) Case -1+3 LineXY(117,22,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(117-100)/3,100-(22-100)/3,RGB(181, 26, 19)) Case -1+4 LineXY(124,24,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(124-100)/3,100-(24-100)/3,RGB(181, 26, 19)) Case -1+5 LineXY(133,26,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(133-100)/3,100-(26-100)/3,RGB(181, 26, 19)) Case -1+6 LineXY(141,30,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(141-100)/3,100-(30-100)/3,RGB(181, 26, 19)) Case -1+7 LineXY(148,36,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(148-100)/3,100-(36-100)/3,RGB(181, 26, 19)) Case -1+8 LineXY(155,41,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(155-100)/3,100-(41-100)/3,RGB(181, 26, 19)) Case -1+9 LineXY(160,47,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(160-100)/3,100-(47-100)/3,RGB(181, 26, 19)) Case -1+10 LineXY(166,54,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(166-100)/3,100-(54-100)/3,RGB(181, 26, 19)) Case -1+11 LineXY(171,61,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(171-100)/3,100-(61-100)/3,RGB(181, 26, 19)) Case -1+12 LineXY(174,69,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(174-100)/3,100-(69-100)/3,RGB(181, 26, 19)) Case -1+13 LineXY(178,77,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(178-100)/3,100-(77-100)/3,RGB(181, 26, 19)) Case -1+14 LineXY(180,86,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(180-100)/3,100-(86-100)/3,RGB(181, 26, 19)) Case -1+15 LineXY(181,93,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(181-100)/3,100-(93-100)/3,RGB(181, 26, 19)) Case -1+16 LineXY(181,102,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(181-100)/3,100-(102-100)/3,RGB(181, 26, 19)) Case -1+17 LineXY(180,111,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(180-100)/3,100-(111-100)/3,RGB(181, 26, 19)) Case -1+18 LineXY(178,118,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(178-100)/3,100-(118-100)/3,RGB(181, 26, 19)) Case -1+19 LineXY(177,128,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(177-100)/3,100-(128-100)/3,RGB(181, 26, 19)) Case -1+20 LineXY(173,135,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(173-100)/3,100-(135-100)/3,RGB(181, 26, 19)) Case -1+21 LineXY(170,141,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(170-100)/3,100-(141-100)/3,RGB(181, 26, 19)) Case -1+22 LineXY(164,149,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(164-100)/3,100-(149-100)/3,RGB(181, 26, 19)) Case -1+23 LineXY(159,155,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(159-100)/3,100-(155-100)/3,RGB(181, 26, 19)) Case -1+24 LineXY(154,161,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(154-100)/3,100-(161-100)/3,RGB(181, 26, 19)) Case -1+25 LineXY(147,167,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(147-100)/3,100-(167-100)/3,RGB(181, 26, 19)) Case -1+26 LineXY(140,172,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(140-100)/3,100-(172-100)/3,RGB(181, 26, 19)) Case -1+27 LineXY(132,176,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(132-100)/3,100-(176-100)/3,RGB(181, 26, 19)) Case -1+28 LineXY(126,177,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(126-100)/3,100-(177-100)/3,RGB(181, 26, 19)) Case -1+29 LineXY(116,181,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(116-100)/3,100-(181-100)/3,RGB(181, 26, 19)) Case -1+30 LineXY(109,181,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(109-100)/3,100-(181-100)/3,RGB(181, 26, 19)) Case -1+31 LineXY(98,183,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(98-100)/3,100-(183-100)/3,RGB(181, 26, 19)) Case -1+32 LineXY(91,182,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(91-100)/3,100-(182-100)/3,RGB(181, 26, 19)) Case -1+33 LineXY(83,182,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(83-100)/3,100-(182-100)/3,RGB(181, 26, 19)) Case -1+34 LineXY(73,179,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(73-100)/3,100-(179-100)/3,RGB(181, 26, 19)) Case -1+35 LineXY(66,177,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(66-100)/3,100-(177-100)/3,RGB(181, 26, 19)) Case -1+36 LineXY(58,172,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(58-100)/3,100-(172-100)/3,RGB(181, 26, 19)) Case -1+37 LineXY(52,169,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(52-100)/3,100-(169-100)/3,RGB(181, 26, 19)) Case -1+38 LineXY(45,163,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(45-100)/3,100-(163-100)/3,RGB(181, 26, 19)) Case -1+39 LineXY(39,157,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(39-100)/3,100-(157-100)/3,RGB(181, 26, 19)) Case -1+40 LineXY(33,150,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(33-100)/3,100-(150-100)/3,RGB(181, 26, 19)) Case -1+41 LineXY(29,142,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(29-100)/3,100-(142-100)/3,RGB(181, 26, 19)) Case -1+42 LineXY(25,135,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(25-100)/3,100-(135-100)/3,RGB(181, 26, 19)) Case -1+43 LineXY(23,128,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(23-100)/3,100-(128-100)/3,RGB(181, 26, 19)) Case -1+44 LineXY(19,120,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(19-100)/3,100-(120-100)/3,RGB(181, 26, 19)) Case -1+45 LineXY(18,111,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(18-100)/3,100-(111-100)/3,RGB(181, 26, 19)) Case -1+46 LineXY(17,103,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(17-100)/3,100-(103-100)/3,RGB(181, 26, 19)) Case -1+47 LineXY(18,96,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(18-100)/3,100-(96-100)/3,RGB(181, 26, 19)) Case -1+48 LineXY(20,86,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(20-100)/3,100-(86-100)/3,RGB(181, 26, 19)) Case -1+49 LineXY(21,78,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(21-100)/3,100-(78-100)/3,RGB(181, 26, 19)) Case -1+50 LineXY(23,70,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(23-100)/3,100-(70-100)/3,RGB(181, 26, 19)) Case -1+51 LineXY(27,60,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(27-100)/3,100-(60-100)/3,RGB(181, 26, 19)) Case -1+52 LineXY(32,53,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(32-100)/3,100-(53-100)/3,RGB(181, 26, 19)) Case -1+53 LineXY(37,48,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(37-100)/3,100-(48-100)/3,RGB(181, 26, 19)) Case -1+54 LineXY(44,42,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(44-100)/3,100-(42-100)/3,RGB(181, 26, 19)) Case -1+55 LineXY(51,36,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(51-100)/3,100-(36-100)/3,RGB(181, 26, 19)) Case -1+56 LineXY(58,30,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(58-100)/3,100-(30-100)/3,RGB(181, 26, 19)) Case -1+57 LineXY(66,27,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(66-100)/3,100-(27-100)/3,RGB(181, 26, 19)) Case -1+58 LineXY(73,23,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(73-100)/3,100-(23-100)/3,RGB(181, 26, 19)) Case -1+59 LineXY(83,21,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(83-100)/3,100-(21-100)/3,RGB(181, 26, 19)) Case -1+60 LineXY(91,19,100,100,RGB(181, 26, 19)) LineXY(100,100,100-(91-100)/3,100-(19-100)/3,RGB(181, 26, 19)) EndSelect StopDrawing() SetGadgetState(0, ImageID(0)) EndIf EndProcedure UseJPEGImageDecoder() If LoadImage(1, "фон22.jpg") = 0 MessageRequester("", "Нет фонового рисунка", #MB_OK|#MB_ICONERROR) End EndIf OpenWindow(0, 0, 0, 200, 200, "Часы", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) ImageGadget(0, 0, 0, 200, 200, 0) Timer1() SetTimer_(WindowID(0), 2, 1000, @Timer1()) Repeat Event = WaitWindowEvent() Until Event = #PB_Event_CloseWindow
PS.
Вот часики для примера, может будет полезным http://purebasic.info/phpBB2/download.php?id=404
как продолжить оператор на несколько строк?
Case #Button_4,#Button_6,#Button_8,#Button_9,#Button_10,#Button_13,#Button_14,#Button_15,#Button_21,#Button_22, _
#Button_24
дает ошибку. Без символа подчеркивания то же самое.
как продолжить оператор на несколько строк?
Можно так
как продолжить оператор на несколько строк?
Case #Button_4,#Button_6,#Button_8,#Button_9,#Button_10,#Button_13,#Button_14,#Button_15,#Button_21,#Button_22, _ #Button_24
В данном случае, можно сделать проще.
При присвоении значений комнатам, сделать так, что бы все используемые в Case шли друг за другом
Enumeration ; Предыдущие константы #Button_4 #Button_6 #Button_8 #Button_9 #Button_10 #Button_13 #Button_14 #Button_15 #Button_21 #Button_22 #Button_24 ; Следующие константы EndEnumeration
и написать так
Case #Button_4 To #Button_24
lakomet, я в шоке. Пусть лучше строки будут длинными.
Пётр
такое я пробовал. Думал это некрасивое решение - ведь при изменении формы дизайнером он перепишет все заново.
Попутно: можно ли таким списком оперировать с помощью ForEach ?
можно ли таким списком оперировать с помощью ForEach
Нет, это просто константы.
ForEach работает с динамически связанным списком, создаваемым оператором NewList.
Подскажите, как организовать прием данных из сом-порта.
Вот основной цикл программы
Repeat Event = WaitWindowEvent() If Event = #PB_Event_Gadget IncludeFile "event1.pb" Else If IsSerialPort(2)>0 ;проверка порта, получение данных из устройства If AvailableSerialPortInput(2)>=5 Result2 = ReadSerialPortData(2, @ddt, 1) ;91 ? ... EndIf EndIf EndIf Until Event = #PB_Event_CloseWindow
В результате он ждет событий в окне и обращается к приему данных только
когда в этом окне что-то происходит.
Как сделать, чтобы он постоянно опрашивал порт и не нагружал процессор?
Нужно использовать таймер.
AddWindowTimer(0,0,10) ; Окно с ИД 0, Таймер с ИД 0, время - 10 мс. Repeat Event = WaitWindowEvent() If Event = #PB_Event_Gadget IncludeFile "event1.pb" ElseIf Event = #PB_Event_Timer And EventTimer() = 0 If IsSerialPort(2)>0 ;проверка порта, получение данных из устройства If AvailableSerialPortInput(2)>=5 Result2 = ReadSerialPortData(2, @ddt, 1) ;91 ? ... EndIf EndIf EndIf Until Event = #PB_Event_CloseWindow
Только нужно учитывать тот факт что если тащить окно за заголовок, то в этот момент не будут возникать события таймера.
Если это критично, то таймер нужно создать при помощи WinAPI функции SetTimer и назначить ему процедуру, вызываемую по таймеру.
PS.
Зачем подключать дополнительный исходный файл "event1.pb" в обработчике событий?
Пётр, спасибо.
Из-за того, что обработчик не выбирает все что есть из буфера получилось забавно: двигатель уже остановился, а информация о его положении все еще продолжает доставляться пару секунд : )
Это кусок основного файла проекта из которого выделил обработку событий в отдельный файл. А что, обычно делают иначе?
Файлы с исходным текстом обычно подключают директивой IncludeFile в начале кода, а не в обработчике событий.
Из-за того, что обработчик не выбирает все что есть из буфера получилось забавно: двигатель уже остановился, а информация о его положении все еще продолжает доставляться пару секунд : )
Это не обработчик, а код не выбирает все.
IncludeFile "event1.pb" ; Подключать исходники нужно в начале кода. AddWindowTimer(0,0,10) ; Окно с ИД 0, Таймер с ИД 0, время - 10 мс. Repeat Event = WaitWindowEvent() If Event = #PB_Event_Gadget ElseIf Event = #PB_Event_Timer And EventTimer() = 0 If IsSerialPort(2)>0 ;проверка порта, получение данных из устройства. CountBytes = AvailableSerialPortInput(2) If CountBytes>=5 *mem = AllocateMemory(CountBytes) ; Память под данные из порта. If *mem ; ОК, запрошеная память получена. Result2 = ReadSerialPortData(2, *mem, CountBytes) ;91 ? ; Тут обрабатываем данные порта, находящиеся в памяти. FreeMemory(*mem) ; Когда данные обработали, освобождаем память. EndIf ... EndIf EndIf EndIf Until Event = #PB_Event_CloseWindow
Это не обработчик, а код не выбирает все.
Ну я примерно это и хотел сказать. Только собирался решать зациклив тот кусок, где выясняется есть ли 5 байт на отдачу.
Файлы с исходным текстом обычно подключают директивой IncludeFile в начале кода
Вот это поясните пожалуйста. У меня же не идет речь о наборе констант или чем-либо такого рода. И не о процедуре. Имеется кусок кода, который должен быть расположен именно в том месте, где я написал эту директиву. Конечно, можно его сложить с помощью ;{ но имхо удобнее выделить его в отдельный файл.
Имеется кусок кода, который должен быть расположен именно в том месте
А, ну тогда все правильно.
Не знал этого.
Здравствуйте, как можно сделать кнопки, editirgadget stringgadget сделать неактивными, чтобы были видны, но нельзя воспользоваться?
DisableGadget.
Пётр, благодарю.
У меня ещё один вопрос, есть EditorGadget и кнопка на форме, кнопка при загрузке приложения не активно и становится активным только после того, как было что либо введено в EditorGadget, соответственно, если стёрли, то и кнопка перестала быть активной. Можно через вечный цикл сделать и отслеживать постоянно введено что либо в EditorGadget, или нет? Но есть ли в PureBasic другой способ отслеживать это? А то цикл добавлять не хочется.
У меня ещё один вопрос, есть EditorGadget и кнопка на форме, кнопка при загрузке приложения не активно и становится активным только после того, как было что либо введено в EditorGadget, соответственно, если стёрли, то и кнопка перестала быть активной. Можно через вечный цикл сделать и отслеживать постоянно введено что либо в EditorGadget, или нет? Но есть ли в PureBasic другой способ отслеживать это? А то цикл добавлять не хочется.
Так у тебя в программе и так есть главный цикл, туда можно поставить:
If GetGadgetText(#Editor_0) > "" DisableGadget(#Button_1,0) Else DisableGadget(#Button_1,1) EndIf
Но лучше этот код поставить в обработку события EditorGadget.
Проверяй по таймеру есть там текст или нет.
Число символов можно получить так:
If OpenWindow(0, 0, 0, 322, 150, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) EditorGadget(0, 8, 8, 306, 133) Debug SendMessage_(GadgetID(0), #EM_GETTEXTLENGTHEX, @TextLength, #Null) SetGadgetText(0,"1234") Debug SendMessage_(GadgetID(0), #EM_GETTEXTLENGTHEX, @TextLength, #Null) Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow EndIf
Здравствуйте, скажите пожалуйста как прочитать данные из txt файла.А то весь форум просмотрел ничего стоящего не нашёл.
.А то весь форум просмотрел ничего стоящего не нашёл.
Прикалываешся?
Светодиодная матрица - МОДЖЕТ (антигаджет) на Пурике
Какая версия? | OffTop | 03.10.2021 |
Мне постоянно пищет вот это | Вопросы по PureBasic | 14.10.2011 |
Размер экрана в пикселях | Вопросы по PureBasic | 13.02.2011 |
консоль | Вопросы по PureBasic | 19.03.2015 |
Полноэкранные приложения на purebasic | Вопросы по PureBasic | 08.03.2011 |
Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка (продолжение…)