Stringedget selektieren wenn es den focus erhält

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Stringedget selektieren wenn es den focus erhält

Beitrag von Danilo »

Pure_Beginner hat geschrieben:nicht der text des buttons soll selektiert werden sondern der button selbst,
wenn man z.b. von einem button zu anderen mittels der tabtaste springt damit man erkennt wo man gerade ist :bluescreen:
hab schon einiges ausprobiert um vom meinen nun selekirten Stringgadgets auf die buttons zu springen und zu selektieren, funkioniert aber leider nicht
Normal siehst Du bei Buttons eine kleine gestrichelte Linie drum herum,
wenn sie aktiviert sind. Funktioniert bei mir mit XP Style angeschalten
allerdings nicht immer (ohne XP Style dagegen immer).

Probier es mal mit #BS_DEFPUSHBUTTON wie in Dialogen:

Code: Alles auswählen

Procedure myButtonProc(hWnd,msg,wParam,lParam)
    gadget = GetWindowLong_(hWnd,#GWL_ID)
    Select msg
        Case #WM_KILLFOCUS
            style = GetWindowLong_(hWnd,#GWL_STYLE)
            SetWindowLong_(hWnd,#GWL_STYLE,~#BS_DEFPUSHBUTTON & style)
            InvalidateRect_(hWnd,0,1)
            ProcedureReturn 0
        Case #WM_SETFOCUS
            style = GetWindowLong_(hWnd,#GWL_STYLE)
            SetWindowLong_(hWnd,#GWL_STYLE,style|#BS_DEFPUSHBUTTON)
            InvalidateRect_(hWnd,0,1)
            ProcedureReturn 0
    EndSelect
    ProcedureReturn CallWindowProc_(GetGadgetData(gadget),hWnd,msg,wParam,lParam)
EndProcedure

Procedure myButtonGadget(nr,x,y,w,h,text$,flags=0)
    gadget = ButtonGadget(nr,x,y,w,h,text$,flags)
    If nr<>#PB_Any
        gadget=nr
    EndIf
    old = SetWindowLongPtr_(GadgetID(gadget),#GWLP_WNDPROC,@myButtonProc())
    SetGadgetData(gadget,old)
    ProcedureReturn gadget
EndProcedure

  If OpenWindow(0, 0, 0, 550, 200, "ButtonGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    StringGadget(0, 8,  10, 306, 20, "Normal StringGadget...")
    StringGadget(1, 8,  35, 306, 20, "1234567", #PB_String_Numeric)
    StringGadget(2, 8,  60, 306, 20, "Readonly StringGadget", #PB_String_ReadOnly)
    StringGadget(3, 8,  85, 306, 20, "lowercase...", #PB_String_LowerCase)
    StringGadget(4, 8, 110, 306, 20, "uppercase...", #PB_String_UpperCase)
    StringGadget(5, 8, 140, 306, 20, "Borderless StringGadget", #PB_String_BorderLess)
    StringGadget(6, 8, 170, 306, 20, "Password", #PB_String_Password)

    myButtonGadget(7, 330, 10, 200, 20, "Standard Button")
    myButtonGadget(8, 330, 40, 200, 20, "Left Button", #PB_Button_Left)
    myButtonGadget(9, 330, 70, 200, 20, "Right Button", #PB_Button_Right)
    myButtonGadget(10,330,100, 200, 60, "Multiline Button  (longer text gets automatically wrapped)", #PB_Button_MultiLine)

    Repeat
        Select WaitWindowEvent()
            Case #PB_Event_CloseWindow
                Break
            Case #PB_Event_Gadget
                If EventType() = #PB_EventType_Focus
                    If GadgetType(EventGadget())=#PB_GadgetType_String
                        SendMessage_(GadgetID(EventGadget()),#EM_SETSEL,0,-1)
                    EndIf
                EndIf
         EndSelect
    ForEver
  EndIf
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Stringedget selektieren wenn es den focus erhält

Beitrag von Nino »

Pure_Beginner hat geschrieben:nicht der text des buttons soll selektiert werden sondern der button selbst,
wenn man z.b. von einem button zu anderen mittels der tabtaste springt damit man erkennt wo man gerade ist
Da ist ein bekanntes Problem bei eingeschalteter XP-Skin Unterstützung.

Die Lösung beteht darin, einmal das Macro SetUIState aufzurufen:

Code: Alles auswählen

#UIS_CLEAR = 2
#UISF_HIDEFOCUS = 1
#UISF_HIDEACCEL = 2

Macro SetUIState (_hwnd_)
   ; Focus und unterstrichene Buchstaben richtig anzeigen
   SendMessage_(_hwnd_, #WM_UPDATEUISTATE, ((#UISF_HIDEFOCUS|#UISF_HIDEACCEL)<<16) | #UIS_CLEAR, 0)
EndMacro


;-- Demo
If OpenWindow(0, 0, 0, 400,150,  "Focus Test", #PB_Window_ScreenCentered |#PB_Window_SystemMenu)
   ButtonGadget(0, 100, 100, 80, 25, "Button &1")
   ButtonGadget(1, 200, 100, 80, 25, "Button &2")
   SetActiveGadget(0)

   SetUIState(WindowID(0))

   Repeat
   Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Grüße, Nino
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Stringedget selektieren wenn es den focus erhält

Beitrag von Kiffi »

@Pure_Beginner:

wenn ich mal wieder mahnen und warnen darf <)

Grade als Einsteiger sollte man sich IMO nicht mit solchen
Nebensächlichkeiten aufhalten, sondern erst einmal die Grundlagen
der PureBasic Window- und Gadgetprogrammierung erlernen.

Grade wenn Du aus der DotNet-Ecke kommst, gibt es bei
PureBasic einige Unterschiede, die beachtet werden müssen.

Erst wenn Dein Programm stabil läuft und Du Deinen Code auch
wirklich verstehst, würde ich persönlich die Feinheiten Deiner
GUI angehen.

Es besteht nämlich sonst, die Gefahr, dass Du Dich
im API-Dschungel verirrst und alsbald keine Freude
mehr am eigentlichen PB-Programmieren hast.

Nur mal so am Rande ... Kiffi
a²+b²=mc²
Benutzeravatar
Pure_Beginner
Beiträge: 247
Registriert: 29.09.2011 21:49
Computerausstattung: i7 9XX 4000 MHZ / 12 GB RAM / Win 8.1 64Bit / Win 7 64Bit
Wohnort: Brühl

Re: Stringedget selektieren wenn es den focus erhält

Beitrag von Pure_Beginner »

vielen dank für die zahlreichen und nützlichen tipps,

die für sich genommen alle funktionieren.

leider weis ich nicht wie ich diese in meine schleife einbinden kann.

habe auch bemerkt das ich mit der tabtaste zwar weiterspringen aber nur mit der maus auslösen kann nicht mit der returntaste.

wär jemand bereit über meinen quellcode zu schauen und mir zu helfen, möchte nicht nur hilfe sondern auch verstehen warum die dinge sind wie sie sind.

der normale programm code macht mir keine schwierigkeiten, ich verstehe nur nicht ( ganz ) das system und den aufbau der gadgats.

nochmals vielen dank für die zahlreiche hilfe
PureBasic 5.30 Beta 3 (X64/X86) | Win 8 (64) Pro / Win 7 (64) Pro | Es ist der Hobbyist[/col
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

Re: Stringedget selektieren wenn es den focus erhält

Beitrag von ts-soft »

Pure_Beginner hat geschrieben:habe auch bemerkt das ich mit der tabtaste zwar weiterspringen aber nur mit der maus auslösen kann nicht mit der returntaste.
In einem Windows-Fenster wird mit der Leertaste ausgelöst, nicht mit Return.
Mit Return wird es nur in Dialogen und das eigentlich auch nur in älteren Programmen.
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
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Stringedget selektieren wenn es den focus erhält

Beitrag von Kiffi »

Pure_Beginner hat geschrieben:wär jemand bereit über meinen quellcode zu schauen und mir zu helfen
Denke schon. Nur... ohne Quellcode können wir nicht schauen.

Grüße ... Kiffi
a²+b²=mc²
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Stringedget selektieren wenn es den focus erhält

Beitrag von Nino »

<frei nach Loriot>
Ich schaue nicht auf den Quellcode, ich schaue nur ganz allgemein in diese Richtung.
</frei nach Loriot>
:D

SCNR, Nino
Benutzeravatar
Pure_Beginner
Beiträge: 247
Registriert: 29.09.2011 21:49
Computerausstattung: i7 9XX 4000 MHZ / 12 GB RAM / Win 8.1 64Bit / Win 7 64Bit
Wohnort: Brühl

Re: Stringedget selektieren wenn es den focus erhält

Beitrag von Pure_Beginner »

Habs geschaft und alleine hingekriegt bin stolz wie tausen affen.

besten dank nochmals für die viele hilfe unf die guten tipps. :bounce:
PureBasic 5.30 Beta 3 (X64/X86) | Win 8 (64) Pro / Win 7 (64) Pro | Es ist der Hobbyist[/col
Antworten