PureBasic - форум

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

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


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Канвас


Канвас

Сообщений 1 страница 13 из 13

1

Как послать сообщение канвасу типа setfocus
минуя сообщение winapi?,нужно сделать чтобы фокус включался при появлении мышки на канвасе и отключался при покидании его(без клика!).

0

2

Установил обработчик BindEvent(#PB_Event_Gadget, @KeyDown()),с появлением и покиданием курсора вроде норм,осталось понять можно ли штатно пуриковскими процедурами установить<>снять фокус?
И непонятки почему кнопки клавиатуры остаются без события(wparam не работает)?

Код:


Procedure.i KeyDown()
  Static knopka.i
  Select EventType()
 Case #PB_EventType_MouseEnter
 Debug "MouseEnter"
 Case #PB_EventType_MouseLeave
   Debug "MouseLeave"
 Case #PB_EventType_MouseWheel
   Debug "#PB_EventType_MouseWheel"  
 Case #PB_EventType_KeyDown
   knopka=EventwParam()
   Debug knopka
 Case #PB_EventType_KeyUp
   knopka=0
   Debug "#PB_EventType_KeyUp"
  
 EndSelect
EndProcedure

BindEvent(#PB_Event_Gadget, @KeyDown())

Отредактировано Sergeihik (14.12.2022 16:23:09)

0

3

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

нужно сделать чтобы фокус включался при появлении мышки на канвасе и отключался при покидании его(без клика!)

Код:
Procedure _DrawCanvas( Canvas, Text$, y = 5 )
  If IsGadget(Canvas) And StartDrawing(CanvasOutput(Canvas))
    Box(0,y,100,100-y, $FFFFFF)
    DrawingMode( #PB_2DDrawing_Transparent )
    If Text$
      DrawText(5, y, Text$, 0 )
    EndIf
    StopDrawing()
  EndIf
EndProcedure  

Procedure _EventCanvas()
  Static OldGadget ; для теста
  Protected EventGadget = EventGadget()
  Select EventType()
    Case #PB_EventType_MouseEnter
      SetActiveGadget( EventGadget ) ; устанавливаем фокус на гаджет, при наведении
;     Case #PB_EventType_MouseLeave  ; если нужно, чтобы фокус терялся, при любом выходе с канваса, а не только при переключении
;     SetActiveGadget(-1)            ; снимаем фокус с активного гаджета, при покидании
;     _DrawCanvas( EventGadget, "" ) 
    Case #PB_EventType_Focus
      _DrawCanvas( OldGadget, "" )
      _DrawCanvas( EventGadget, "Я в фокусе" )
      
      OldGadget = EventGadget
    Case #PB_EventType_KeyDown ; рисуем нажатые клавиши в активном гаджете
      _DrawCanvas( EventGadget,  Chr( GetGadgetAttribute( GetActiveGadget(), #PB_Canvas_Key ) ), 25)
  EndSelect
EndProcedure

If OpenWindow(0, 0, 0, 340, 120, "Наведите курсор на гаджет и нажмите клавишу", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  SetWindowColor(0, $DEC4B0)
  CanvasGadget(0, 10, 10, 100, 100, #PB_Canvas_Keyboard )
  CanvasGadget(1, 120, 10, 100, 100, #PB_Canvas_Keyboard )
  CanvasGadget(2, 230, 10, 100, 100, #PB_Canvas_Keyboard )
  BindGadgetEvent(0, @_EventCanvas())
  BindGadgetEvent(1, @_EventCanvas()) 
  BindGadgetEvent(2, @_EventCanvas()) 
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

Отредактировано Webarion (14.12.2022 19:46:33)

0

4

Да впринцепе работает осталось понять как типа смену шрифта организовать с другим масштабом.

Код:
Procedure vyvodtexsta()
 StartDrawing(CanvasOutput(1))
DrawingMode(#PB_2DDrawing_Transparent)
Box(10,10,400, 400,$FFFFFF)
 
  DrawText(50, 100, "Privet Purebasic", 0 )
 StopDrawing() 
EndProcedure  

Procedure TestHrift();;работает при установке шрифта 
  StartDrawing(CanvasOutput(1))
  debug TextHeight("AbC")
  
  ;DrawText(5, y, Text$, 0 )
  
  StopDrawing()
EndProcedure 

#PB_chr_ctrl=17
Procedure.i KeyDown()
  Protected Gadget = EventGadget()
  Static knopka.i
  Select EventType()
 Case #PB_EventType_MouseEnter
   ;Debug "MouseEnter"
   SetActiveGadget(Gadget)
 Case #PB_EventType_MouseLeave
   Debug "MouseLeave"
   SetActiveGadget(-1)
 Case #PB_EventType_MouseWheel
   ;Debug "#PB_EventType_MouseWheel" 
   If knopka=#PB_chr_ctrl
      Debug "Ctrl + "+"MouseWheel"+" = size font"
      ;Debug ((EventwParam()>>16)&$FFFF) 
      
      vyvodtexsta()
   EndIf  
 Case #PB_EventType_KeyDown
   knopka=GetGadgetAttribute(GetActiveGadget(),#PB_Canvas_Key)
   ;Debug knopka
 Case #PB_EventType_KeyUp
   knopka=-1
   ;Debug "#PB_EventType_KeyUp"
  
 EndSelect
EndProcedure
Procedure.i callbakcanvas()
  Protected Gadget = EventGadget()
  Static knopka.i
  Select EventType()
 Case #PB_EventType_MouseEnter
  ; Debug "MouseEnter"
   SetActiveGadget(1)
 Case #PB_EventType_MouseLeave
   Debug "MouseLeave"
   SetActiveGadget(-1)
 Case #PB_EventType_MouseWheel
   ;Debug "#PB_EventType_MouseWheel"
   If knopka=#PB_chr_ctrl
     Debug "Ctrl + "+"MouseWheel"+" = size font"
     ; Debug GetGadgetAttribute(GetActiveGadget(), #PB_Canvas_m );;((EventlParam()>>16)&$FFFF)
     
     
     vyvodtexsta()
   EndIf  
 Case #PB_EventType_KeyDown
   knopka=GetGadgetAttribute(GetActiveGadget(), #PB_Canvas_Key )
   ;Debug knopka
 Case #PB_EventType_KeyUp
   knopka=-1
   ;Debug "#PB_EventType_KeyUp"
  
 EndSelect
EndProcedure

If OpenWindow(0, 0, 0, 1000, 450, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(1,10,10,380, 380,#PB_Canvas_Keyboard)
    BindGadgetEvent(1, @callbakcanvas())
     ;BindEvent(#PB_Event_Gadget, @KeyDown())
    
   vyvodtexsta() 
    
    Repeat
    Event = WaitWindowEvent()
  
  Until Event = #PB_Event_CloseWindow
EndIf

Отредактировано Sergeihik (14.12.2022 20:59:14)

0

5

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

как типа смену шрифта организовать с другим масштабом.

LoadFont с нужным шрифтом.

0

6

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

LoadFont с нужным шрифтом.

Не работает что то,да и создавать новый шрифт не убив старый дескриптор шрифта это нормально?

Код:
Procedure vyvodtexsta()
 StartDrawing(CanvasOutput(1))
DrawingMode(#PB_2DDrawing_Transparent)
Box(10,10,400, 400,$FFFFFF)
 
  DrawText(50, 100, "Privet Purebasic", 0 )
 StopDrawing() 
EndProcedure  


#PB_chr_ctrl=17


Procedure.i callbakcanvas()
  Protected Gadget.i = EventGadget()
  Protected WheelDelta.b
  Static knopka.b
  Static vysota_simvola.a
  
Select EventType()    
 Case #PB_EventType_MouseWheel
   ;Debug "#PB_EventType_MouseWheel"
   If knopka=#PB_chr_ctrl
     Debug "Ctrl + "+"MouseWheel"+" = size font"
     WheelDelta=GetGadgetAttribute(GetActiveGadget(), #PB_Canvas_WheelDelta);MouseWheelDelta() 
     
     If WheelDelta>0
       ;Debug GetGadgetFont(Gadget)
       ;Debug WheelDelta
       ;SetGadgetFont(1,)
       
       If vysota_simvola>8
         vysota_simvola-4
         Debug vysota_simvola
          SetGadgetFont(Gadget,LoadFont(0,"Arial",vysota_simvola))
       EndIf
     ElseIf WheelDelta<0
     ; Debug GetGadgetFont(Gadget)
     ;Debug WheelDelta
       If vysota_simvola<250
         vysota_simvola+4
         Debug vysota_simvola
         LoadFont(0,"Arial",vysota_simvola)
          SetGadgetFont(Gadget,FontID(0))
       EndIf
       
     EndIf
     vyvodtexsta()
   EndIf
 Case #PB_EventType_MouseEnter
  ; Debug "MouseEnter"
   SetActiveGadget(1)
   ;
  StartDrawing(CanvasOutput(Gadget))
   vysota_simvola=TextHeight("AbC")
  StopDrawing()
 Case #PB_EventType_MouseLeave
   Debug "MouseLeave"
   SetActiveGadget(-1) 
 Case #PB_EventType_KeyDown
   knopka=GetGadgetAttribute(GetActiveGadget(), #PB_Canvas_Key )
   ;Debug knopka
 Case #PB_EventType_KeyUp
   knopka=-1
   ;Debug "#PB_EventType_KeyUp"
 EndSelect
EndProcedure

If OpenWindow(0, 0, 0, 1000, 450, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(1,10,10,380, 380,#PB_Canvas_Keyboard)
  ; BindGadgetEvent(1, @callbakcanvas())
  BindEvent(#PB_Event_Gadget, @callbakcanvas())
    
   vyvodtexsta() 
    
    Repeat
    Event = WaitWindowEvent()
  
  Until Event = #PB_Event_CloseWindow
EndIf

Отредактировано Sergeihik (14.12.2022 23:31:07)

0

7

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

Не работает

Как оно без DrawingFont() работать будет?
В справке все есть в том числе примеры.

0

8

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

Как оно без DrawingFont() работать будет?
В справке все есть в том числе примеры.

Да подумал что раз есть шрифт по умолчанию то где то и его переменная или тупо в контексте рисования,и типа можно поменять там без своей переменной под шрифт.
Теперь другие вопросы ,можно как то получить обратное значение результата fontid() чтобы сразу держать результат=fontid() а когда нужно задействовать FreeFont((то здесь применить))?
Другой вопрос TextHeight("AbC") возвращает в пикселях а как вернуть в логическом измерении?
а то как бы несоответствие с начальным значением в LoadFont(#PB_Any,"Arial",vysota_simvola).
И третий вопрос как получить имя шрифта без api?

Код:
Global shrift.i=LoadFont(#PB_Any,"Arial",16)
Global simvol_Height.i
Procedure vyvodtexsta()
Protected index_y.i=0
StartDrawing(CanvasOutput(1))
DrawingMode(#PB_2DDrawing_Transparent)
DrawingFont(FontID(shrift))
 
;Debug TextHeight("AbC")
Debug TextWidth("AbC")
  Box(0,0,380, 380,$FFFFFF)
While index_y<300
   DrawText(50, index_y, "Privet Purebasic",0)
   index_y+simvol_Height
Wend 
 StopDrawing() 
EndProcedure  
Procedure.i testshrift(Gadget_id)
  StartDrawing(CanvasOutput(Gadget_id))
   DrawingFont(FontID(shrift))
   simvol_Height=TextHeight("AbC")
  StopDrawing()
  ProcedureReturn simvol_Height
EndProcedure  
Procedure.i callbakcanvas()
 #PB_ctrl=17 
  Protected Gadget.i = EventGadget()
  Protected WheelDelta.b
  Static knopka.b
  Static vysota_simvola.a
Select EventType()    
 Case #PB_EventType_MouseWheel
   ;Debug "#PB_EventType_MouseWheel"
   If knopka=#PB_ctrl
     Debug "Ctrl + "+"MouseWheel"+" = size font"
     WheelDelta=GetGadgetAttribute(GetActiveGadget(), #PB_Canvas_WheelDelta)
     If WheelDelta>0
       If vysota_simvola>8
         vysota_simvola-2
         Debug vysota_simvola
         FreeFont(shrift)
         shrift=LoadFont(#PB_Any,"Arial",vysota_simvola)
         testshrift(Gadget)
         vyvodtexsta()
       EndIf
     ElseIf WheelDelta<0
       If vysota_simvola<250
         vysota_simvola+2
         Debug vysota_simvola
         FreeFont(shrift)
         shrift=LoadFont(#PB_Any,"Arial",vysota_simvola)
         testshrift(Gadget)
         vyvodtexsta()
       EndIf
     EndIf 
   EndIf
 Case #PB_EventType_MouseEnter
   Debug "MouseEnter"
   SetActiveGadget(Gadget)
   Debug vysota_simvola
   vysota_simvola=testshrift(Gadget)
   
   Debug vysota_simvola
 Case #PB_EventType_MouseLeave
   Debug "MouseLeave"
   SetActiveGadget(-1) 
 Case #PB_EventType_KeyDown
   knopka=GetGadgetAttribute(GetActiveGadget(),#PB_Canvas_Key)
   ;Debug knopka
 Case #PB_EventType_KeyUp
   knopka=-1
   ;Debug "#PB_EventType_KeyUp"
 EndSelect
EndProcedure

If OpenWindow(0, 0, 0, 1000, 450, "CanvasGadget", #PB_Window_SystemMenu  | #PB_Window_ScreenCentered)
  CanvasGadget(1,10,10,380, 380,#PB_Canvas_Keyboard | #PB_Canvas_Command)

  BindGadgetEvent(1, @callbakcanvas())
  ;BindEvent(#PB_Event_Gadget, @callbakcanvas())
  
  testshrift(1)
   vyvodtexsta() 
    
  Repeat
    Event = WaitWindowEvent()
  
  Until Event = #PB_Event_CloseWindow
EndIf

0

9

Вообщем понятно,изначально шрифт системный,только осталось понять это контекст буфера или нет?если нет то есть ли возможность с ним работать на пурике сделав аналогичное?
чтобы шрифт в него устанавливать и получать характеристики.

Код:
Global shrift.i=LoadFont(#PB_Any,"Arial",16)
Global simvol_Height.i
Procedure vyvodtexsta()
Protected index_y.i=0
StartDrawing(CanvasOutput(1))
DrawingMode(#PB_2DDrawing_Transparent)
DrawingFont(FontID(shrift))
 
;Debug TextHeight("AbC")
Debug TextWidth("AbC")
  Box(0,0,380, 380,$FFFFFF)
While index_y<300
   DrawText(50, index_y, "Privet Purebasic",0)
   index_y+simvol_Height
Wend 
 StopDrawing() 
EndProcedure  
Procedure.i testshrift(Gadget_id)
  StartDrawing(CanvasOutput(Gadget_id))
   DrawingFont(FontID(shrift))
   simvol_Height=TextHeight("AbC")
  StopDrawing()
  ProcedureReturn simvol_Height
EndProcedure
Global lpName.s
Procedure GetNameFont(Gadget_id)
 Protected hdc.i 
 hdc=StartDrawing(CanvasOutput(Gadget_id))
    DrawingFont(FontID(shrift))
    lpName=Space(100)
    GetTextFace_(hdc,100,@lpName)
    StopDrawing()
    Debug lpName
EndProcedure  
Procedure.i callbakcanvas()
 #PB_ctrl=17 
  Protected Gadget.i = EventGadget()
  Protected WheelDelta.b
  Static knopka.b
  Static vysota_simvola.a
Select EventType()    
 Case #PB_EventType_MouseWheel
   ;Debug "#PB_EventType_MouseWheel"
   If knopka=#PB_ctrl
     Debug "Ctrl + "+"MouseWheel"+" = size font"
     WheelDelta=GetGadgetAttribute(GetActiveGadget(), #PB_Canvas_WheelDelta)
     If WheelDelta>0
       If vysota_simvola>8
         vysota_simvola-2
         Debug vysota_simvola
           
         GetNameFont(Gadget)
         
         FreeFont(shrift)
         shrift=LoadFont(#PB_Any,lpName,vysota_simvola)
         lpName=""
         testshrift(Gadget)
         vyvodtexsta()
       EndIf
     ElseIf WheelDelta<0
       If vysota_simvola<100
         vysota_simvola+2
         Debug vysota_simvola
           
         GetNameFont(Gadget)
         
         FreeFont(shrift)
         shrift=LoadFont(#PB_Any,lpName,vysota_simvola)
         lpName=""
         testshrift(Gadget)
         vyvodtexsta()
       EndIf
     EndIf 
   EndIf
 Case #PB_EventType_MouseEnter
   Debug "MouseEnter"
   SetActiveGadget(Gadget)
   Debug vysota_simvola
   vysota_simvola=testshrift(Gadget)
   
   Debug vysota_simvola
 Case #PB_EventType_MouseLeave
   Debug "MouseLeave"
   SetActiveGadget(-1) 
 Case #PB_EventType_KeyDown
   knopka=GetGadgetAttribute(GetActiveGadget(),#PB_Canvas_Key)
   ;Debug knopka
 Case #PB_EventType_KeyUp
   knopka=-1
   ;Debug "#PB_EventType_KeyUp"
 EndSelect
EndProcedure

If OpenWindow(0, 0, 0, 1000, 450, "CanvasGadget", #PB_Window_SystemMenu  | #PB_Window_ScreenCentered)
  CanvasGadget(1,10,10,380, 380,#PB_Canvas_Keyboard | #PB_Canvas_Command)

  BindGadgetEvent(1, @callbakcanvas())
  ;BindEvent(#PB_Event_Gadget, @callbakcanvas())
  
  testshrift(1)
   vyvodtexsta() 
    
  Repeat
    Event = WaitWindowEvent()
  
  Until Event = #PB_Event_CloseWindow
EndIf

Отредактировано Sergeihik (15.12.2022 17:56:08)

0

10

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

Другой вопрос TextHeight("AbC") возвращает в пикселях а как вернуть в логическом измерении?

Для чего это нужно?
Функция возвращает именно столько сколько нужно для отображения всего текста.

0

11

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

Для чего это нужно?
Функция возвращает именно столько сколько нужно для отображения всего текста.

Когда масштаб шрифта меняешь при появлении курсора на канвасе нужен размер логический чтобы не прыгал масштаб при loadfont(),
предполагается использовать не один гаджет а нное количество,так зачем мне ещё дополнительно держать дополнительную переменную на каждый канвас для логического масштаба?когда можно получить метрики устанавливаемого шрифта.
Ps.Также с именем шрифта,строку имени для каждого гаджета держать как то не очень .

Отредактировано Sergeihik (16.12.2022 07:42:59)

0

12

Есть функции GetGadgetData() и SetGadgetData(). Храним что нужно в гаджете.

0

13

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

Есть функции GetGadgetData() и SetGadgetData(). Храним что нужно в гаджете.

А зачем лишнего хранить?да и может дату окна я хочу пользователю оставить для применения!
Лучше понять почему в коде Procedure.i testshrift() возвращает не тот шрифт что устанавливаем DrawingFont()?да и вылетает иногда на этом прога!

Код:
Global shrift.i
Global simvol_Height.i
Global Gadget.i
Procedure.i testshrift()
  StartDrawing(CanvasOutput(Gadget))
   DrawingFont(FontID(shrift));типа получаем дескриптор шрифта и устанавливаем в контекст рисования
   simvol_Height=TextHeight("AbC")
   StopDrawing()
   Protected d.d=simvol_Height
  ProcedureReturn Int(d*72/134)
EndProcedure
Global lpName.s
Procedure GetNameFont()
 Protected hdc.i
  lpName=Space(100)
 hdc=StartDrawing(CanvasOutput(Gadget))
    DrawingFont(FontID(shrift))
    GetTextFace_(hdc,100,@lpName)
    StopDrawing()
    Debug lpName
EndProcedure  

Procedure vyvodtexsta()
Protected index_y.i=0
StartDrawing(CanvasOutput(Gadget))
DrawingMode(#PB_2DDrawing_Transparent)
DrawingFont(FontID(shrift))
 
;Debug TextHeight("AbC")
Debug TextWidth("AbC")
  Box(0,0,380, 380,$FFFFFF)
While index_y<300
   DrawText(50, index_y, "Privet Purebasic",0)
   index_y+simvol_Height
Wend 
 StopDrawing() 
EndProcedure  
Procedure.i callbakcanvas()
 #PB_ctrl=17 
 Gadget = EventGadget();гаджет куда идут сообщения в работе 
; Debug Gadget
  Protected WheelDelta.b
  Static knopka.b
  Static vysota_simvola.a
Select EventType()    
 Case #PB_EventType_MouseWheel
   ;Debug "#PB_EventType_MouseWheel"
   If knopka=#PB_ctrl
     Debug "Ctrl + "+"MouseWheel"+" = size font"
     WheelDelta=GetGadgetAttribute(GetActiveGadget(), #PB_Canvas_WheelDelta)
     If WheelDelta>0
       If vysota_simvola>8
         vysota_simvola-2
         Debug vysota_simvola
           
         GetNameFont()
         
         FreeFont(shrift)
         shrift=LoadFont(#PB_Any,lpName,vysota_simvola)
         lpName=""
         testshrift()
         vyvodtexsta()
       EndIf
     ElseIf WheelDelta<0
       If vysota_simvola<100
         vysota_simvola+2
         Debug vysota_simvola
           
         GetNameFont()
         
         FreeFont(shrift)
         shrift=LoadFont(#PB_Any,lpName,vysota_simvola)
         lpName=""
         testshrift()
         vyvodtexsta()
       EndIf
     EndIf 
   EndIf
 Case #PB_EventType_MouseEnter
   Debug "MouseEnter"
   SetActiveGadget(Gadget)
   shrift=GetWindowLongPtr_(GadgetID(Gadget),0);получаем id шрифта
   Debug shrift
   ;Debug vysota_simvola
   vysota_simvola=testshrift()
   
   Debug vysota_simvola
 Case #PB_EventType_MouseLeave
  ; Debug "MouseLeave"
   SetActiveGadget(-1) 
 Case #PB_EventType_KeyDown
   knopka=GetGadgetAttribute(GetActiveGadget(),#PB_Canvas_Key)
   ;Debug knopka
 Case #PB_EventType_KeyUp
   knopka=-1
   ;Debug "#PB_EventType_KeyUp"
 EndSelect
EndProcedure

Procedure.i CustomCanvasGadget(id,x,y,x1,y1,flag)
Protected canvashwnd.i
  
canvashwnd=CanvasGadget(id,x,y,x1,y1,flag)
If GetClassLongPtr_(canvashwnd,#GCL_CBWNDEXTRA)=0;дополнтительная память в классе под окно не выделенна
   SetClassLongPtr_(canvashwnd,#GCL_CBWNDEXTRA,4);
   DestroyWindow_(canvashwnd);
   ;пересоздаём окно канваваса уже с дополнительной памятью под каждое окно(по новому шаблону класса)
   canvashwnd=CanvasGadget(id,x,y,x1,y1,flag)
Else
   canvashwnd=CanvasGadget(id,x,y,x1,y1,flag)
EndIf
; 
  BindGadgetEvent(id, @callbakcanvas())
  ;BindEvent(#PB_Event_Gadget, @callbakcanvas())
;
 Gadget=id;канвас гаджет в текущей работе
 shrift=LoadFont(#PB_Any,"Arial",16);шрифт в текущей работе
 
 SetWindowLongPtr_(canvashwnd,0,shrift);шрифт в канвасе по умолчанию в доп память окна
  
testshrift()
vyvodtexsta()
  
  
EndProcedure

If OpenWindow(0, 0, 0, 1000, 450, "CanvasGadget", #PB_Window_SystemMenu  | #PB_Window_ScreenCentered)
  CustomCanvasGadget(1,10,10,380, 380,#PB_Canvas_Keyboard | #PB_Canvas_Command)
  CustomCanvasGadget(2,400,10,380, 380,#PB_Canvas_Keyboard | #PB_Canvas_Command)
  
  
 
    
  Repeat
    Event = WaitWindowEvent()
  
  Until Event = #PB_Event_CloseWindow
EndIf

ps:А так понятно что мало у пурика процедур работы с текстом(хотя бы обёрток над api ведь все метрики это разовые по сути вызовы процедур без длинных циклов).

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Канвас