ComboBoxGadget() - Wie Cursorposition setzen bzw. auslesen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: ComboBoxGadget() - Wie Cursorposition setzen bzw. ausles

Beitrag von RSBasic »

Wenn du ein Callback für ein Fenster verwenden möchtest, dann musst du auch ermitteln, welches Gadget du prüfen möchtest. In deinem Fall wären i.d.R. alle Gadgets davon betroffen oder/und dein Fenster allgemein.
Nimm lieber:

Code: Alles auswählen

SetWindowLongPtr_(GadgetID(#DeinGadget), #GWL_WNDPROC, @DeinCallback())
Dann wird die Callback-Funktion nur für ein bestimmtes Gadget ausgeführt und nicht global.

Außerdem kannst du im Callback den Parameter "Message" bzw. "uMsg" ausgeben lassen, um zu ermitteln, welche Events bei welcher Aktion ausgelöst werden.
Die Eventnummer kannst du z.B. mit Hilfe des Programms Konstantia den Konstantennamen ermitteln und in deinem Code verwenden.
Ich sehe gerade, dass der Downloadlink nicht mehr funktioniert. Schade, aber war vorhersehbar.
Du kannst das nützliche Programm auch hier herunterladen: http://www.rsbasic.de/backupprogramme/Konstantia.zip

Ansonsten hier ein Code, um die Cursorposition durchgehend zu ermitteln:

Code: Alles auswählen

EnableExplicit

Global ComboBoxCB

Procedure ComboBoxCB(hWnd, uMsg, wParam, lParam)
  Protected xPos
  
  Select uMsg
    Case #WM_CTLCOLOREDIT
      If IsGadget(GetActiveGadget())
        If GadgetID(GetActiveGadget()) = hWnd
          xPos = SendMessage_(hWnd, #CB_GETEDITSEL, 0, 0) >> 16
          SetGadgetText(3, "XPos: " + Str(xPos))
        EndIf
      EndIf
  EndSelect
  
  ProcedureReturn CallWindowProc_(ComboBoxCB, hWnd, uMsg, wParam, lParam)  
EndProcedure

Procedure SetCursorX(Gadget, xPos)
  ;Setzt den Cursor an die angegebene Position im Text
  SendMessage_(GadgetID(Gadget), #CB_SETEDITSEL, 0, xPos << 16 + xPos)
EndProcedure

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ComboBoxGadget(0,  10,  10, 280,  22, #PB_ComboBox_Editable)
  ButtonGadget  (1,  10,  35, 100,  22, "Zeit einfügen")
  ButtonGadget  (2, 115,  35, 100,  22, "Datum einfügen")
  TextGadget    (3, 230,  39,  60,  22, "XPos:", #PB_Text_Border)
  SetGadgetText (0, "Dies ist ein Testtext...")
  SetActiveGadget(0)
  SetCursorX(0, 13)
  
  ComboBoxCB = SetWindowLongPtr_(GadgetID(0), #GWL_WNDPROC, @ComboBoxCB())
  
  Repeat
    Select WaitWindowEvent()
      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
Antworten