Cursor im StringGadget verschieben

Anfängerfragen zum Programmieren mit PureBasic.
iostream
Beiträge: 109
Registriert: 15.06.2008 12:59

Cursor im StringGadget verschieben

Beitrag von iostream »

Ich habe folgendes Problem:
Ich möchte manuell per Klick auf ein ButtonGadget den Cursor in einem StringGadget eine "Position" weiterschieben (wie wenn ich im StringGadget die rechte oder linke Pfeiltaste drücke)...wie stell ich das an?

Mfg
iostream
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

hm...
wenn du einen Button klickst, dann bekommt der Button den Focus, und nicht mehr das Stringgadget.
du müßtest dir eine komplett eigene Oberfläche proggen, also nicht den standard-cursor benutzen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
X0r
Beiträge: 2770
Registriert: 15.03.2007 21:47
Kontaktdaten:

Beitrag von X0r »

Vielleicht meint er ja, dass erst der Fokus auf das Stringgadget gesetzt werden soll.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

aber in dem moment, wo er auf den button klickt, ist der cursor vom stringgadget verschwunden,
also wenn man auf das button-event reagiert, ist der cursor nicht mehr irgendwo,
wo man gucken könnte wo er ist und ihn versetzen.

btw: wie war der Urlaub?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Beitrag von marco2007 »

Naja, er könnte die Position in einer Variable speichern:
Soll ähnlich könnte es klappen (schnell hingeschrieben):

Code: Alles auswählen

If OpenWindow(0, 0, 0, 200, 60, "") 
  If CreateGadgetList(WindowID(0)) 
    StringGadget(0, 0, 0, 80, 20, "Zeile 1") 
    ButtonGadget(1, 10, 25, 40, 20, "+")
    SendMessage_(GadgetID(0), #EM_SETSEL, 0, 0) 
    SendMessage_(GadgetID(0), #EM_GETSEL, @b, @a)
    Debug a
    Debug b
    SetActiveGadget(0) 
  EndIf 
EndIf 

Repeat 
event= WaitWindowEvent()
  Select event: Case #PB_Event_Gadget: Select EventGadget()
    Case 1
      a+1
      SetActiveGadget(0)
      SendMessage_(GadgetID(0), #EM_SETSEL, a, 0)
      SendMessage_(GadgetID(0), #EM_GETSEL, @b, @a)
    Debug a
    Debug b
  EndSelect: EndSelect      
Until event = #PB_Event_CloseWindow
...mußt Dich ein bißchen spielen.

lg
Marco
Zuletzt geändert von marco2007 am 18.08.2008 19:03, insgesamt 1-mal geändert.
Windows 11 - PB 6.03 x64
_________________________________
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Code: Alles auswählen

hwnd = OpenWindow(0,#PB_Ignore,#PB_Ignore,260,50,"")

CreateGadgetList(hwnd)

StringGadget(0,10,10,150,23,"test")
ButtonGadget(1,165,10,28,23,"<")
ButtonGadget(2,190,10,28,23,">")

Repeat
	event = WaitWindowEvent()
	
	If event = #PB_Event_Gadget
		
		If EventGadget() = 2
			SetActiveGadget(0)
			SendMessage_(GadgetID(0),#EM_GETSEL,@start,@ende)
			start + 1
			SendMessage_(GadgetID(0),#EM_SETSEL,start,start)			
		EndIf 
		
		If EventGadget() = 1
			SetActiveGadget(0)
			SendMessage_(GadgetID(0),#EM_GETSEL,@start,@ende)
			start - 1
			SendMessage_(GadgetID(0),#EM_SETSEL,start,start)			
		EndIf 
		
	EndIf
	
	
Until event = #PB_Event_CloseWindow
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Beitrag von marco2007 »

marco2006 hat geschrieben:...mußt Dich ein bißchen spielen.
...das Spielen ist natürlich nach Edel`s Code überflüssig geworden.
Windows 11 - PB 6.03 x64
_________________________________
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Hier das ganze nochmal für EditorGadget:

Code: Alles auswählen

Procedure Editor_GetCursorX(Gadget)
  Protected Range.CHARRANGE
  SendMessage_(GadgetID(Gadget), #EM_EXGETSEL, 0, Range)
  ProcedureReturn (Range\cpMax - (SendMessage_(GadgetID(Gadget), #EM_LINEINDEX, SendMessage_(GadgetID(Gadget), #EM_EXLINEFROMCHAR, 0, Range\cpMin), 0)) + 1)
EndProcedure

Procedure Editor_GetCursorY(Gadget)
  Protected Range.CHARRANGE
  SendMessage_(GadgetID(Gadget), #EM_EXGETSEL, 0, Range)
  ProcedureReturn SendMessage_(GadgetID(Gadget), #EM_EXLINEFROMCHAR, 0, Range\cpMin) + 1
EndProcedure

Procedure Editor_SetCursorPos(Gadget, x, y)
  Protected CharIdx
  Protected LLength
  Protected Range.CHARRANGE
  CharIdx = SendMessage_(GadgetID(Gadget), #EM_LINEINDEX, y-1, 0)
  LLength = SendMessage_(GadgetID(Gadget), #EM_LINELENGTH, CharIdx, 0)
  If LLength >= x - 1
    CharIdx + x - 1
  EndIf
  Range\cpMin = CharIdx
  Range\cpMax = CharIdx
  ProcedureReturn SendMessage_(GadgetID(Gadget), #EM_EXSETSEL, 0, Range)
EndProcedure

If OpenWindow(0, 0, 0, 322, 180, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0)) 
  EditorGadget(0, 8, 8, 306, 133) 
  ButtonGadget(1, 160, 150, 60, 25, "=>")
  ButtonGadget(2, 100, 150, 60, 25, "<=")
  Define I.l, X.l, Y.l, Text.s
  
  For I = 1 To 8
    Text + "Feel the ..Pure.. Power" + #CRLF$
  Next
  SetGadgetText(0, Text)
  Editor_SetCursorPos(0, 5, 5)
  SetActiveGadget(0)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
      
      Case #PB_Event_Gadget
        If EventGadget() > 0
          X = Editor_GetCursorX(0)
          Y = Editor_GetCursorY(0)
          If EventGadget() = 1
            Editor_SetCursorPos(0, X + 1, Y)
          Else
            Editor_SetCursorPos(0, X - 1, Y)
          EndIf
          SetActiveGadget(0)
        EndIf
    EndSelect
  ForEver 
EndIf 

und marco2006 baut jetzt noch rauf und runter rein :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
iostream
Beiträge: 109
Registriert: 15.06.2008 12:59

Beitrag von iostream »

thx :mrgreen:
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Code: Alles auswählen


hwnd = OpenWindow(0,#PB_Ignore,#PB_Ignore,280,250,"")

CreateGadgetList(hwnd)

EditorGadget(0,10,10,150,100)
ButtonGadget(1,165,10,25,23,"<")
ButtonGadget(2,190,10,25,23,">")
ButtonGadget(3,215,10,25,23,"^")
ButtonGadget(4,240,10,25,23,"v")

SetGadgetText(0,"test" + #LF$  + "lala")


Repeat
	event = WaitWindowEvent()
	
	If event = #PB_Event_Gadget
		
		If EventGadget() = 1
			SetActiveGadget(0)
			SendMessage_(GadgetID(0),#WM_KEYDOWN,#VK_LEFT,0)			
		EndIf 
		
		If EventGadget() = 2
			SetActiveGadget(0)
			SendMessage_(GadgetID(0),#WM_KEYDOWN,#VK_RIGHT,0)
		EndIf 
		
		If EventGadget() = 3
			SetActiveGadget(0)
			SendMessage_(GadgetID(0),#WM_KEYDOWN,#VK_UP,0)
		EndIf 
						
		If EventGadget() = 4
			SetActiveGadget(0)
			SendMessage_(GadgetID(0),#WM_KEYDOWN,#VK_DOWN,0)
		EndIf 
		
		
	EndIf
	
	
Until event = #PB_Event_CloseWindow


:mrgreen:
Zuletzt geändert von edel am 18.08.2008 20:08, insgesamt 1-mal geändert.
Antworten