Erledigt- Text Align Eigenschaft an StringGadget übergeben?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
udg
Beiträge: 560
Registriert: 20.06.2013 23:27

Erledigt- Text Align Eigenschaft an StringGadget übergeben?

Beitrag 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
Zuletzt geändert von udg am 12.10.2017 14:22, insgesamt 3-mal geändert.
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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: mit SendMessage eigenschaft an StringGadget übergeben?

Beitrag 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?
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: mit SendMessage eigenschaft an StringGadget übergeben?

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
udg
Beiträge: 560
Registriert: 20.06.2013 23:27

Re: mit SendMessage eigenschaft an StringGadget übergeben?

Beitrag 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
Zuletzt geändert von udg am 11.10.2017 15:14, insgesamt 4-mal geändert.
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
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: mit SendMessage eigenschaft an StringGadget übergeben?

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
udg
Beiträge: 560
Registriert: 20.06.2013 23:27

Re: mit SendMessage eigenschaft an StringGadget übergeben?

Beitrag von udg »

Danke dir :)
ich werde erst mal dein Beispiel begutachten .


VG
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
Benutzeravatar
udg
Beiträge: 560
Registriert: 20.06.2013 23:27

Re: mit SendMessage eigenschaft an StringGadget übergeben?

Beitrag 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:
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
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: mit SendMessage eigenschaft an StringGadget übergeben?

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
udg
Beiträge: 560
Registriert: 20.06.2013 23:27

Re: Erledigt- SendMessage Eigenschaft an StringGadget überge

Beitrag 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:
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
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

Re: Erledigt- SendMessage Eigenschaft an StringGadget überge

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