Seite 1 von 1

Höhe des EditorGadget dynamisch dem Inhalt anpassen

Verfasst: 13.06.2018 11:34
von techniker
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ß.. :wink:

Re: Höhe des EditorGadget dynamisch dem Inhalt anpassen

Verfasst: 13.06.2018 11:53
von RSBasic
Primitiv etwa:

Code: Alles auswählen

Case #PB_Event_Gadget
  Select EventGadget()
    Case 1ResizeGadget(1, #PB_Ignore, #PB_Ignore, #PB_Ignore, CountGadgetItems(1)*14)
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.

Re: Höhe des EditorGadget dynamisch dem Inhalt anpassen

Verfasst: 13.06.2018 13:37
von diceman
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. :)

Re: Höhe des EditorGadget dynamisch dem Inhalt anpassen

Verfasst: 14.06.2018 06:15
von techniker
..das wäre super! :-)

Re: Höhe des EditorGadget dynamisch dem Inhalt anpassen

Verfasst: 14.06.2018 07:34
von diceman
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.

Re: Höhe des EditorGadget dynamisch dem Inhalt anpassen

Verfasst: 18.06.2018 16:36
von udg
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.

Bild

Bild

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