Как послать сообщение канвасу типа setfocus
минуя сообщение winapi?,нужно сделать чтобы фокус включался при появлении мышки на канвасе и отключался при покидании его(без клика!).
Канвас
Сообщений 1 страница 12 из 12
Поделиться114.12.2022 11:45:57
Поделиться214.12.2022 16:22:04
Установил обработчик 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)
Поделиться314.12.2022 20:57:12
Да впринцепе работает осталось понять как типа смену шрифта организовать с другим масштабом.
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)
Поделиться414.12.2022 22:44:25
как типа смену шрифта организовать с другим масштабом.
LoadFont с нужным шрифтом.
Поделиться514.12.2022 23:28:12
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)
Поделиться615.12.2022 00:25:50
Не работает
Как оно без DrawingFont() работать будет?
В справке все есть в том числе примеры.
Поделиться715.12.2022 16:32:36
Как оно без 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
Поделиться815.12.2022 17:55:16
Вообщем понятно,изначально шрифт системный,только осталось понять это контекст буфера или нет?если нет то есть ли возможность с ним работать на пурике сделав аналогичное?
чтобы шрифт в него устанавливать и получать характеристики.
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)
Поделиться915.12.2022 18:39:33
Другой вопрос TextHeight("AbC") возвращает в пикселях а как вернуть в логическом измерении?
Для чего это нужно?
Функция возвращает именно столько сколько нужно для отображения всего текста.
Поделиться1016.12.2022 07:21:41
Для чего это нужно?
Функция возвращает именно столько сколько нужно для отображения всего текста.
Когда масштаб шрифта меняешь при появлении курсора на канвасе нужен размер логический чтобы не прыгал масштаб при loadfont(),
предполагается использовать не один гаджет а нное количество,так зачем мне ещё дополнительно держать дополнительную переменную на каждый канвас для логического масштаба?когда можно получить метрики устанавливаемого шрифта.
Ps.Также с именем шрифта,строку имени для каждого гаджета держать как то не очень .
Отредактировано Sergeihik (16.12.2022 07:42:59)
Поделиться1116.12.2022 12:50:30
Есть функции GetGadgetData() и SetGadgetData(). Храним что нужно в гаджете.
Поделиться1216.12.2022 17:58:04
Есть функции 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 ведь все метрики это разовые по сути вызовы процедур без длинных циклов).
Похожие темы
| Захотел создать канвас | PureBasic для Windows | 28.01.2024 |
| создать курсор на канвасе при вводе текста | Вопросы по PureBasic | 03.07.2022 |
| IconEditor | PureBasic для Windows | 31.01.2025 |
| Календарь смен | PureBasic для Windows | 10.03.2023 |
| Вопросы новичка (продолжение…) | Вопросы по PureBasic | 29.06.2024 |