Как послать сообщение канвасу типа setfocus
минуя сообщение winapi?,нужно сделать чтобы фокус включался при появлении мышки на канвасе и отключался при покидании его(без клика!).
Канвас
Сообщений 1 страница 13 из 13
Поделиться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 19:23:44
нужно сделать чтобы фокус включался при появлении мышки на канвасе и отключался при покидании его(без клика!)
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)
Поделиться414.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)
Поделиться514.12.2022 22:44:25
как типа смену шрифта организовать с другим масштабом.
LoadFont с нужным шрифтом.
Поделиться614.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)
Поделиться715.12.2022 00:25:50
Не работает
Как оно без DrawingFont() работать будет?
В справке все есть в том числе примеры.
Поделиться815.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
Поделиться915.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)
Поделиться1015.12.2022 18:39:33
Другой вопрос TextHeight("AbC") возвращает в пикселях а как вернуть в логическом измерении?
Для чего это нужно?
Функция возвращает именно столько сколько нужно для отображения всего текста.
Поделиться1116.12.2022 07:21:41
Для чего это нужно?
Функция возвращает именно столько сколько нужно для отображения всего текста.
Когда масштаб шрифта меняешь при появлении курсора на канвасе нужен размер логический чтобы не прыгал масштаб при loadfont(),
предполагается использовать не один гаджет а нное количество,так зачем мне ещё дополнительно держать дополнительную переменную на каждый канвас для логического масштаба?когда можно получить метрики устанавливаемого шрифта.
Ps.Также с именем шрифта,строку имени для каждого гаджета держать как то не очень .
Отредактировано Sergeihik (16.12.2022 07:42:59)
Поделиться1216.12.2022 12:50:30
Есть функции GetGadgetData() и SetGadgetData(). Храним что нужно в гаджете.
Поделиться1316.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 |
Календарь смен | PureBasic для Windows | 10.03.2023 |
Вопросы новичка (продолжение…) | Вопросы по PureBasic | 29.06.2024 |
CreationGuiPB | PureBasic для Windows | 17.12.2024 |