Hallo,
wie kann man die Höhe eines EditorGadget dynamisch dem Inhalt unter Windows anpassen?
D.h. das Gadget soll nach unten wachsen bzw. schrumpfen - je nachdem wie viel Text eingegeben wird.
Danke für jeden Denkanstoß..
Höhe des EditorGadget dynamisch dem Inhalt anpassen
Höhe des EditorGadget dynamisch dem Inhalt anpassen
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
(PB 6.03 LTS [x86])
Re: Höhe des EditorGadget dynamisch dem Inhalt anpassen
Primitiv etwa:
Aber um korrekt die Gadgethöhe an die Höhe des Gesamttextes anzupassen, müsste man zusätzlich die Texthöhe je nach Schriftart ermitteln.
Code: Alles auswählen
Case #PB_Event_Gadget
Select EventGadget()
Case 1ResizeGadget(1, #PB_Ignore, #PB_Ignore, #PB_Ignore, CountGadgetItems(1)*14)
Re: Höhe des EditorGadget dynamisch dem Inhalt anpassen
Ich habe so etwas in der Art für das Message-System in meinem Roguelike-Projekt gebastelt ... kanns nachher mal hier reinstellen.
Ich benutze allerdings kein Gadget, sondern ein selbst erstelltes Sprite, dem ich selber einen Rahmen zufüge, und dann die Größe entsprechend anpasse.
Das Prinzip dürfte aber dasselbe sein; funktioniert auch bei unterschiedlichen Schriftfonts- und Größen.
Ich benutze allerdings kein Gadget, sondern ein selbst erstelltes Sprite, dem ich selber einen Rahmen zufüge, und dann die Größe entsprechend anpasse.
Das Prinzip dürfte aber dasselbe sein; funktioniert auch bei unterschiedlichen Schriftfonts- und Größen.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
And we're out of Beta, we're releasing on time.
Re: Höhe des EditorGadget dynamisch dem Inhalt anpassen
..das wäre super!
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
(PB 6.03 LTS [x86])
Re: Höhe des EditorGadget dynamisch dem Inhalt anpassen
Sorry, was gestern ein bißchen müde nach der Arbeit. Heute bin ich auch den ganzen Tag unterwegs und komme nicht zuhause an meinem PC - aber eigentlich ist das kein Hexenwerk, also wennst schonmal rumspielen magst, gucke dir mal die Befehle TextHeight() und TextWidth() an - die sind eigentlich alles, was du brauchst.
Folgende Reihenfolge mußt du einhalten:
- Schriftfont definieren
- Deine Text-Elemente in Strings einlesen
- Mit textWidth() und textHeight() bekommst du die EXAKTE Weite und Höhe von jedem String mit dem definierten Schriftfont. Die Werte addierst du alle auf, inklusive deiner zusätzlichen grafischen Elemente (Rand oben und und unten) und mußt halt abfragen, was die maximale Ausdehnung in der Höhe und Breite ist. Wenn du unterschiedliche Schriftfonts benutzt, ist das auch kein Problem, du mußt nur alle Strings vorher nach ihrer Größe und Weite fragen und deren Werte aufaddieren, bevor du überhaupt anfängst, etwas was auf dem Bildschirm auszugeben.
Folgende Reihenfolge mußt du einhalten:
- Schriftfont definieren
- Deine Text-Elemente in Strings einlesen
- Mit textWidth() und textHeight() bekommst du die EXAKTE Weite und Höhe von jedem String mit dem definierten Schriftfont. Die Werte addierst du alle auf, inklusive deiner zusätzlichen grafischen Elemente (Rand oben und und unten) und mußt halt abfragen, was die maximale Ausdehnung in der Höhe und Breite ist. Wenn du unterschiedliche Schriftfonts benutzt, ist das auch kein Problem, du mußt nur alle Strings vorher nach ihrer Größe und Weite fragen und deren Werte aufaddieren, bevor du überhaupt anfängst, etwas was auf dem Bildschirm auszugeben.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
And we're out of Beta, we're releasing on time.
Re: Höhe des EditorGadget dynamisch dem Inhalt anpassen
wenn noch akkut, ich hatte mal angefangen einen Chat machen zu wollen aber bin daran gescheitert, dass ein höheres Nachrichtenfeld nicht nach oben verschoben wird im Nachrichtenfeld wenn man Enter drückt.
Gibt man also eine Zeile ein und drückt enter, erscheint die Nachricht wie bei Skype oben.
Ist nun aber die Nachricht mehrzeilig, passt sich zwar die Größe (Höhe) an aber das ganze Feld müsste natürlich auch nach oben rutschen.
Schwer zu erklären aber evtl hilft der Ansatz und oder jemand bekommt es sogar hin, den Code so zu modden das er das macht wie es eigtl funzen soll
Das ist kein Profi Code, das war nur testen was geht.
Gibt man also eine Zeile ein und drückt enter, erscheint die Nachricht wie bei Skype oben.
Ist nun aber die Nachricht mehrzeilig, passt sich zwar die Größe (Höhe) an aber das ganze Feld müsste natürlich auch nach oben rutschen.
Schwer zu erklären aber evtl hilft der Ansatz und oder jemand bekommt es sogar hin, den Code so zu modden das er das macht wie es eigtl funzen soll
Das ist kein Profi Code, das war nur testen was geht.
Code: Alles auswählen
EnableExplicit
Enumeration
#Wnd_Main
EndEnumeration
Enumeration
#Cnt_Window
;:Exit Button
#Btn_Exit
#Img_BtnExit
;:Minimize Button
#Btn_Minimize
#Img_BtnMinimize
;:Draw Header
#Header
#Img_Header
;:Window Title
#Titel
;:Draw Footer
#Footer
#Img_Footer
;:Font
#Fnt_SegoeUI12
#Fnt_Arial8
;: Nachricht Löschen
#Btn_Erase
#Img_BtnErase
#Cnt_Wrapper
#Str_OwnChatFenster
#Cnt_PopUp
#Str_PopUpChatFenster
#Txt_Time
#Txt_Del_Chat
#Img_Cnt_Window
EndEnumeration
;:Define Colors
#Wnd_Color = $353535 ; dark grey
#Col_Header = $5E4934 ; white
#Col_Footer = $452D18 ; mid grey
#Col_Text = $666667 ; black grey
#Col_Container = $605448 ; silver grey
#Col_Cont_Chat = $452D18 ; petrolblau
#Col_ChatTxt = $D6D6D6 ; bright grey
;:Window size
#Wnd_Width = 400 ; px
#Wnd_Height = 600 ; px
LoadFont(#Fnt_SegoeUI12, "Segoe Ui", 12, #PB_Font_HighQuality)
LoadFont(#Fnt_Arial8, "Arial", 8, #PB_Font_HighQuality)
Define Event, EventType, txt$, EventGadget, hoehe, hoehe2
Global lineheight = 24
Global ContainerMinheight = 90
Procedure.i Event_Exit() ; ExitBtn gedrückt oder Fenster bekommt Schliesssignal
End
EndProcedure
Procedure.i Event_Minimize() ; MinimizeBtn wurde geklickt
SetWindowState(#Wnd_Main, #PB_Window_Minimize)
EndProcedure
Procedure.i Event_Clear_Message() ; gesendete Nachricht löschen
SetGadgetText(#Str_PopUpChatFenster, "Nachricht wurde entfernt")
SetGadgetFont(#Str_PopUpChatFenster, FontID(#Fnt_Arial8))
Debug"x key pressed"
EndProcedure
Procedure.i WCB(hWnd, uMsg, wParam, lParam) ; #WM EVENTS NUR IN CALLBACK ABFRAGEN
Protected Result = #PB_ProcessPureBasicEvents
Select uMsg
Case #WM_LBUTTONDOWN
If WindowMouseX(#Wnd_Main) >= 0 And WindowMouseX(#Wnd_Main) <= WindowWidth(#Wnd_Main)-2 And WindowMouseY(#Wnd_Main) >= 0 And WindowMouseY(#Wnd_Main) <= 61
SendMessage_(WindowID(#Wnd_Main), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
EndIf
EndSelect
ProcedureReturn Result
EndProcedure
Procedure DropShadow(Window)
; (WindowsAPI) - Generiert bei einem randlosen Fenster einen Schatten
If IsWindow(Window)
SetClassLongPtr_(WindowID(Window), #GCL_STYLE, #CS_DROPSHADOW)
EndIf
EndProcedure
Procedure SystemButtons()
;EXIT BUTTON
CreateImage(#Btn_Exit, 60, 60)
StartDrawing(ImageOutput(#Btn_Exit))
FillArea(1, 1, -1, #Col_Header)
Line(3, 56, 54, -54, #White)
Line(3, 4, 54, 54, #White)
StopDrawing()
ImageGadget(#Img_BtnExit, WindowWidth(0)-61, 1, 60, 60, ImageID(#Btn_Exit))
;MINIMIZE BUTTON
CreateImage(#Btn_Minimize, 40, 20)
StartDrawing(ImageOutput(#Btn_Minimize))
FillArea(1, 1, -1, #Col_Header)
Line(0, 19, 40, 1, #White)
StopDrawing()
ImageGadget(#Img_BtnMinimize, WindowWidth(0)-110, 37, 40, 40, ImageID(#Btn_Minimize))
EndProcedure
Procedure Event_Btn_deleteMSG()
;Nachricht Löschen
CreateImage(#Btn_Erase, 20, 20)
StartDrawing(ImageOutput(#Btn_Erase))
FillArea(1, 1, -1, #Col_Cont_Chat)
Line(3, 8, 8, -8, $C6C6C6)
Line(3, 1, 8, 8, $C6C6C6)
StopDrawing()
ImageGadget(#Img_BtnErase, 325, 2, 20, 20, ImageID(#Btn_Erase))
EndProcedure
Procedure ResizeMessage()
Protected txt.s, hoehe.l
txt.s = GetGadgetText(#Str_PopUpChatFenster)
hoehe.l = CountGadgetItems(#Str_PopUpChatFenster) * lineheight
ResizeGadget(#Str_PopUpChatFenster,#PB_Ignore,#PB_Ignore,#PB_Ignore,hoehe)
EndProcedure
Procedure ResizeMsgContainer()
Protected txt2.s, hoehe2.l
txt2.s = GetGadgetText(#Str_PopUpChatFenster)
hoehe2.l = CountGadgetItems(#Str_PopUpChatFenster) * ContainerMinheight
ResizeGadget(#Cnt_PopUp,#PB_Ignore,#PB_Ignore,#PB_Ignore,hoehe2)
EndProcedure
Procedure main()
Protected txt$, hoehe
OpenWindow(#Wnd_Main, 510, 311, #Wnd_Width, #Wnd_Height, " ", #PB_Window_BorderLess|#PB_Window_ScreenCentered|#PB_Window_Invisible)
SetWindowColor(#Wnd_Main, #Wnd_Color)
DropShadow(#Wnd_Main)
;:Entertaste abfragen
AddKeyboardShortcut(#Wnd_Main, #PB_Shortcut_Return, 15)
;HEADER
CreateImage(#Img_Header, WindowWidth(#Wnd_Main)-2, 60, 32, #Col_Header)
StartDrawing(ImageOutput(#Img_Header))
Box(0, 1, OutputWidth(), OutputHeight(), #Col_Header)
StopDrawing()
ImageGadget(#Header, 1, 1, 0, 0, ImageID(#Img_Header))
;disable to make it possible: grab with LMB Down
DisableGadget(#Header, #True)
;Set Window Title
TextGadget(#Titel, 10, 14, 160, 30, "Chat Preset", #SS_CENTER)
SetGadgetColor(#Titel, #PB_Gadget_BackColor, #Col_Header)
SetGadgetColor(#Titel, #PB_Gadget_FrontColor, #White)
SetGadgetFont(#Titel, FontID(#Fnt_SegoeUI12))
;Add all Gadgets here
CreateImage(#Img_Cnt_Window, 398, 405, 24, #Col_Container)
StartDrawing(ImageOutput(#Img_Cnt_Window))
Box(0, 1, OutputWidth(), OutputHeight(), #Col_Container)
StopDrawing()
ImageGadget(#Cnt_Window, 1, 62, 398, 405, ImageID(#Img_Cnt_Window))
DisableGadget(#Cnt_Window, #True)
;:Das eigene Chateingabe Feld
ContainerGadget(#Cnt_Wrapper, 1, 468, WindowWidth(#Wnd_Main)-2, 100, #PB_Container_BorderLess) ;{
SetGadgetColor(#Cnt_Wrapper, #PB_Gadget_BackColor, #Col_Cont_Chat)
StringGadget(#Str_OwnChatFenster, 40, 15, 318, 80, "", #PB_String_BorderLess|#ES_MULTILINE|#ESB_DISABLE_LEFT| #ES_AUTOVSCROLL|#ESB_DISABLE_RIGHT)
SetGadgetColor(#Str_OwnChatFenster, #PB_Gadget_BackColor, #Col_Cont_Chat)
SetGadgetColor(#Str_OwnChatFenster, #PB_Gadget_FrontColor, #Col_ChatTxt)
SetGadgetFont(#Str_OwnChatFenster, FontID(#Fnt_SegoeUI12))
CloseGadgetList() ;}
;:CHAT CONTAINER inkl Nachichten
ContainerGadget(#Cnt_PopUp, 30, 300, WindowWidth(#Wnd_Main)-60, ContainerMinheight, #PB_Container_BorderLess) ;{
SetGadgetColor(#Cnt_PopUp, #PB_Gadget_BackColor, #Col_Cont_Chat)
;:Chatfeld gesendeter Text
EditorGadget(#Str_PopUpChatFenster, 15, 35, 314, lineheight)
SetGadgetAttribute(#Str_PopUpChatFenster,#PB_Editor_WordWrap,#True)
SetWindowTheme_(GadgetID(#Str_PopUpChatFenster), @"", @"")
SetWindowLongPtr_(GadgetID(#Str_PopUpChatFenster), #GWL_EXSTYLE, 0)
SetWindowPos_(GadgetID(#Str_PopUpChatFenster), 0, 0, 0, 0, 0, #SWP_NOMOVE | #SWP_NOSIZE | #SWP_FRAMECHANGED)
SetGadgetColor(#Str_PopUpChatFenster, #PB_Gadget_BackColor, #Col_Cont_Chat)
SetGadgetColor(#Str_PopUpChatFenster, #PB_Gadget_FrontColor, #Col_ChatTxt)
SetGadgetFont(#Str_PopUpChatFenster, FontID(#Fnt_SegoeUI12))
;:Zeige Uhrzeit der gesendeten Nachricht
txt$ = FormatDate("%hh:%ii", Date())
TextGadget(#Txt_Time, 15, 4, 50, 20, txt$)
SetGadgetColor(#Txt_Time, #PB_Gadget_BackColor, #Col_Cont_Chat)
SetGadgetFont(#Txt_Time, FontID(#Fnt_Arial8))
SetGadgetColor(#Txt_Time, #PB_Gadget_FrontColor, #Col_ChatTxt)
Event_Btn_deleteMSG()
CloseGadgetList() ;}
HideGadget(#Cnt_PopUp, #True)
;Footer
CreateImage(#Img_Footer, WindowWidth(#Wnd_Main)-2, 30, 32, #Col_Footer)
ImageGadget(#Footer, 1, WindowHeight(#Wnd_Main)-31, 0, 0, ImageID(#Img_Footer))
SystemButtons()
BindGadgetEvent(#Img_BtnMinimize, @Event_Minimize(), #PB_EventType_LeftClick)
BindGadgetEvent(#Img_BtnExit, @Event_Exit(), #PB_EventType_LeftClick)
BindGadgetEvent(#Img_BtnErase, @Event_Clear_Message(), #PB_EventType_LeftClick)
BindGadgetEvent(#Str_PopUpChatFenster,@ResizeMsgContainer(),#PB_EventType_Change)
BindGadgetEvent(#Str_PopUpChatFenster,@ResizeMessage(),#PB_EventType_Change)
SetWindowCallback(@WCB(), #Wnd_Main)
SetActiveGadget(#Str_OwnChatFenster)
HideWindow(#Wnd_Main, #False)
EndProcedure
main()
Repeat
Event = WaitWindowEvent()
Select Event()
Case #PB_Event_Menu
Select EventMenu()
Case 15
HideGadget(#Cnt_PopUp, #False)
If GetActiveGadget() = #Str_OwnChatFenster
SetGadgetText(#Str_PopUpChatFenster,GetGadgetText(#Str_OwnChatFenster))
SetGadgetFont(#Str_PopUpChatFenster, FontID(#Fnt_SegoeUI12))
SetGadgetText(#Str_OwnChatFenster, "")
Debug "Return key pressed"
EndIf
EndSelect
EndSelect
ForEver
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE! TOP. Kauft Eure Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE! TOP. Kauft Eure Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS