Is a COMBO List Dropped?

after a lot of hunting around
I have found a way to track if the list of a DropCombo is showing

(?MyCombo{PROP:ListFEQ}){PROP:WndProc} = ADDRESS( MyWndProc)

In MyWndProc, watch for WM_PosChanging
you’d think WM_PosChanged too, tests show that doesn’t fire when I press ESC to close listbox

When the xMsg = WM_PosChanging
Then the LParam is a pointer to a WindowPos structure

Then look at WindowPos.Flag
BAND(WindowPos.Flag, SWP_ShowWindow)
BAND(WindowPos.Flag, SWP_HideWindow)

The following code just sends info to OutputDebugString (ODS)
But it’s enough to show that you get the necessary info

IntWin32     EQUATE(SIGNED)

gtWindowPos  GROUP,TYPE ! https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-windowpos 
HWND             HWND 
HWNDInsertAfter  HWND 
X                IntWin32 ! Left
Y                IntWin32 ! Top  
CX               IntWin32 ! Width in pixels
Cy               IntWin32 ! height in pixels
FLAGS            UINT     ! SWP_* values 
             END 

!SetWindowPos Flags
SWP_NOSIZE          EQUATE(00001h) !
SWP_NOMOVE          EQUATE(00002h) !
SWP_NOZORDER        EQUATE(00004h) !
SWP_NOREDRAW        EQUATE(00008h) !
SWP_NOACTIVATE      EQUATE(00010h) !
SWP_FRAMECHANGED    EQUATE(00020h) !  /* The frame changed: send WM_NCCALCSIZE */
SWP_SHOWWINDOW      EQUATE(00040h) !
SWP_HIDEWINDOW      EQUATE(00080h) !
SWP_NOCOPYBITS      EQUATE(00100h) !
SWP_NOOWNERZORDER   EQUATE(00200h) !  /* Don't do owner Z ordering */
SWP_NOSENDCHANGING  EQUATE(00400h) !  /* Don't send WM_WINDOWPOSCHANGING */

SWP_DRAWFRAME       EQUATE(SWP_FRAMECHANGED )
SWP_NOREPOSITION    EQUATE(SWP_NOOWNERZORDER)

!#if(WINVER >= 0x0400)
SWP_DEFERERASE      EQUATE(02000h)
SWP_ASYNCWINDOWPOS  EQUATE(04000h)
!#endif /* WINVER >= 0x0400 */


WindowPos:ToString PROCEDURE(LONG xlpWindowPos)!,STRING 
WindowPosStructure &gtWindowPos
 CODE 
    WindowPosStructure &= ( xlpWindowPos ) 
    RETURN WindowPos:ToString( WindowPosStructure)

WindowPos:ToString PROCEDURE(*gtWindowPos xWindowPos)!,STRING 
 CODE 
    RETURN            ' HWND[' & xWindowPos.HWND            &']' |
          &' HWNDInsertAfter[' & xWindowPos.HWNDInsertAfter &']' |
          &              ' X[' & xWindowPos.X               &']' |
          &              ' Y[' & xWindowPos.Y               &']' |
          &              ' W[' & xWindowPos.CX              &']' |
          &              ' H[' & xWindowPos.Cy              &']' |
          &          ' FLAGS[' & xWindowPos.FLAGS           &']=' & WindowPosFlags:ToString( xWindowPos.Flags )


WindowPosFlags:ToString PROCEDURE(UINT xFlag)
Answer    ANY ! string of uknown length 
Remaining UINT
   CODE 
   Remaining = xFlag
                                              Answer = ''
   IF BAND( xFlag, SWP_NOSIZE         ) THEN  Answer = Answer & 'NoSize '         ; Remaining -= SWP_NOSIZE         END 
   IF BAND( xFlag, SWP_NOMOVE         ) THEN  Answer = Answer & 'NoMove '         ; Remaining -= SWP_NOMOVE         END 
   IF BAND( xFlag, SWP_NOZORDER       ) THEN  Answer = Answer & 'NoZOrder '       ; Remaining -= SWP_NOZORDER       END 
   IF BAND( xFlag, SWP_NOREDRAW       ) THEN  Answer = Answer & 'NoRedraw '       ; Remaining -= SWP_NOREDRAW       END 
   IF BAND( xFlag, SWP_NOACTIVATE     ) THEN  Answer = Answer & 'NoActivate '     ; Remaining -= SWP_NOACTIVATE     END 
   IF BAND( xFlag, SWP_FRAMECHANGED   ) THEN  Answer = Answer & 'FrameChanged '   ; Remaining -= SWP_FRAMECHANGED   END 
   IF BAND( xFlag, SWP_SHOWWINDOW     ) THEN  Answer = Answer & 'ShowWindow '     ; Remaining -= SWP_SHOWWINDOW     END 
   IF BAND( xFlag, SWP_HIDEWINDOW     ) THEN  Answer = Answer & 'HideWindow '     ; Remaining -= SWP_HIDEWINDOW     END 
   IF BAND( xFlag, SWP_NOCOPYBITS     ) THEN  Answer = Answer & 'NoCopybits '     ; Remaining -= SWP_NOCOPYBITS     END 
   IF BAND( xFlag, SWP_NOOWNERZORDER  ) THEN  Answer = Answer & 'NoOwnerZOrder '  ; Remaining -= SWP_NOOWNERZORDER  END 
   IF BAND( xFlag, SWP_NOSENDCHANGING ) THEN  Answer = Answer & 'NoSendChanging ' ; Remaining -= SWP_NOSENDCHANGING END 
  !IF BAND( xFlag, SWP_DRAWFRAME      ) THEN  Answer = Answer & 'DrawFrame '      ; Remaining -= SWP_DRAWFRAME      END  ! same as SWP_FrameChanged 
  !IF BAND( xFlag, SWP_NOREPOSITION   ) THEN  Answer = Answer & 'NoReposition '   ; Remaining -= SWP_NOREPOSITION   END  ! same as SWP_NoOwnerZOrder
   IF BAND( xFlag, SWP_DEFERERASE     ) THEN  Answer = Answer & 'DeferErase'      ; Remaining -= SWP_DEFERERASE     END 
   IF BAND( xFlag, SWP_ASYNCWINDOWPOS ) THEN  Answer = Answer & 'AsyncWindowpos ' ; Remaining -= SWP_ASYNCWINDOWPOS END 

   IF Answer = ''                       THEN Answer = 'Unknown['& xFlag &']'                END 
   IF Remaining                         THEN Answer = Answer & 'Remaining['& Remaining &']' END 

   RETURN Answer 

SharedWndProc   PROCEDURE(STRING xDescr, LONG xOrigWndProc, HWND xhwnd, UINT xMsg, WPARAM xW, LPARAM xL)!,LRESULT,PASCAL
Answer LRESULT,AUTO
W      GROUP,OVER(xW)
LoWord   SHORT 
HiWord   SHORT 
        END 
L      GROUP,OVER(xL)
LoWord   SHORT 
HiWord   SHORT 
        END 

WindowPosStructure &gtWindowPos
InterpretMsg       ANY
   CODE    

   CASE xMsg 
     OF WM_WindowPosChanging 
   OROF WM_WindowPosChanged  ; InterpretMsg = WindowPos:ToString( xL )
   ELSE InterpretMsg = ''
   END                                
                               
   Answer  = CallWindowProc( xOrigWndProc, xHWND, xMsg, xW, xL )

   DBG.ODS( xDescr & '_WndProc  Message['& dbg.GetEventDescr_WM(xMsg) &'] HWND['& xHWND &'] W.Hi['& W.HiWord &'] W.Lo['& W.LoWord &']   L.Hi['& L.HiWord &'] L.Lo['& L.LoWord &']   Answer['& Answer &'] ' & InterpretMsg )

   RETURN Answer
2 Likes