Höhe des EditorGadget dynamisch dem Inhalt anpassen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
techniker
Beiträge: 160
Registriert: 27.01.2016 11:08
Wohnort: BY

Höhe des EditorGadget dynamisch dem Inhalt anpassen

Beitrag 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:
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Höhe des EditorGadget dynamisch dem Inhalt anpassen

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Höhe des EditorGadget dynamisch dem Inhalt anpassen

Beitrag 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. :)
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
techniker
Beiträge: 160
Registriert: 27.01.2016 11:08
Wohnort: BY

Re: Höhe des EditorGadget dynamisch dem Inhalt anpassen

Beitrag von techniker »

..das wäre super! :-)
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Höhe des EditorGadget dynamisch dem Inhalt anpassen

Beitrag 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.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
udg
Beiträge: 560
Registriert: 20.06.2013 23:27

Re: Höhe des EditorGadget dynamisch dem Inhalt anpassen

Beitrag 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
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
Antworten