Button Fokus?

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Button Fokus?

Beitrag von _JON_ »

Hallo Leute,

es gibt doch seit Vista 2 Fokus-arten für ButtonGadgets.
Der klassische graue Strichrahmen und diesen neuen sich leicht bewegenden blauen.
Den blauen Rahmen bekomme ich, wenn ich das #PB_Button_Default Flag verwende.

Nun mein Problem, der blauen Rahmen bleibt trotz Fokusverlust immer beim Button 2.

Code: Alles auswählen

OpenWindow(0, 0, 0, 222, 200, "Button", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(0, 10, 10, 200, 30, "Button 1")
ButtonGadget(1, 10, 60, 200, 30, "Button 2", #PB_Button_Default)

Repeat
  
   Event = WaitWindowEvent()     
     Select Event     
       Case #PB_Event_Gadget
         Select EventGadget()
           Case 0
             ;SetFocus_(GadgetID(0))
           Case 1
             ;SetFocus_(GadgetID(1))
         EndSelect
     EndSelect
     
Until Event = #PB_Event_CloseWindow
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Benutzeravatar
TheCube
Beiträge: 169
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Re: Button Fokus?

Beitrag von TheCube »

Ich glaube dein blauer Rahmen (oder wasimmer) auf Button2 hat nix mit dem Focus zu tun.
Der wechselt wie er soll mit TAB (auf Win7 im Classic-Style gestrichelt) brav hin-und her.
Mit Aero&Co Darstellung brauchts nur eine Zeile mehr um auch da die Strichelung zu bekommen, habe ich leider grad nicht zur Hand.

Edit: Achso, ein paar Post drunter habe ich die eigentliche Frage dann auch erfasst. :oops:

Nichtsdestrotrotz noch als Nachtrag:

Code: Alles auswählen

;Focusrahmen trotz XP-Skinsupport
SendMessage_(WindowID(#Window0), #WM_CHANGEUISTATE, 2 | (1 << 16), 0)
Zuletzt geändert von TheCube am 04.12.2012 12:47, insgesamt 1-mal geändert.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Button Fokus?

Beitrag von Kiffi »

@_JON_:

meinst Du sowas hier?

Code: Alles auswählen

OpenWindow(0, 0, 0, 222, 200, "Button", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

ButtonGadget(0, 10, 10, 200, 30, "B1 -> Default")
ButtonGadget(1, 10, 60, 200, 30, "B2 -> Default")
ButtonGadget(2, 10, 110, 200, 30, "Button 1")
ButtonGadget(3, 10, 160, 200, 30, "Button 2")

Repeat
	
	Event = WaitWindowEvent()     
	Select Event     
		Case #PB_Event_Gadget
			Select EventGadget()
				Case 0
					SendMessage_(GadgetID(2), #BM_SETSTYLE, #BS_DEFPUSHBUTTON, #True) 
					SendMessage_(GadgetID(3), #BM_SETSTYLE, 0, #True) 
				Case 1
					SendMessage_(GadgetID(2), #BM_SETSTYLE, 0, #True) 
					SendMessage_(GadgetID(3), #BM_SETSTYLE, #BS_DEFPUSHBUTTON, #True) 
			EndSelect
	EndSelect
	
Until Event = #PB_Event_CloseWindow
(weiß nicht, ob das 'sauber' ist...)

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: Button Fokus?

Beitrag von _JON_ »

@Kiffi
Danke, das sieht doch schon ganz gut aus :D

Denke das beste wäre die Buttons mit BS_NOTIFY Flag zu erstellen und dann mittels BN_KILLFOCUS und BN_SETFOCUS zu bearbeiten.

Edit: Funktioniert super!

Code: Alles auswählen

Procedure WindowCallback(hWnd.i, uMsg.i, wParam.i, lParam.i) 

  Select uMsg
    Case #WM_COMMAND
      Select wParam >> 16 &$FFFF
        Case #BN_SETFOCUS
          SendMessage_(lParam, #BM_SETSTYLE, #BS_DEFPUSHBUTTON, #True) 
        Case #BN_KILLFOCUS
          SendMessage_(lParam, #BM_SETSTYLE, 0, #True) 
      EndSelect
    EndSelect

    ProcedureReturn #PB_ProcessPureBasicEvents 
EndProcedure 


OpenWindow(0, 0, 0, 222, 200, "Button", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

ButtonGadget(0, 10, 10, 200, 30, "B1 -> Default")
ButtonGadget(1, 10, 60, 200, 30, "B2 -> Default")
ButtonGadget(2, 10, 110, 200, 30, "Button 1")
ButtonGadget(3, 10, 160, 200, 30, "Button 2")


SetWindowLong_(GadgetID(0),#GWL_STYLE,GetWindowLong_(GadgetID(0),#GWL_STYLE)| #BS_NOTIFY)
SetWindowLong_(GadgetID(1),#GWL_STYLE,GetWindowLong_(GadgetID(1),#GWL_STYLE)| #BS_NOTIFY)
SetWindowLong_(GadgetID(2),#GWL_STYLE,GetWindowLong_(GadgetID(2),#GWL_STYLE)| #BS_NOTIFY)
SetWindowLong_(GadgetID(3),#GWL_STYLE,GetWindowLong_(GadgetID(3),#GWL_STYLE)| #BS_NOTIFY)


SetWindowCallback(@WindowCallback())

Repeat
   Event = WaitWindowEvent()     
   
Until Event = #PB_Event_CloseWindow
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Button Fokus?

Beitrag von Danilo »

_JON_ hat geschrieben:Denke das beste wäre die Buttons mit BS_NOTIFY Flag zu erstellen und dann mittels BN_KILLFOCUS und BN_SETFOCUS zu bearbeiten.
Oder so: Probier es mal mit #BS_DEFPUSHBUTTON wie in Dialogen
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: Button Fokus?

Beitrag von _JON_ »

Danilo hat geschrieben:
_JON_ hat geschrieben:Denke das beste wäre die Buttons mit BS_NOTIFY Flag zu erstellen und dann mittels BN_KILLFOCUS und BN_SETFOCUS zu bearbeiten.
Oder so: Probier es mal mit #BS_DEFPUSHBUTTON wie in Dialogen
Ah, das habe ich mit der Suche leider nicht gefunden, danke.

Perfekt! In deiner Version ist sogar diese hässliche graue Rahmen weg. :D

EDIT: Ein Problem gibt es noch, der #BS_DEFPUSHBUTTON sollte eigentlich auf die Enter taste reagieren
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Button Fokus?

Beitrag von Danilo »

_JON_ hat geschrieben:EDIT: Ein Problem gibt es noch, der #BS_DEFPUSHBUTTON sollte eigentlich auf die Enter taste reagieren
Der Button reagiert auf SPACE.

Für ENTER machst Du bei SETFOCUS ein AddKeyboardShortcut dazu, und bei KILLFOCUS ein entsprechendes RemoveKeyboardShortcut.
Dann kollidiert es nicht mit anderen Gadgets die ENTER abfragen (Scintilla und so). In der Eventschleife dann dieses Menu-Ereignis abfragen
und auswerten welcher Button gedrückt wurde (oder als Argument 'Event' bei AddKeyboardshortcut gleich die Gadget-Nr setzen).
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: Button Fokus?

Beitrag von _JON_ »

Danilo hat geschrieben:
_JON_ hat geschrieben:EDIT: Ein Problem gibt es noch, der #BS_DEFPUSHBUTTON sollte eigentlich auf die Enter taste reagieren
Der Button reagiert auf SPACE.
Ja, aber nur weil er im diesem Beispiel den fokus hat.

laut MSDN
BS_DEFPUSHBUTTON:

Creates a push button that behaves like a BS_PUSHBUTTON style button, but has a distinct appearance. If the button is in a dialog box, the user can select the button by pressing the ENTER key, even when the button does not have the input focus. This style is useful for enabling the user to quickly select the most likely (default) option.
laut diesem Artikel soll die Funktion IsDialogMessage das Enter in ein WM_COMMAND übersetzen

How do I use the Default Push Button in a dialog?
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Button Fokus?

Beitrag von Danilo »

_JON_ hat geschrieben:laut MSDN
BS_DEFPUSHBUTTON:

Creates a push button that behaves like a BS_PUSHBUTTON style button, but has a distinct appearance. If the button is in a dialog box, the user can select the button by pressing the ENTER key, even when the button does not have the input focus. This style is useful for enabling the user to quickly select the most likely (default) option.
Ein PB-Fenster ist halt kein Dialog. Wenn Du Dein Fenster als Dialog aufbaust, kannst Du ja einen
AddKeyboardshortcut mit Enter für das ganze Fenster setzen und dann die Default-Aktion auslösen.
Dann sollte der DefPushButton aber mMn fest sein, sich nicht mit dem Focus ändern.

IsDialogMessage wird nach GetMessage/PeekMessage aufgerufen. Um das zu machen müsstest Du WaitWindowEvent()/WindowEvent() von PB ersetzen.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: Button Fokus?

Beitrag von _JON_ »

Hast ja Recht, mit AddKeyboardShortcut funktioniert es jetzt auch sehr gut.
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Antworten