PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Рисованный интерфейс программы


Рисованный интерфейс программы

Сообщений 121 страница 150 из 302

121

Я ведь выше писал что при таком упрощенном варианте, идентификаторы гаджетов и рисунков-бегунков должны совпадать.
А совпадают ли они в этом коде?
Когда вскочит ошибка, отладчик остановит программу. В этот момент нужно навести кусор на #Window_5 и #Window_4 и посмотреть что там. Затем сравнить с идентификаторам гаджетов.

И в коде я не увидел загрузки нескольких рисунков-бегунков для каждого гаджета. Там только один.

0

122

Пётр написал(а):

И в коде я не увидел загрузки нескольких рисунков-бегунков для каждого гаджета. Там только один.

Добавил второй рисунок и ошибка ушла.

0

123

Попробовал перенести слайдеры на основное окно. Изображения рисуются поверх основного окна. Решил сделать один общий фон для шести слайдеров, но возникла проблема: фон с каждым новым CanvasGadget рисуется заново. Можно ли сделать один фон для слайдеров? Код и картинки.

0

124

max написал(а):

Можно ли сделать один фон для слайдеров?

Можно, но тогда придется все поместить в один CanvasGadget.
Не понимаю что мешает сделать раздельный фон для каждого регулятора?

И эту строку:

Код:
If Gadget=1 Or Gadget=2 Or Gadget=3 Or Gadget=4 Or Gadget=5 Or Gadget=6

рациональнее записать так:

Код:
If Gadget>=1 And Gadget<=6

0

125

Пётр написал(а):

Не понимаю что мешает сделать раздельный фон для каждого регулятора?

В принципе ничего. Так как рисунок теперь такой:
http://uploads.ru/i/x/h/M/xhM9w.png
придется обрезать его до такого:
http://uploads.ru/i/X/y/z/XyzTe.png
Сейчас попробую.

Пётр написал(а):

рациональнее записать так:

Согласен.

Отредактировано max (05.05.2012 20:11:34)

0

126

Добавил опрос регуляторов в основную прогу:

Код:
Repeat
  Event =  WaitWindowEvent() 
  Window = EventWindow() 
  Gadget = EventGadget()
  Close_0(Event)
  
  If Event = #PB_Event_SysTray 
    If EventType() = #PB_EventType_RightClick ; Обработка правой кнопки мышки 
      DisplayPopupMenu(26, WindowID(#Window_0)) ; показ вспывающего меню 
    EndIf 
    If EventType() = #PB_EventType_LeftClick
      
      HideWindow(#Window_0, 0)
      SetWindowState(#Window_0, #PB_Window_Normal) 
    EndIf
  EndIf
  
  If Event = #PB_Event_Menu 
    Select EventMenu() 
      Case 1 ;"Развернуть"  
        HideWindow(0, 0)
        SetWindowState(0, #PB_Window_Normal)     
      Case 2 ;"Свернуть" 
        HideWindow(0, 1)
      Case 10 ;"Выход"
        Break
    EndSelect 
  EndIf 
  
  If Event = #PB_Event_Gadget
    Gadget=EventGadget()
    If Gadget>=21 And Gadget<=30
      Type = EventType()
      
      If Type = #PB_EventType_LeftClick Or (Type = #PB_EventType_MouseMove And GetGadgetAttribute(Gadget, #PB_Canvas_Buttons) = #PB_Canvas_LeftButton)
        x=GetGadgetAttribute(Gadget, #PB_Canvas_MouseX)-12
        If x<0 : x=0 : EndIf
        If x>80-24 : x = 80-24 : EndIf
        Draw_x(x, 0, Gadget, ImageID(Gadget))
      EndIf
      
    EndIf
      
    EndIf
    
  
  Select Event
    Case #PB_Event_Gadget
      Type=EventType()
      
      ; Нем не нужны другие события ImageGadget'ов.
      If Type=#PB_EventType_LeftClick ;Or Type=#PB_EventType_LeftDoubleClick
        Select Gadget 
            
          Case 5
            ButtonClick(Type, G_ButtonInfo\Pause\State, G_ButtonInfo\Pause\MouseOver, 5, #Light_Pause)
            ;MessageRequester("Информация", "Была нажата кнопка", #PB_MessageRequester_Ok)
          Case 6
            ButtonClick(Type, G_ButtonInfo\Power\State, G_ButtonInfo\Power\MouseOver, 6, #Light_Power)
            Delay(300)
            Break
          Case 7
            SetCursor_(IDC_HAND)
            SetGadgetState(7, ImageID(#Light_Mode))
            ;MessageRequester("Информация", "Была нажата кнопка", #PB_MessageRequester_Ok)
          Case 8
            ButtonClick(Type, G_ButtonInfo\Tune\State, G_ButtonInfo\Tune\MouseOver, 8, #Light_Tune)
               Tog = Tog ! 1
               If Tog
               ResizeWindow(#Window_0, #PB_Ignore, #PB_Ignore, #PB_Ignore, 389)
               Else
               ResizeWindow(#Window_0, #PB_Ignore, #PB_Ignore, #PB_Ignore, 195)
               EndIf
          Case 9
            SetCursor_(IDC_HAND)
            SetGadgetState(9, ImageID(#Light_Battery))
            ;MessageRequester("Информация", "Была нажата кнопка", #PB_MessageRequester_Ok)
          Case 13
            SetCursor_(IDC_HAND) 
            Delay(300)
            HideWindow(#Window_0, 1)
         Case 16
            SetCursor_(IDC_HAND) 
            ShellExecute_(0, "Open", "Rundll32.exe", "shell32,Control_RunDLL mmsys.cpl,  ,2", "", #SW_SHOWNORMAL)

        EndSelect
        
      EndIf
      
      Select Gadget
        Case 10
          If Type=#Knob_EventType
            Debug KnobGadget_State(10)
          EndIf
          
        Case 11
          If Type=#Knob_EventType
            Debug KnobGadget_State(11)
          EndIf
      EndSelect
      
  EndSelect   
  
Until Event = #PB_Event_CloseWindow ;Конец главного цикла

а они никак не реагируют на движения курсора.

0

127

У них точно идентификаторы от 21 до 30?
И есть ли в программы рисунки с идентификаторами от 21 до 30?

0

128

Пётр написал(а):

У них точно идентификаторы от 21 до 30?

Да.

Код:
CanvasGadget(21, 135, 299, 80, 15)
Draw_x(0, 0, 21, ImageID(#H_knob1))
CanvasGadget(22, 135, 314, 80, 15)
Draw_x(0, 0, 22,  ImageID(#H_knob2))
CanvasGadget(23, 135, 329, 80, 15)
Draw_x(0, 0, 23, ImageID(#H_knob3))
CanvasGadget(24, 135, 344, 80, 15)
Draw_x(0, 0, 24,  ImageID(#H_knob4))
CanvasGadget(25, 135, 359, 80, 15)
Draw_x(0, 0, 25, ImageID(#H_knob5))
CanvasGadget(26, 222, 299, 80, 15)
Draw_x(0, 0, 26, ImageID(#H_knob6))
CanvasGadget(27, 222, 314, 80, 15)
Draw_x(0, 0, 27,  ImageID(#H_knob7))
CanvasGadget(28, 222, 329, 80, 15)
Draw_x(0, 0, 28, ImageID(#H_knob8))
CanvasGadget(29, 222, 344, 80, 15)
Draw_x(0, 0, 29,  ImageID(#H_knob9))
CanvasGadget(30, 219, 359, 80, 15)
Draw_x(0, 0, 30, ImageID(#H_knob10))
Пётр написал(а):

И есть ли в программы рисунки с идентификаторами от 21 до 30?

Если в DataSection они считываются по порядку, то да.
В исходном коде сделал так:

Код:
Enumeration 
  #H_track
  #H_knob1
  #H_knob2
  #H_knob3
  #H_knob4
  #H_knob5
  #H_knob6
  #H_knob7
  #H_knob8
  #H_knob9
  #H_knob10  
EndEnumeration

UsePNGImageDecoder()

CatchImage(#H_track, ?H_track)   
CatchImage(#H_knob1, ?H_knob1) 
CatchImage(#H_knob2, ?H_knob2) 
CatchImage(#H_knob3, ?H_knob3)   
CatchImage(#H_knob4, ?H_knob4) 
CatchImage(#H_knob5, ?H_knob5)
CatchImage(#H_knob6, ?H_knob6) 
CatchImage(#H_knob7, ?H_knob7) 
CatchImage(#H_knob8, ?H_knob8)   
CatchImage(#H_knob9, ?H_knob9) 
CatchImage(#H_knob10, ?H_knob10)

Procedure Draw_x(x, y, Gadget, ImageID)
  StartDrawing(CanvasOutput(Gadget))
  DrawImage(ImageID(#H_track), 0, 0)
  DrawAlphaImage(ImageID, x, y)
  StopDrawing()
EndProcedure


OpenWindow(0, 0, 0, 258, 123, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CanvasGadget(21, 5, 15, 80, 15)
Draw_x(0, 0, 21, ImageID(#H_knob1))
CanvasGadget(22, 5, 30, 80, 15)
Draw_x(0, 0, 22,  ImageID(#H_knob2))
CanvasGadget(23, 5, 45, 80, 15)
Draw_x(0, 0, 23, ImageID(#H_knob3))
CanvasGadget(24, 5, 60, 80, 15)
Draw_x(0, 0, 24,  ImageID(#H_knob4))
CanvasGadget(25, 5, 75, 80, 15)
Draw_x(0, 0, 25, ImageID(#H_knob5))
CanvasGadget(26, 89, 15, 80, 15)
Draw_x(0, 0, 26, ImageID(#H_knob6))
CanvasGadget(27, 89, 30, 80, 15)
Draw_x(0, 0, 27,  ImageID(#H_knob7))
CanvasGadget(28, 89, 45, 80, 15)
Draw_x(0, 0, 28, ImageID(#H_knob8))
CanvasGadget(29, 89, 60, 80, 15)
Draw_x(0, 0, 29,  ImageID(#H_knob9))
CanvasGadget(30, 89, 75, 80, 15)
Draw_x(0, 0, 30, ImageID(#H_knob10))


Repeat
  Event = WaitWindowEvent()
  
  If Event = #PB_Event_Gadget
    Gadget=EventGadget()
    If Gadget>=21 And Gadget<=30
      Type = EventType()
      
      If Type = #PB_EventType_LeftClick Or (Type = #PB_EventType_MouseMove And GetGadgetAttribute(Gadget, #PB_Canvas_Buttons) = #PB_Canvas_LeftButton)
        x=GetGadgetAttribute(Gadget, #PB_Canvas_MouseX)-12
        If x<0 : x=0 : EndIf
        If x>80-24 : x = 80-24 : EndIf
        Draw_x(x, 0, Gadget, ImageID(Gadget))
      EndIf
      
    EndIf
    
  EndIf
  
  
Until Event = #PB_Event_CloseWindow


DataSection
  ;{ ресурсы
  H_track:
  IncludeBinary "Horizontal1.png"
  
  H_knob1:
  IncludeBinary "H-knob1.png"
  
  H_knob2:
  IncludeBinary "H-knob1.png"
  
  H_knob3:
  IncludeBinary "H-knob1.png"
  
  H_knob4:
  IncludeBinary "H-knob3.png"
  
  H_knob5:
  IncludeBinary "H-knob3.png"
    
  H_knob6:
  IncludeBinary "H-knob2.png"
  
  H_knob7:
  IncludeBinary "H-knob2.png"
  
  H_knob8:
  IncludeBinary "H-knob2.png"
  
  H_knob9:
  IncludeBinary "H-knob2.png"
  
  H_knob10:
  IncludeBinary "H-knob2.png"

  
  ;}

Вылетает ошибка на строке Draw_x(x, 0, Gadget, ImageID(Gadget)): гаджет не инициализированн...

0

129

Рисунков нет, поэтому протестировать не могу.

max написал(а):

Если в DataSection они считываются по порядку, то да.
В исходном коде сделал так:

В данном случае, идентификаторы рисунков будут начинаться с нуля. Если навести курсор мышки на константы идентификаторов во время работы программы, то можно увидеть какие там цифры.

Строка должна иметь вид:

Код:
Draw_x(x, 0, Gadget, ImageID(Gadget-20))
max написал(а):

Вылетает ошибка на строке Draw_x(x, 0, Gadget, ImageID(Gadget)): гаджет не инициализированн...

Номер гаджета какой (когда произойдет ошибка, нужно навести курсор мышки на переменную Gadget)?

0

130

Пётр написал(а):

Рисунков нет, поэтому протестировать не могу.

Вот.

Пётр написал(а):

Номер гаджета какой (когда произойдет ошибка, нужно навести курсор мышки на переменную Gadget)?

Gadget=25
Я наверное достал Вас, Петр, своими вопросами и просьбами. Все таки желательно сделать с фоновым рисунком, так как прога в дальнейшем будет менять скины загрузкой нового фона(не хотел, как говорится, раскрывать все карты сразу), если получится.

0

131

max написал(а):

Вот.

Предложенный выше вариант решает проблему.

Код:
Draw_x(x, 0, Gadget, ImageID(Gadget-20))
max написал(а):

Все таки желательно сделать с фоновым рисунком

Тогда нужно отказаться от CanvasGadget (не поддерживает он прозрачность), и сделать все на ImageGadget'ах по аналогии.

Или доработать этот код. https://purebasic.mybb.ru/viewtopic.php? … p=27#p5047

0

132

Пётр написал(а):

Предложенный выше вариант решает проблему.

Да.

Пётр написал(а):

Тогда нужно отказаться от CanvasGadget (не поддерживает он прозрачность), и сделать все на ImageGadget'ах по аналогии.

Ну что же, буду пробовать.

Отредактировано max (06.05.2012 07:29:41)

0

133

Наваял все, что знал. Но что-то не работает.

0

134

Это полная копия кода кнопок из рисунков. Что было сделано для того, чтобы можно было управлять регуляторами? Где отслеживание курсора мышки и перемещение бегунка? Где ImageGadget для бегунка?
За основу лучше было взять код вращающихся регуляторов. В них есть обработка перемещения курсора мышки.

0

135

Сейчас посмотрю.

0

136

Что-то ни как не даются процедуры. Procedure KnobGadget - загружает бегунок, Procedure KnobGadget_Free - освобождает память, Procedure KnobGadget_State - текущее состояние гаджета, Procedure KnobGadgetCB - определяет нажатие и меняет курсор, все остальное - темный лес. Помогите разобраться.

0

137

Что не понятно, можно спросить у гугла.
Например, попалось в коде #WM_MOUSEMOVE, спрашиваем гугл что значит WM_MOUSEMOVE и получаем ответ. http://msdn.microsoft.com/en-us/library … p/ms645616
С остальным по аналогии и тогда код не будет темным лесом.

0

138

Пётр написал(а):

попалось в коде #WM_MOUSEMOVE

Так тоже делаю, но проблема с самими процедурами.

0

139

С ними проблем нет. Их нужно немного изменить.
А для этого нужно знать как они работают и тут пригодится совет с гуглом.

0

140

Пётр написал(а):

тут пригодится совет с гуглом

Не спорю, но мне проше будет понять, если обьяснить на "пальцах" основные моменты процедур. А если не пойму, гугл или Win32.hlp мне в помощь.

0

141

Проще будет все написать чем объяснять....
Но если кратко, то нужно ловить события #WM_MOUSEMOVE и #WM_LBUTTONDOWN (аналоги #PB_EventType_MouseMove и #PB_EventType_LeftClick), определять позицию курсора (примерно как в процедуре KnobPos)

Код:
Pos.Point
GetCursorPos_(@Pos)
ScreenToClient_(GetParent_(hWnd), @Pos)

и с помощью ResizeGadget() перемещать бегунок.

Но ИМХО проще будет переделать этот код. https://purebasic.mybb.ru/viewtopic.php? … p=27#p5047

0

142

Вроде понял. :writing:

0

143

max написал(а):

Вроде понял.

Не понял.

Пётр написал(а):

ловить события #WM_MOUSEMOVE и #WM_LBUTTONDOWN (аналоги #PB_EventType_MouseMove и #PB_EventType_LeftClick)

Как-то так?

Код:
Procedure PointGadgetCB(hWnd, Msg, lParam, wParam)
  Protected *Pos.Point
  Shared IDC_HAND
  
  Pos=GetWindowLongPtr_(hWnd, #GWL_USERDATA)
  
  If Msg=#WM_MOUSEMOVE
    If lParam & #MK_LBUTTON ; Левая кнопка мышки нажата.
      PointPos(hWnd, *Pos)
    EndIf
    SetCursor_(IDC_HAND)
  ElseIf Msg=#WM_LBUTTONDOWN
    PointPos(hWnd, *Pos)
    SetCursor_(IDC_HAND)
  ElseIf Msg=#WM_LBUTTONUP
    SetCursor_(IDC_HAND)
  EndIf
  
  ProcedureReturn CallWindowProc_(*Pos, hWnd, Msg, lParam, wParam)
EndProcedure
Пётр написал(а):

с помощью ResizeGadget() перемещать бегунок

Код:
Procedure PointPos(hWnd, *Pos.Point)
  Protected Pos.Point
GetCursorPos_(@Pos)
ScreenToClient_(GetParent_(hWnd), @Pos)

  ResizeGadget(*Pos, *Pos\x-8, *Pos\y-8, #PB_Ignore, #PB_Ignore)
  
  Gadget=GetDlgCtrlID_(hWnd) ; Номер гаджета.
EndProcedure
Пётр написал(а):

определять позицию курсора (примерно как в процедуре KnobPos)

А почему не так?

Код:
Procedure IsMouseOver(wnd) ; Эта процедура определяет находится ли курсор мышки над заданым окном или гаджетом
 GetWindowRect_(wnd,re.RECT) 
 GetCursorPos_(pt.POINT) 
 Result.l = PtInRect_(@re, pt\x | (pt\y<<32) )
ProcedureReturn Result 
EndProcedure
Пётр написал(а):

Но ИМХО проще будет переделать этот код.

Тут вообще сделал только это:

Код:
; Последнее изменение:29 Апрель, 2011 @ 8:03:10 PM
Enumeration

 #CDDS_ITEM = $10000
 #CDDS_PREPAINT = 1
 #CDDS_ITEMPREPAINT = #CDDS_ITEM | #CDDS_PREPAINT
 #CDDS_SUBITEM = $20000
 #CDRF_NOTIFYITEMDRAW = $20
 #CDRF_SKIPDEFAULT = 4
 #TBCD_CHANNEL = 3
 #TBCD_THUMB = 2

 #H_knob1
 #Window_0
 #img
 #But
 #beg
 #Track1:#Track2:#Track3:#Track4
EndEnumeration

UsePNGImageDecoder()

CatchImage(#H_knob1, ?H_knob1) 

Prototype AlphaBlend(hdcDest,DestX,DestY,DestW,DestH,hdcSrc,SrcX,SrcY,SrcW,SrcH,BLENDFUNCTION)  
 msimg32 = OpenLibrary(#PB_Any, "msimg32.dll")  
Global AlphaBlend_.AlphaBlend = GetFunction(msimg32, "AlphaBlend")

Global  Dim pts.Point(4) 


Procedure myWindowCallback(hWnd, msg, wParam, lParam)
 ;SetWindowColor(#Window_0,RGB(16, 16, 16))
 ;LoadImage(#img,"trec.png") ; фон
  result = #PB_ProcessPureBasicEvents
  Select msg
   
    Case #WM_NOTIFY
      tGadget = #False
      *pnmhdr.NMHDR = lParam
      If *pnmhdr\code = #NM_CUSTOMDRAW And (*pnmhdr\hwndFrom = GadgetID(#Track1) Or *pnmhdr\hwndFrom = GadgetID(#Track2) Or *pnmhdr\hwndFrom = GadgetID(#Track3) Or *pnmhdr\hwndFrom = GadgetID(#Track4))
        *tbcd.NMCUSTOMDRAW = lParam
        ; --> *tbcd\hDC содержит дескриптор текущего постоянного состояния для частей TrackBarGadget 
        Select *tbcd\dwDrawStage
          Case #CDDS_PREPAINT
            result = #CDRF_NOTIFYITEMDRAW
          Case #CDDS_ITEMPREPAINT
            ; --> Раскрасить канала TrackBar
            If *tbcd\dwItemSpec = #TBCD_CHANNEL 
              ;фон TrackBar
              hdc = *tbcd\hDC
              ;hdcin = StartDrawing(ImageOutput(#img)) 
              AlphaBlend_(hdc, 0,0,250,25,hdcin,0,0,250,25,$1FF0000) ;250-ширина и 25-высота
              StopDrawing()
              result = #CDRF_SKIPDEFAULT
            EndIf
            ; --> Раскрашиваем бегунок TrackBar
            If *tbcd\dwItemSpec = #TBCD_THUMB
              ; --> pts() является массив точек рисуем  Полигон бегунка
              pts(0)\x = *tbcd\rc\Left
              pts(0)\y = *tbcd\rc\top
              pts(1)\x = *tbcd\rc\Right-1
              pts(1)\y = *tbcd\rc\top
              pts(2)\x = *tbcd\rc\Right-1
              pts(2)\y = *tbcd\rc\bottom-1
              pts(3)\x = *tbcd\rc\Right-1
              pts(3)\y = *tbcd\rc\bottom-1
              pts(4)\x = *tbcd\rc\Left
              pts(4)\y = *tbcd\rc\bottom-1
              ; --> Выбераем нашу кисть и перо в DC
              SelectObject_(*tbcd\hDC, CreatePatternBrush_(LoadImage(#beg,"H-knob1.png"))) ;фон
              ;SelectObject_(*tbcd\hDC, CreatePen_(#PS_SOLID, 1,RGB(4, 40, 104))) ;обводка
              ; --> Рисуем бегунок 
              Polygon_(*tbcd\hDC, pts(), 10)
              result = #CDRF_SKIPDEFAULT
            EndIf
        EndSelect
      EndIf
  EndSelect
  ProcedureReturn result
EndProcedure

If OpenWindow(#Window_0, 0, 0, 350, 150, "Раскрашенный TrackBarGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
  ; ButtonGadget(#But,0,0,0,0,"")
  
  SetWindowCallback(@myWindowCallback())
  

  TrackBarGadget(#Track1, 10, 20, 250, 18, 0,100)
  TrackBarGadget(#Track2, 10, 50, 250, 18, 0,100) : SetGadgetState(#Track2,15)
  TrackBarGadget(#Track3, 10, 80, 250, 18, 0,100) : SetGadgetState(#Track3,30)
  TrackBarGadget(#Track4, 10,110, 250, 18, 0,100) : SetGadgetState(#Track4,50)
  
  Repeat
    event = WaitWindowEvent()
  Until event = #PB_Event_CloseWindow

  CloseLibrary(msimg32) 
EndIf

DataSection
;{ ресурсы

  H_knob1:
  IncludeBinary "H-knob1.png"
  
;}
EndDataSection

Так как тут используется Polygon_, не понял как поменять бегунок.

0

144

max написал(а):

Как-то так?

Со структурой все напутано.

max написал(а):

Protected *Pos.Point

Ну и? Что ожидается в итоге, если эта структура не заполняется?

max написал(а):

Pos=GetWindowLongPtr_(hWnd, #GWL_USERDATA)

Скорее всего звездочка забыта с начале имени но и это не поможет, т. к. там должна быть структура не типа POINT.

max написал(а):

ProcedureReturn CallWindowProc_(*Pos, hWnd, Msg, lParam, wParam)

Функции CallWindowProc_() в первом аргументе должен передаваться указатель на перехваченную функцию, а что ей передается? Указатель на структуру!

max написал(а):

ResizeGadget(*Pos, *Pos\x-8, *Pos\y-8, #PB_Ignore, #PB_Ignore)

Тоже самое что в и предыдущем случае - в место номера гаждета, передан указатель на структуру.

PS.
Думаю что все же лучше использовать CanvasGadget....
Не зря говорят: "Лучше синица в руках чем журавль в небе". Без понимания принципа работы кода ничего толкового не сделать. Ну реализую я все это, потом новая проблема появится и опять переписывать....

0

145

Пётр написал(а):

Без понимания принципа работы кода ничего толкового не сделать.

Вот здесь целиком и полностью согласен. Если использую стандартные функции, то все нормально, а вот когда в коде встречается процедура - максимум тупой перенос в новый код.

0

146

max написал(а):

а вот когда в коде встречается процедура - максимум тупой перенос в новый код.

Может просто попытатся понять как она работает.
Если там WinAPI функции, то гугл поможет. По большому счету нет там ничего слишком сложного, главное понять принцип работы.
Для начала нужно разобраться с перехватом системной Callback функции. Возможно данный вопрос прояснит эта статья. http://purebasic.info/phpBB2/viewtopic.php?t=797

0

147

Спасибо, сейчас пичитаю, может и поможет. :)

0

148

Правильно ли я понял: hwnd - ID гаджета, msg - событие самого гаджета, wParam - события клавы, lParam - события мыши. В данном случае *PointOldEditFunc является меткой предыдущей метки. не совсем понятно это:

Код:
If EditProc_1\GadgetID=hwnd 
     Gadget=EditProc_1\Gadget 
     *PointOldEditFunc=EditProc_1\EditWndProc

0

149

max написал(а):

hwnd - ID гаджета

Это хэндл окна (поищи в гугле ответ что это).

max написал(а):

msg - событие самого гаджета

Событие окна (для системы гаджеты это тоже окна).

max написал(а):

wParam - события клавы, lParam - события мыши.

Нет, это просто два параметра, а что в них, зависит от msg.

max написал(а):

В данном случае *PointOldEditFunc является меткой предыдущей метки. не совсем понятно это

В этом указателе в нашем случае хранится адрес системной процедуры, которую мы перехватили.

0

150

Пётр написал(а):

Это хэндл окна (поищи в гугле ответ что это)

hwnd - это число - уникальный идентификатор окна в системе.

Пётр написал(а):

Событие окна (для системы гаджеты это тоже окна).

Логично, не зря ОС называется "Окна". :)

Пётр написал(а):

Нет, это просто два параметра, а что в них, зависит от msg.

А как узнать какой параметр использовать?

Код:
If  msg=258 
      If wParam=8 Or (wParam>='0' And wParam<='9')
Код:
If Msg=#WM_MOUSEMOVE
    If lParam & #MK_LBUTTON ; Левая кнопка мышки нажата.

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Рисованный интерфейс программы