Aktuelle Zeit: 24.09.2018 23:57

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Höhe des EditorGadget dynamisch dem Inhalt anpassen
BeitragVerfasst: 13.06.2018 11:34 
Offline
Benutzeravatar

Registriert: 27.01.2016 11:08
Wohnort: BY
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 5.61 [x86])


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Höhe des EditorGadget dynamisch dem Inhalt anpassen
BeitragVerfasst: 13.06.2018 11:53 
Offline
Moderator
Benutzeravatar

Registriert: 05.10.2006 18:55
Wohnort: Rupture Farms
Primitiv etwa:
Code:
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.

_________________
BildBildBildBild
Bild | EnableExplicit ist kostenlos und vermeidet Fehler | Gib Goto keine Chance | Schneller als die Telekom erlaubt | Avira? Nein Danke
WinAPI forever | Bei Problemen bitte Beispielcode posten | Mit Adblock werbefrei, schneller und sicherer surfen | brain.exe ist der beste Schutz | Userlibrary ohne Source = NoGo


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Höhe des EditorGadget dynamisch dem Inhalt anpassen
BeitragVerfasst: 13.06.2018 13:37 
Offline
Benutzeravatar

Registriert: 06.07.2017 12:24
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Höhe des EditorGadget dynamisch dem Inhalt anpassen
BeitragVerfasst: 14.06.2018 06:15 
Offline
Benutzeravatar

Registriert: 27.01.2016 11:08
Wohnort: BY
..das wäre super! :-)

_________________
Never change a running system - Never run a changed system!
(PB 5.61 [x86])


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Höhe des EditorGadget dynamisch dem Inhalt anpassen
BeitragVerfasst: 14.06.2018 07:34 
Offline
Benutzeravatar

Registriert: 06.07.2017 12:24
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Höhe des EditorGadget dynamisch dem Inhalt anpassen
BeitragVerfasst: 18.06.2018 16:36 
Offline
Benutzeravatar

Registriert: 20.06.2013 23:27
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:
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

_________________
PureBasic v5.30 + v5.44 LTS + v5.62 | Windows 7 x64 - Gforce GTX 950 - AMD FX6200 Six Core 3.80 | 26GB RAM


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye