Seite 1 von 2

Erledigt- Text Align Eigenschaft an StringGadget übergeben?

Verfasst: 11.10.2017 14:52
von udg
Hallo,

folgende Voraussetzung ist gegeben.

Ich habe 6 StringGadget's untereinander welche der Anwender ausfüllen kann. Der Text wird ganz normal Linksbündig eingetragen.
Nun befindet sich unter den StringGadgets ein Button mit dem ich es ermöglichen möchte, nachträglich den Linksbündigen Text per Buttonklick
auf mittig (zentriert) zu setzen oder nach erneutem klicken auf den Button wieder den Text linksbündig darzustellen.

Leider hilft mir SendMessage_ mit Flag #ES_Center nicht weiter weil ich diese Info an das String nicht übergeben bekomme?

Bild

erstellt werden die StringGadgets in einer Prozedur:

Code: Alles auswählen

StringGadget(#Stamp1, 590, 350, 260, 18,"MusterText", #ES_MULTILINE)
      SetGadgetFont(#Stamp1, FontID(Font2))
bei Klick auf Button erfolgt dies:

Code: Alles auswählen

Case #Btn_CenterStamp
          ; Hier am besten einen "Toggle" Effekt (Variable Global definiert am Anfang!)
          ; TempString.s per Define definiert ! (Vor der EventLoop)
          If ToggleCenterStamp = 0
            ToggleCenterStamp = 1
            TempString = "Stempel links ausrichten"
            
            ; Hier müsste das kommen was ein String nachträglich zentriert (Keine Ahnung muss man suchen)
            For i = #Stamp1 To #Stamp6
 
             SendMessage_(GadgetID(i), #EM_SETMARGINS, #EC_LEFTMARGIN, 50|0 << 16) ; FALSCH
            Next i
          Else
            ToggleCenterStamp = 0
            TempString = "Stempel zentrieren"
            
            ; Hier müsste das kommen was ein String nachträglich linksbündig macht (Keine Ahnung muss man suchen)
            For i = #Stamp1 To #Stamp6
              SendMessage_(GadgetID(i), #EM_SETMARGINS, #EC_LEFTMARGIN, 2|0 << 16)
            Next i  
          EndIf
          SetGadgetText(#Btn_CenterStamp, TempString)
Kann mir da einer auf die Sprünge helfen? ich hab noch nichts dazu finden können :(

VG

Re: mit SendMessage eigenschaft an StringGadget übergeben?

Verfasst: 11.10.2017 14:56
von NicTheQuick
Sorry, kenne mich damit nicht aus, aber was soll das hier sein?

Code: Alles auswählen

50|0 << 16
Wenn du 0 um 16 Bit nach links verschiebst, ist es immer noch 0. Und abgesehen davon kommt hier bestimmt eine Konstante rein, die man auch verstehen kann anstatt irgendwelcher Magic Numbers, oder?

Re: mit SendMessage eigenschaft an StringGadget übergeben?

Verfasst: 11.10.2017 15:03
von RSBasic
udg hat geschrieben:Leider hilft mir SendMessage_ mit Flag #ES_Center nicht weiter weil ich diese Info an das String nicht übergeben bekomme?
SendMessage_() ist auch falsch. Nach SetWindowLongPtr_() hättest du suchen müssen.
Tipp: #ES_-Konstanten lauten ausgeschrieben: EditStyle
Und Styles sendet man nicht mit SendMessage_(). SendMessage_() braucht immer Message-Konstanten. Also nicht #ES_..., sondern #EM_...
Wenn du Styles ändern möchtest, dann mit SetWindowLongPtr_().

Hier der Code zum nachträglichen Zentrieren des StringGadgets:

Code: Alles auswählen

EnableExplicit

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  StringGadget(1, 10, 10, 200, 20, "Hallo Welt", 0)
  ButtonGadget(2, 220, 10, 100, 20, "Zentrieren", 0)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 2
            SetWindowLongPtr_(GadgetID(1), #GWL_STYLE, GetWindowLongPtr_(GadgetID(1), #GWL_STYLE) | #ES_CENTER)
            InvalidateRect_(GadgetID(1), 0, #True)
        EndSelect
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf

Re: mit SendMessage eigenschaft an StringGadget übergeben?

Verfasst: 11.10.2017 15:07
von udg
was diese Kombi im Einzelnen genau bedeutet kann ich dir auch nicht sagen. Ich hab dazu noch nie was erklärendes finden können ausser Codesnips mit genau dieser Kombi welche aber eh nichts bringt.


In RSBasic's Winapi kann man dies finden. Ausrichten der Werte mit Margin (wie man es von html's CSS kennt)

bei dieser Kombi wird der Text zwar eingerückt aber sieht dann nur so aus:
Bild

50 pix alles nach rechts verschoben.
NicTheQuick hat geschrieben:und abgesehen davon kommt hier bestimmt eine Konstante rein
ganz genau und hier scheitere ich. Bild

Re: mit SendMessage eigenschaft an StringGadget übergeben?

Verfasst: 11.10.2017 15:10
von RSBasic
Wenn du die Konstante eines Wertes ermitteln möchtest: http://www.purebasic.fr/german/viewtopi ... 11&t=25291
Oder auf MSDN, anderen WinAPI-Seiten oder in Header-Dateien. Dafür gibt es PSDK oder SDK von Windows.

Re: mit SendMessage eigenschaft an StringGadget übergeben?

Verfasst: 11.10.2017 15:13
von udg
Danke dir :)
ich werde erst mal dein Beispiel begutachten .


VG

Re: mit SendMessage eigenschaft an StringGadget übergeben?

Verfasst: 11.10.2017 16:40
von udg
Danke der Text wird nun in allen StringGadgets zentriert. :allright:

natürlich war es wieder zu einfach zu denken, dass bei erneutem Klick auf meinen Button mit dem Flag: #ES_Left
der Text wieder links platziert wird. :shock:

.. und so vergeht wieder die Zeit der Misserfolge

PS:
Dein Beispiel zum zentrieren von Text per Klick auf einen Button kannst du gern mit in die "winapi library" einbauen :praise:

Re: mit SendMessage eigenschaft an StringGadget übergeben?

Verfasst: 11.10.2017 16:46
von RSBasic
Mit dem Befehl fügst du nur #ES_CENTER hinzu. Wenn du es wieder entfernen möchtest:

Code: Alles auswählen

EnableExplicit

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  StringGadget(1, 10, 10, 200, 20, "Hallo Welt", 0)
  ButtonGadget(2, 220, 10, 100, 20, "Linksbündig", 0)
  ButtonGadget(3, 330, 10, 100, 20, "Zentrieren", 0)
 
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 2
            SetWindowLongPtr_(GadgetID(1), #GWL_STYLE, GetWindowLongPtr_(GadgetID(1), #GWL_STYLE) &~ #ES_CENTER)
            InvalidateRect_(GadgetID(1), 0, #True)
          Case 3
            SetWindowLongPtr_(GadgetID(1), #GWL_STYLE, GetWindowLongPtr_(GadgetID(1), #GWL_STYLE) | #ES_CENTER)
            InvalidateRect_(GadgetID(1), 0, #True)
        EndSelect
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf
udg hat geschrieben:.. und so vergeht wieder die Zeit der Misserfolge
Zum Glück bin ich hier sehr aktiv, damit du nicht lange auf eine Lösung warten musst. :D

\\Edit:
Du kannst auch togglen:

Code: Alles auswählen

EnableExplicit

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  StringGadget(1, 10, 10, 200, 20, "Hallo Welt", 0)
  ButtonGadget(2, 220, 10, 200, 20, "Zentrieren/Linksbündig", 0)
 
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 2
            SetWindowLongPtr_(GadgetID(1), #GWL_STYLE, GetWindowLongPtr_(GadgetID(1), #GWL_STYLE) ! #ES_CENTER)
            InvalidateRect_(GadgetID(1), 0, #True)
        EndSelect
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf

Re: Erledigt- SendMessage Eigenschaft an StringGadget überge

Verfasst: 11.10.2017 20:24
von udg
Vielen Dank.
Da hätte ich noch eine Weile dran geknabbert mit haufenweise Fragezeichen.
So ist das mit dem puren Basic :)
Ich hab zwar einen Toggle Button aber habs etwas anders in meinem Code gestaltet weil der Text sich im Button auch noch ändert mit draufdrücken.

Passt nun wunderbar.


:allright:

Re: Erledigt- SendMessage Eigenschaft an StringGadget überge

Verfasst: 11.10.2017 20:57
von Shardik
Die Ausrichtung des Textes im StringGadget mit SetWindowLongPtr_() funktioniert übrigens erst ab Windows Vista. Bei Windows XP ist eine nachträgliche Neujustierung nicht möglich, hier muss das StringGadget daher komplett neu erstellt werden. Ich hatte übrigens im englischen Forum vor mehr als 4 Jahren schon einmal dieses plattform-unabhängige Beispiel für Linux, MacOS und Windows gezeigt, das einen Text im StringGadget rechtsbündig darstellt und auch Windows XP berücksichtigt.