Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.
29265 Discussions

Is it possible to simulate a DLG_GAINFOCUS behavior for controls other than the Edit Box?

rkiseral
Beginner
716 Views
Hello All

I was wondering if there was some way to have an event pop up when the focus is placed on a control of a type other than an Edit Box.

In my dialog, I have made it such that as a user tabs (or mouse clicks) through the various edit boxes the colors invert (i.e., white text on a black background) so as to make it real easy for the user to tell where he/she was on the dialog. This was easy enough to do using the DlgSetSub function and the DLG_GAINFOCUS and DLG_LOSEFOCUS indices, in combination with a subclassed callback procedure, as Mr. Jugoslav Dujic and Mr. Anthony Richards were kind enough to help me with. This method also allowed me to incorporate some validation code as well. Of course, the other control types don't support DLG_GAINFOCUS and DLG_LOSEFOCUS.

I would like to do a similar sort of thing for Combo Boxes, Check Boxes, and Buttons, if possible, but at present am at a loss as to how to proceed.

Is something like this even possible? I am hoping that a solution involving the subclassing technique might be possible. Anything more heroic than that may be beyond my skill level and/or project time constraints.

I am using IVF 11.0.066, integrated into VS 2008, on a 32 bit Vista platform. The application type is windowed (not QuickWin). My client has asked for a 100% FORTRAN solution.

Thanks in advance for any help,

Bob Kiser

0 Kudos
2 Replies
Paul_Curtis
Valued Contributor I
716 Views
You can obtain similar behavior by enabling Windows API "hover" messages, which are returned to your message loop via WM_NOTIFY and indicate which subcontrol is being hovered over; this is the point at which you would then change the subcontrol appearances. Here is how to set this up for a ListView control; this routine is called as part of processing of WM_INITDIALOG for the dialog which contains the ListView:

[cpp]	!	enable hover-detection for a listview control; hover information
! is returned via LVN_HOTTRACK messages within WM_NOTIFY
SUBROUTINE ListViewHoverEnable (hwnd, controlId)
IMPLICIT NONE
INTEGER, INTENT(IN) :: hwnd
INTEGER, INTENT(IN) :: controlId

INTEGER :: rval

rval = SendControlMessage (hwnd, controlId, &
LVM_SETEXTENDEDLISTVIEWSTYLE, &
LVS_EX_TRACKSELECT, &
LVS_EX_TRACKSELECT)
END SUBROUTINE ListViewHoverEnable[/cpp]

0 Kudos
Jugoslav_Dujic
Valued Contributor II
716 Views
Quoting - rkiseral
This was easy enough to do using the DlgSetSub function and the DLG_GAINFOCUS and DLG_LOSEFOCUS indices, in combination with a subclassed callback procedure, as Mr. Jugoslav Dujic and Mr. Anthony Richards were kind enough to help me with. This method also allowed me to incorporate some validation code as well. Of course, the other control types don't support DLG_GAINFOCUS and DLG_LOSEFOCUS.

I would like to do a similar sort of thing for Combo Boxes, Check Boxes, and Buttons, if possible, but at present am at a loss as to how to proceed.

Yes, you can do almost anything by subclassing. (Actually, it might have been cleaner if you had redone the entire dialog using Windows API, but now that you here...).

Most controls have xxN_SETFOCUS and xxN_KILLFOCUS notification messages. Those are "subtypes" of WM_COMMAND message. IFLOGM (obviously) implements only EN_SETFOCUS and EN_KILLFOCUS handling, for edit boxes. In your subclassing procedure, you need something along these lines (untested):
[cpp]case (WM_COMMAND)
  select case(HIWORD(wParam))
  case(CBN_SETFOCUS, BN_SETFOCUS, LBN_SETFOCUS)
    hControl = lParam
    idControl = LOWORD(wParam)
    !now do something with hControl or idControl
  case default
    ret = CallWindowProc(lpfnOldDlgProc,...)
  end select
    [/cpp]


0 Kudos
Reply