Enter/Return soll StringGadget ausführen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Tombi
Beiträge: 369
Registriert: 05.03.2008 22:05

Enter/Return soll StringGadget ausführen

Beitrag von Tombi »

Liebe Community,
wie lasse ich durch einen Klick auf Enter ein StringGadget ausführen?
Bzw, wie prüfe ich, ob in einem StringGadget Enter gedrückt wurde?

MFG, Tombi
Bild Bild Bild
Intel Pentium 4 630 (3 GHZ)
iostream
Beiträge: 109
Registriert: 15.06.2008 12:59

Re: Enter/Return soll StringGadget ausführen

Beitrag von iostream »

So kannst du z.B. ein Enter im StringGadget abfragen.

Code: Alles auswählen

Enumeration
	#Window
	#StringGadget
	#Shortcut
EndEnumeration

If OpenWindow(#Window, 0, 0, 400, 200, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	AddKeyboardShortcut(#Window, #PB_Shortcut_Return, #Shortcut)
	
	StringGadget(#StringGadget, 10, 10, 100, 20, "")
	SetActiveGadget(#StringGadget)
	
	Repeat
		EventID = WaitWindowEvent()
		
		If EventID = #PB_Event_Menu
			If EventMenu() = #Shortcut And GetActiveGadget() = #StringGadget
				Debug "Enter im StringGadget"
			EndIf
		EndIf
	Until EventID = #PB_Event_CloseWindow 
EndIf
OS: Windows 8.1 Pro
Benutzeravatar
Hyper
Beiträge: 194
Registriert: 19.04.2005 19:14

Re: Enter/Return soll StringGadget ausführen

Beitrag von Hyper »

...Du must nur aufpassen: Falls Du auch ein EditorGadget auf dem Screen hast und dort Enter drückst, wird kein Zeilenumbruch mehr erzeugt, da Du das Enter für andere Zwecke abfängst. Du könntest aber das so lösen, dass Du immer dann, wenn das StringGadget den Fokus erhält, den Shortcut zufügst und beim Fokusverlust wieder entfernst.

Aber wahrscheinlich hast Du ja gar kein EditorGadget...
PB 5.72
schleicher
Beiträge: 214
Registriert: 30.03.2014 19:57
Computerausstattung: Purebasic 5.70
Wohnort: 18314 Löbnitz

Re: Enter/Return soll StringGadget ausführen

Beitrag von schleicher »

Diese Thread ist zwar uralt, aber das genau habe ich gesucht.(Enter-Taste im Stringgadget). Danke
Purebasic 5.51
Andreas21
Beiträge: 390
Registriert: 30.08.2004 09:05
Computerausstattung: Desktop
Windows 10 Pro x64
CPU: AMD Ryzen 5 2600 3.40 GHz
Ram: 16GB RAM
Grafik: NVIDA Geforce 1060
PB: 5.72 X86/X64
Wohnort: Heidelberg

Re: Enter/Return soll StringGadget ausführen

Beitrag von Andreas21 »

Der Code wenn man noch ein Editor Feld benutzt währ dieser.

Code: Alles auswählen

EnableExplicit

Define EventID
Define check

Enumeration
  #Window
  #StringGadget
  #EditorGadget
  #Shortcut
EndEnumeration

If OpenWindow(#Window, 0, 0, 400, 200, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  StringGadget(#StringGadget, 10, 10, 100, 20, "")
  EditorGadget(#EditorGadget, 10, 40, 100, 100)
  SetActiveGadget(#StringGadget)
  check = #False
  
  Repeat
    EventID = WaitWindowEvent()
    
    If GetActiveGadget() = #StringGadget
      If check = #False
        AddKeyboardShortcut(#Window, #PB_Shortcut_Return, #Shortcut)
        check = #True
      EndIf
    Else
      If check = #True
        RemoveKeyboardShortcut(#Window, #PB_Shortcut_Return)
        check = #False
      EndIf
      
    EndIf
    If EventID = #PB_Event_Menu
      If EventMenu() = #Shortcut
        Debug "Enter im StringGadget"
      EndIf
    EndIf
  Until EventID = #PB_Event_CloseWindow 
EndIf
Windows 10 x64 Pro - PB 5.61 X64 / x32 - PB 4.6 x32
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: Enter/Return soll StringGadget ausführen

Beitrag von Derren »

Code: Alles auswählen

Repeat
    EventID = WaitWindowEvent()
   
    If GetActiveGadget() = #StringGadget
Du überprüfst also ständig (bei jeder noch so kleinen Mausbewegung), ob das aktive Gadget das StringGadget ist?

Wie wär's mit EventGadget() abfragen?
Dann brauchst du auch kein "check" Flag, dank EventType() (Focus/LostFocus)

Code: Alles auswählen

EnableExplicit

Define EventID

Enumeration
  #Window
  #StringGadget
  #EditorGadget
  #Shortcut
EndEnumeration

If OpenWindow(#Window, 0, 0, 400, 200, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
 
  StringGadget(#StringGadget, 10, 10, 100, 20, "")
  EditorGadget(#EditorGadget, 10, 40, 100, 100)
  SetActiveGadget(#StringGadget)  
 
  Repeat
  	EventID = WaitWindowEvent()
  	
  	Select EventID
  		Case #PB_Event_Gadget
  			
  			Select EventGadget()
  				Case #StringGadget  					
  					Select EventType()
  						Case #PB_EventType_Focus 
  							AddKeyboardShortcut(#Window, #PB_Shortcut_Return, #Shortcut)  							
  						Case #PB_EventType_LostFocus 
  							RemoveKeyboardShortcut(#Window, #PB_Shortcut_Return)
  					EndSelect   					
  			EndSelect 
  			
  		Case #PB_Event_Menu  			
  			If EventMenu() = #Shortcut
  				Debug "Enter im StringGadget"
  			EndIf
  	EndSelect 
  	
  Until EventID = #PB_Event_CloseWindow
EndIf
Signatur und so
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: Enter/Return soll StringGadget ausführen

Beitrag von hjbremer »

oder so

Code: Alles auswählen

EnableExplicit

Structure StringGadgetData
   parent.i
   gadget.i
   oldprc.i
   ;xyz
   laenge.i
EndStructure

Enumeration #PB_EventType_FirstCustomValue  
   #PB_EventType_StrgReturn
   #PB_EventType_StrgEscape
   #PB_EventType_StrgUp
   #PB_EventType_StrgDown
EndEnumeration


Procedure.i StringGadgetCallBack(hwnd, msg, wParam, lParam) 
   
   Protected *strg.StringGadgetData = GetWindowLongPtr_(hwnd, #GWL_USERDATA)
   
   Select msg
         
      Case #WM_CHAR            
         Select wparam 
            Case #VK_RETURN               
               PostEvent(#PB_Event_Gadget, *strg\parent, *strg\gadget, #PB_EventType_StrgReturn)
               
            Case #VK_ESCAPE 
               PostEvent(#PB_Event_Gadget, *strg\parent, *strg\gadget, #PB_EventType_StrgEscape)
               
            Default
               ;wParam = CheckChar()  
                              
         EndSelect
         
      Case #WM_KEYDOWN
         Select wparam 
            Case #VK_DOWN               
               PostEvent(#PB_Event_Gadget, *strg\parent, *strg\gadget, #PB_EventType_StrgDown)
               ProcedureReturn 0
               
            Case #VK_UP               
               PostEvent(#PB_Event_Gadget, *strg\parent, *strg\gadget, #PB_EventType_StrgUp)               
               ProcedureReturn 0
         EndSelect
         
         ;weitere Messages
      Case #WM_KILLFOCUS
         Debug "#WM_KILLFOCUS"
         
   EndSelect
   
   ProcedureReturn CallWindowProc_(*strg\oldprc, hwnd, msg, wParam, lParam) 
   
EndProcedure 

Procedure StringGadgetSetCallback(pbnr, parent, xyz = 0)
   
   Protected strgid = GadgetID(pbnr)      
   
   Protected *strg.StringGadgetData = AllocateMemory(SizeOf(StringGadgetData))
   
   *strg\gadget = pbnr
   *strg\parent = parent
   *strg\oldprc = GetWindowLongPtr_(strgid, #GWL_WNDPROC)   
   
   SetWindowLongPtr_(strgid, #GWL_USERDATA, *strg)   
   SetWindowLongPtr_(strgid, #GWL_WNDPROC, @StringGadgetCallBack())
   
EndProcedure



Define EventID

Enumeration 
   #Window
   #StringGadget
   #EditorGadget
   #Shortcut
EndEnumeration

If OpenWindow(#Window, 0, 0, 400, 200, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   
   StringGadget(#StringGadget, 10, 10, 100, 20, "")
   EditorGadget(#EditorGadget, 10, 40, 100, 100)
   SetActiveGadget(#StringGadget) 
   
   StringGadgetSetCallback(#StringGadget, #Window)
   
   
   Repeat
      EventID = WaitWindowEvent()
      
      Select EventID
         Case #PB_Event_Gadget
            
            Select EventGadget()
               Case #StringGadget                 
                  Select EventType()
                     Case #PB_EventType_StrgReturn: Debug "Hurra Return"
                     Case #PB_EventType_StrgEscape: Debug "Hurra Escape"
                     Case #PB_EventType_StrgUp:     Debug "Hurra Up"
                     Case #PB_EventType_StrgDown:   Debug "Hurra Down"                        
                  EndSelect 
                  
            EndSelect 
            
            
      EndSelect 
      
   Until EventID = #PB_Event_CloseWindow
EndIf
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: Enter/Return soll StringGadget ausführen

Beitrag von Derren »

WinApi lastig aber nützlich :)

Rauf Runter Links Rechts. Ein paar SetGadgetText() dazu und man kann im EditorGadget Snake oder Tetris spielen :bounce:
Signatur und so
Marty2PB
Beiträge: 16
Registriert: 14.03.2014 00:00

Re: Enter/Return soll StringGadget ausführen

Beitrag von Marty2PB »

Hallo,

Sorry das ich diesen alten Post ausgrab.
Aber wiso wird unter windows immer der 'Standardton Warn Signal' abgspielt ab wenn man die Return Taste oder die Escape taste im Stringadget drückt abgespielt ? Sobald man aber ein AddkeyboardShortcut hinzufügt hört das auf. Ist das unter Windows auch ohne AddkeyboardShortcut zu lösen das dieser nervige Sound nicht abgespielt wird wenn der user im Stringgadget 'Return' drückt.?

ich habe das für mich so in etwa gelöst

Code: Alles auswählen

            Case DC::#String_005, DC::#String_006, DC::#String_007, DC::#String_008, DC::#String_009,
                 DC::#String_010, DC::#String_011, DC::#String_012, DC::#String_013
                
                Select MainEventType
                    Case #PB_EventType_Focus
                        AddKeyboardShortcut(DC::#_Window_001, #PB_Shortcut_Return,1000)
                        SetGadgetColor(ObjectID,#PB_Gadget_BackColor,RGB(205,205,206))
                        SetGadgetColor(ObjectID,#PB_Gadget_FrontColor,RGB(0,0,0))
                    Case  #PB_EventType_LostFocus
                        RemoveKeyboardShortcut(DC::#_Window_001, #PB_Shortcut_Return)
                        SetGadgetColor(ObjectID,#PB_Gadget_BackColor,BaseForm::SetColorGray4)
                        SetGadgetColor(ObjectID,#PB_Gadget_FrontColor,RGB(90,90,90))                        
                EndSelect
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Enter/Return soll StringGadget ausführen

Beitrag von edel »

Bei dem Beispiel von hjbremer musst du einfach nur die weitere Verarbeitung durch Windows stoppen.

Aus :

Code: Alles auswählen

Case #WM_CHAR            
         Select wparam 
            Case #VK_RETURN               
               PostEvent(#PB_Event_Gadget, *strg\parent, *strg\gadget, #PB_EventType_StrgReturn)               
            Case #VK_ESCAPE
Wird :

Code: Alles auswählen

Case #WM_CHAR            
         Select wparam 
            Case #VK_RETURN               
               PostEvent(#PB_Event_Gadget, *strg\parent, *strg\gadget, #PB_EventType_StrgReturn) 
               ProcedureReturn 0
            Case #VK_ESCAPE
Antworten