Has Focus/ Lost focus

Started by Gary Stout, January 02, 2015, 05:51:38 AM

Previous topic - Next topic

Gary Stout

I am trying to determine through a message when a control has focus and when it loses focus. For example, when a textbox has focus, I change the background color to highlight the active textbox and when it loses focus, I change the color back to its normal color.

Thanks,
Gary

David Kenny

You are looking for the EN_SETFOCUS and EN_KILLFOCUS messages.  Both supported by FF message handling routines.

Gary Stout

Thanks David,

I will check those.
Your textbox/listbox example has been very helpful. I have made a few modifications to your example so that it acts pretty much like a combobox. Once you type a letter into the textbox and the listbox opens, I now have the selectionbar appear and the textbox will trap the up/down arror keys so that one can move the selectionbar in the listbox like a normal combobox selection would act. Pressing <ENTER> will select the highlighted item or pressing <ESC> will close the listbox and clear the search text in the textbox. I am also trapping the HOME and End keys to either go to the top of the list of the bottom. I am just about to the point of moving the test code over to the actual program. Your code was very helpful to get the results I was trying to duplicate from the old program.

Thanks again,
Gary

David Kenny

Thanks for the kind words Gary.

I'm glad you liked it and can make use of it.  I had always preferred the filtering method instead of the more common method of simply scrolling to the first match.  I couldn't find a PB version of it anywhere (I am sure I just missed it, but I looked for some time), so I resorted to rolling my own.

It's good you have been able to modify it to suit your needs also.  As I said, you could do it with the combobox, but there was a reason I did it that way.  It might have been because I didn't like the default roll-up and drop-down behavior of the combobox.  It's been too long.

David

Gary Stout

Quote from: David Kenny on January 02, 2015, 02:53:39 PM
You are looking for the EN_SETFOCUS and EN_KILLFOCUS messages.  Both supported by FF message handling routines.

When I try either of these messages for a particular textbox, I seem to create an endless loop. Basically I put a messagebox in each of the two events and all I get is the Focus msgbox and the NoFocus msgbox alternating. What am I missing? Basically, my goal is to set the background color of the textbox while it has the focus and then revert back to the default color once the textbox loses focus.

Thanka again,
Gary

Gary Stout

I think I may have figured it out. I am still trying to learn where to put stuff. I did some searching on the PB Forums and found some DDT code that I was able to adapt to FF code. This is what I done....if someone can confirm I did it/put it in the right place.

David, this is the Textbox from the sample code you posted in another post.


Function FORM1_WM_COMMAND ( _
                          hWndForm     As Dword, _  ' handle of Form
                          hWndControl  As Dword, _  ' handle of Control
                          wNotifyCode  As Long,  _  ' notification code
                          wID          As Long   _  ' item, control, or accelerator identifer
                          ) As Long

   Select Case wID
          Case IDC_FORM1_FINDTB
               If wNotifyCode = %EN_SetFocus Then
                  FF_Control_SetColor(HWND_FORM1_FINDTB, -1, &H00FFFF )
               ElseIf wNotifyCode = %EN_KillFocus Then
                  FF_Control_SetColor(HWND_FORM1_FINDTB, -1, &HFFFFFF )
               End If 
   End Select
End Function


Thanks again,
Gary

ps... I am gonna master this thing one way or the other! LOL

David Kenny

The msgbox is causing that.  The control loses focus to the msgbox and regains it when you close the msgbox.  I am betting that a msgbox added to new code you posted will have the same results.

You can use a label and change it's text instead of the msgbox.  The label won't be getting the focus so it won't cause the same problem. You can also use ZTrace, but that will take the focus away one time if it's not already open.  To stop that you can fire ztrace once in the Form Create routine to make sure it's already open.

You did it in the right place the first time.  Just don't use msgbox in there. :)

David

Gary Stout

Thanks David!

I tried putting just the FF_Control_SetColor code in the SetFocus and the KillFocus events for the textbox and it works perfect! Thanks again for helping me along. Once I learn where to put things, I don't think I will have as many problems. It is all starting to make more sense...a little at a time.

Thanks again,
Gary

David Kenny

I wish I could say I skipped the frustration and learning curve, but I can't.  I have no doubt you will get up to speed quickly.

Wilko Verweij

You can use the Set Selection snippet from FireFly, like

Function YourControl_EN_SETFOCUS ( _
                                      ControlIndex   As Long,  _  ' index in Control Array
                                      hWndForm       As Dword, _  ' handle of Form
                                      hWndControl    As Dword, _  ' handle of Control
                                      idTextControl  As Long   _  ' identifier of text control
                                      ) As Long

  FF_TextBox_SetSel(hWndControl, 0, -1)

End Function

That makes the entire text selected. Hope this helps.
Wilko

Gary Stout

Thanks for the reply, Wilko!

Petrus Vorster

#11
You can always do it the quick and dirty way....but its time consuming if you have loads of textboxes.
In the Textbox Setfocus and killfocus events just place the color changes.
So not WHILE it has the focus, but when it receives the focus, and change again on KILLFOCUS.

But its not via the message you were looking for!  ???
-Regards
Peter

Gary Stout

Quote from: Petrus Vorster on January 06, 2015, 04:40:46 PM
You can always do it the quick and dirty way....but its time consuming if you have loads of textboxes.

Thanks Petrus,

Is there a better way or location is one is using quite a few textboxes? The particular form I am working on has maybe 20 textboxes....not a bunch, but enough. If there is an easier way to handle many textboxes, I would be greatful to know how!

Thanks again,
Gary

Paul Squires

Easiest method would be to create a Control Array of TextBoxes. In the message handler you identify the TextBox by using the ControlIndex parameter.
Paul Squires
PlanetSquires Software

Gary Stout

Thanks Paul,

I will explore that method. Do you have any FF updates in the works?
Good to hear from you! Hope you and your family have a great New Year!

Gary