purebasic.info

PureBasic forum
Текущее время: Пн дек 11, 2017 4:38 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Самописец
СообщениеДобавлено: Сб дек 12, 2015 10:00 am 
Не в сети
ассистент

Зарегистрирован: Пн мар 30, 2015 5:48 pm
Сообщений: 22
Благодарил (а): 16 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Всем привет!
Ситуация такая: программа последовательно опрашивает 2 прибора. Приборы отправляют значение измеряемой величины (давление в разных объемах), программа фиксирует эти значения и время прихода в гаджет листах.
Хочу сделать динамическое отображение измеряемых величин на графике (что-то типа самописца). Ось Х – время прихода измеряемой величины, ось Y – значение измеряемой величины. Как рационально это можно реализовать? Может есть какие-то уже готовые инструменты для этого?
Спасибо!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Самописец
СообщениеДобавлено: Сб дек 12, 2015 12:05 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11069
Благодарил (а): 4 раз.
Поблагодарили: 381 раз.
Ссылки по теме. http://www.cyberforum.ru/pure-basic/thread622432.html
В этой программе также есть график. http://pbtorrent.ucoz.ru/pbsc/Source_pbTorrent_1_2.zip

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Самописец
СообщениеДобавлено: Ср дек 16, 2015 3:07 pm 
Не в сети
ассистент

Зарегистрирован: Пн мар 30, 2015 5:48 pm
Сообщений: 22
Благодарил (а): 16 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр, спасибо за примеры! Обратил внимание на пример с бегунком, хочу сделать что-то подобное.

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
Structure Meter 
  PBimg.l
  width.l
  height.l
  offset.l
  values.l[1024]
EndStructure
 
 
 
#WM_UPDATEMETER   = #WM_USER+1500
#WM_SETFGCOLOR   = #WM_USER+1501
#WM_SETBGCOLOR   = #WM_USER+1502
#WM_SETGDCOLOR   = #WM_USER+1503
#WM_SETBDCOLOR   = #WM_USER+1504
#WM_FILLED      = #WM_USER+1506
#WM_PEAK         = #WM_USER+1507
 
 
Procedure MeterProc(hwnd,msg,wParam,lParam)
  Select msg
    Case #WM_UPDATEMETER
      *mr.Meter=GetWindowLong_(hwnd,#GWL_USERDATA)
      If *mr\offset=10
        *mr\offset=0
      EndIf
      For d=0 To *mr\width-1
        *mr\values[d]=*mr\values[d+1]
      Next  
      *mr\values[*mr\width-1]=lParam
      StartDrawing(ImageOutput(*mr\PBimg))
      Box(0,0,*mr\width,*mr\height,#Black)
      For a=0 To *mr\height Step 10
        LineXY(0,a,*mr\width,a,$7F00)
      Next
      For a=0 To *mr\width+*mr\offset Step 10
        LineXY(a-*mr\offset,0,a-*mr\offset,*mr\height,$7F00)
      Next
      For d=0 To *mr\width
        bottom.l=*mr\height
        thepercent.f=(*mr\values[d]/100)
        actualheight.l=Int(thepercent* *mr\height)
        Y1.l=bottom-actualheight
        thepercent.f=(*mr\values[d+1]/100)
        actualheight.l=Int(thepercent* *mr\height)
        Y2.l=bottom-actualheight
         LineXY(d,Y1,d+1,Y2,$FF00)
      Next
      *mr\offset+1
      StopDrawing()
      SetWindowLong_(hwnd,#GWL_USERDATA,*mr)
      SendMessage_(hwnd,#STM_SETIMAGE,#IMAGE_BITMAP,ImageID(*mr\PBimg))
  EndSelect
  ProcedureReturn CallWindowProc_(GetProp_(hwnd,"oldproc"),hwnd,msg,wParam,lParam)
EndProcedure
 
Procedure MeterControl(id.l,x,Y,width,height)
  image=CreateImage(#PB_Any,width,height)
  StartDrawing(ImageOutput(image))
  Box(0,0,width,height,#Black)
  For a=0 To height Step 10
    LineXY(0,a,width,a,$7F00)
  Next
  For a=0 To width Step 10
    LineXY(a,0,a,height,$7F00)
  Next
  StopDrawing()
  imagegad.l=ImageGadget(id,x,Y,width,height,ImageID(image),#PB_Image_Border)
  SetProp_(GadgetID(imagegad),"oldproc",SetWindowLong_(GadgetID(imagegad),#GWL_WNDPROC,@MeterProc()))
  If id=#PB_Any
    hwndreturn=imagegad
    hwnd=GadgetID(imagegad)
  Else
    hwndreturn=imagegad
    hwnd=imagegad
  EndIf
  *mtr.Meter=AllocateMemory(SizeOf(Meter))
  *mtr\PBimg=image
  *mtr\width=width
  *mtr\height=height
  SetWindowLong_(hwnd,#GWL_USERDATA,*mtr)
  ProcedureReturn hwndreturn
EndProcedure
 
Procedure GetMeterImage(id.l)
  *mr.Meter=GetWindowLong_(GadgetID(id),#GWL_USERDATA)
  bitmapreturn.l=*mr\PBimg
  ProcedureReturn bitmapreturn
EndProcedure
 
OpenWindow(0,0,0,470,460,"Meter Control",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
themeter.l=MeterControl(#PB_Any,90,10,290,200)
TrackBarGadget(20,110,300,260,30,0,100)
ButtonGadget(21,160,350,140,20,"Save Meter Image")
Repeat
 
  Select WaitWindowEvent()
    Case #PB_Event_Gadget
      SendMessage_(GadgetID(themeter),#WM_UPDATEMETER,0,GetGadgetState(20))
      Select EventGadget()
        Case 21
          Pattern$ + "Bitmap (*.bmp)|*.bmp|"
          Pattern = 0    
          filename.s=SaveFileRequester("Please Choose The File Name To Save", "", Pattern$, Pattern)
          If filename
            If GetExtensionPart(filename)<>"bmp"
              filename+".bmp"
            EndIf
            SaveImage(GetMeterImage(themeter),filename,#PB_ImagePlugin_BMP)
          EndIf
      EndSelect
    Case #PB_Event_CloseWindow
     
      Quit=1
  EndSelect
Until Quit=1



Есть несколько вопросов по применению API-функций в этом примере. Хотелось бы разобраться в логике, как эти функции работают с окнами, объектами, отправляют какие-то сообщения… Поясните пожалуйста логику работы этих функций (в описании очень кратко написано).
1. 23 строчка:
*mr.Meter=GetWindowLong_(hwnd,#GWL_USERDATA)
Из описания: «Считывает инфоpмацию об окне или о значениях дополнительного байта окна». Какую информацию и что за константа #GWL_USERDATA?
2. 51 строчка:
SetWindowLong_(hwnd,#GWL_USERDATA,*mr)
Из описания: «Заменяет для окна атpибут стpуктуpы класса окна новым значением.» Что здесь происходит?
3. 52 строчка:
SendMessage_(hwnd,#STM_SETIMAGE,#IMAGE_BITMAP,ImageID(*mr\PBimg))
Из описания: «Посылает сообщение оконной функции указанного окна. Возвpат из функции осуществляется только после обpаботки сообщения.» Окно может принимать сообщения? Какие сообщения?
4. 54 строчка:
CallWindowProc_(GetProp_(hwnd,"oldproc"),hwnd,msg,wParam,lParam)
Из описания: «Вызывает и пеpедает инфоpмацию сообщения в PrevWndProc. Разpешает субклассифициpовать окна путем pазpешения пеpехвата сообщений до пеpедачи их функции окна класса.» Как это работает?
5. Что это за константы?
#WM_UPDATEMETER = #WM_USER+1500
#WM_SETFGCOLOR = #WM_USER+1501
#WM_SETBGCOLOR = #WM_USER+1502
#WM_SETGDCOLOR = #WM_USER+1503
#WM_SETBDCOLOR = #WM_USER+1504
#WM_FILLED = #WM_USER+1506
#WM_PEAK = #WM_USER+1507

P.S. У меня есть общие представления о классах (структурах), объектах…
Спасибо :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Самописец
СообщениеДобавлено: Чт дек 17, 2015 6:01 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11069
Благодарил (а): 4 раз.
Поблагодарили: 381 раз.
Этот пример написан давно. Его можно было написать без использования WinAPI потому что реальной необходимости в этом небыло.
Переписал код заменив ImageGadget на CanvasGadget.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
Structure Meter 
  ID.i
  width.i
  height.i
  offset.i
  values.l[1024]
EndStructure
 
Procedure Redraw(id, Info)
 
  *mr.Meter=GetGadgetData(id)
  If *mr\offset=10
    *mr\offset=0
  EndIf
  For d=0 To *mr\width-1
    *mr\values[d]=*mr\values[d+1]
  Next  
  *mr\values[*mr\width-1]=Info
  StartDrawing(CanvasOutput(id))
  Box(0,0,*mr\width,*mr\height,#Black)
  For a=0 To *mr\height Step 10
    LineXY(0,a,*mr\width,a,$7F00)
  Next
  For a=0 To *mr\width+*mr\offset Step 10
    LineXY(a-*mr\offset,0,a-*mr\offset,*mr\height,$7F00)
  Next
  For d=0 To *mr\width
    bottom=*mr\height
    thepercent.f=(*mr\values[d]/100)
    actualheight=Int(thepercent* *mr\height)
    Y1=bottom-actualheight
    thepercent.f=(*mr\values[d+1]/100)
    actualheight=Int(thepercent* *mr\height)
    Y2=bottom-actualheight
    LineXY(d,Y1,d+1,Y2,$FF00)
  Next
  *mr\offset+1
  StopDrawing()
 
EndProcedure
 
Procedure MeterControl(id,x,Y,width,height)
  imagegad=CanvasGadget(id,x,Y,width,height)
   
  If id=#PB_Any
    id=imagegad
  EndIf
 
  StartDrawing(CanvasOutput(id))
  Box(0,0,width,height,#Black)
  For a=0 To height Step 10
    LineXY(0,a,width,a,$7F00)
  Next
  For a=0 To width Step 10
    LineXY(a,0,a,height,$7F00)
  Next
  StopDrawing()
 
  *mtr.Meter=AllocateMemory(SizeOf(Meter))
  *mtr\ID=id
  *mtr\width=width
  *mtr\height=height
  SetGadgetData(id, *mtr)
 
  ProcedureReturn imagegad
EndProcedure
 
Procedure GetMeterImage(id)
  ProcedureReturn GetGadgetAttribute(id, #PB_Canvas_Image)
EndProcedure
 
OpenWindow(0,0,0,470,460,"Meter Control",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
themeter=MeterControl(#PB_Any,90,10,290,200)
TrackBarGadget(20,110,300,260,30,0,100)
;ButtonGadget(21,160,350,140,20,"Save Meter Image")
Repeat
 
  Select WaitWindowEvent()
    Case #PB_Event_Gadget
     
      Select EventGadget()
        Case 20
          Redraw(themeter, GetGadgetState(20))
;         Case 21
;           Pattern$ + "Bitmap (*.bmp)|*.bmp|"
;           Pattern = 0    
;           filename.s=SaveFileRequester("Please Choose The File Name To Save", "", Pattern$, Pattern)
;           If filename
;             If GetExtensionPart(filename)<>"bmp"
;               filename+".bmp"
;             EndIf
;             SaveImage(GetMeterImage(themeter),filename,#PB_ImagePlugin_BMP)
;           EndIf
      EndSelect
    Case #PB_Event_CloseWindow
      Break
  EndSelect
 
ForEver


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Самописец
СообщениеДобавлено: Чт дек 17, 2015 7:54 pm 
Не в сети
ассистент

Зарегистрирован: Пн мар 30, 2015 5:48 pm
Сообщений: 22
Благодарил (а): 16 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Благодарю! Буду разбираться..


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Самописец
СообщениеДобавлено: Сб сен 16, 2017 1:22 pm 
Не в сети
ассистент

Зарегистрирован: Пн мар 30, 2015 5:48 pm
Сообщений: 22
Благодарил (а): 16 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Всем привет!
Решил немного развить тему. Сделал графическое отображение измеряемых величин по примеру (см. выше). Хочется добавить 2 горизонтальных курсора на графической области, причем делать это мышью. Левой кнопкой мыши выставлять курсор 1, правой - курсор 2. Я предполагаю, что надо как-то перехватывать координаты курсора мыши именно внутри графической области.
Подскажите пожалуйста самый рациональный путь решения задачи.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Самописец
СообщениеДобавлено: Сб сен 16, 2017 2:10 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11069
Благодарил (а): 4 раз.
Поблагодарили: 381 раз.
CanvasGadget имеет стандартные средства для определения позиции курсора и состояния кнопок мышки. https://www.purebasic.com/documentation ... adget.html
Пример в конце страницы показывает как это сделать.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB