Announcement

Collapse
No announcement yet.

ws_topmost, BringWindowToTop, F4 closing wrong dialog

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Chris Holbrook
    replied
    SetWindowPos is exactly what is needed.

    Code:
    ' F4 problem solved by using SetWindowPos to place the
    ' dialogs in the correct z-relationship  - Thank you Colin Glenn!
    '
    ' Chris Holbrook 21st Jan 2009
    '
    #compile exe
    #dim all
    #include "win32api.inc"
    '------------------------------------------------------------------
    callback function CBPopup
        static hMain as dword
        local n as long
    
        select case as long cb.msg
            case %wm_user + 400
                hMain = cb.wparam
                enablewindow hMain, %false
    
            case %wm_destroy
                enablewindow hMain, %true
                BringWindowToTop(hMain)
                setfocus (hMain)
    
            case %wm_ncactivate
                if cb.wparam = %false then exit select ' we are losing focus
                enablewindow hMain, %true
                setwindowpos(hMain, cb.hndl, 0, 0, 0, 0, %SWP_NOACTIVATE or %SWP_NOMOVE or %SWP_NOSIZE)
                enablewindow hMain, %false
                setfocus (cb.hndl)
        end select
    end function
    
    '------------------------------------------------------------------
    callback function CB1
        static hpopup, hDmain as dword
        local lresult, W, H as long
    
        select case as long cb.msg
             case %wm_syscommand
                 
                 if IsWindow(hpopup) then
                     msgbox "We are here"
                     dialog end hpopup
                     function=1
                 end if
                
            case %wm_command
                if cb.ctl = 1001 then
                    if iswindow(hpopup) then exit select ' child window already exists
                    dialog new 0, "popup", 110, 110, 80, 80, _
                           %ws_popup or %ws_caption, %ws_ex_topmost to hpopup
                    dialog show modeless hpopup call CBpopup to lresult
                    dialog send hpopup, %wm_user + 400, cb.hndl, 0
                end if
        end select
    end function
    '------------------------------------------------------------------
    function pbmain () as long
        local lresult as long
        local hdlg as long
    
        dialog new 0, "main", 100, 100, 100, 100, _
               %ws_visible or %ws_popup or %ws_caption, to hDlg
        control add label, hDlg, 1001, "click here for popup dialog", 5, 90, 90, 15,  %ss_notify
        control set color hDlg, 1001, %white, %gray
        dialog show modal hDlg call CB1 to lresult
    
    end function

    Leave a comment:


  • Chris Holbrook
    replied
    Originally posted by colin glenn View Post
    SetWindowPos...
    has a lucky aura. I shall try it.

    Leave a comment:


  • colin glenn
    replied
    Originally posted by SDK
    Remarks

    Use the BringWindowToTop function to uncover any window that is partially or completely obscured by other windows.

    Calling this function is similar to calling the SetWindowPos function to change a window's position in the Z order. BringWindowToTop does not make a window a top-level window.
    So maybe try using the SetWindowPos to make a Z order adjustment when either form recognizes that it's got the focus back from ALT+F4?

    Leave a comment:


  • Chris Holbrook
    replied
    Originally posted by John Reinking View Post
    <Alt>-<F4> trapped in parent ...
    John, thanks for responding, the changes which you suggest, however, do not change the behaviour.

    It looks as if having sent the Bringwindowtotop to the "main" dialog, then even though the "popup" is still topmost, the "main" gets the F4. So before task switching, the popup is killed by F4, after task switching away then back to the popup, it is the "main" which is killed by F4.

    Leave a comment:


  • John Reinking
    replied
    <Alt>-<F4> trapped in parent ...

    Code:
    '------------------------------------------------------------------
    callback function CB1
        static hpopup, hDmain as dword
        local lresult, W, H as long
    
        select case as long cb.msg
            case %wm_command
                if cb.ctl = 1001 then
                    
                    [b]'----- Alter this line[/b]
                    [i]'if hpopup <> 0 then exit select ' child window already exists[/i]
                    
                    [b]'----- To read ...[/b]
                    [i]If IsWindow(hpopup) then exit select[/i]
    
                    dialog new 0, "popup", 110, 110, 80, 80, _
                           %ws_popup or %ws_caption, %ws_ex_topmost to hpopup
                    dialog show modeless hpopup call CBpopup to lresult
                    dialog send hpopup, %wm_user + 400, cb.hndl, 0
                    
                   [b] '----- Is this really necessary?[/b]
                   [i] 'do
                    '    dialog doevents
                    '    dialog get size hpopup to H, W
                    'loop while H
                    'hPopup = 0[/i]
    
                end if
             
            [b] '----- You could add this too ...[/b]
            [i] Case %wm_syscommand
                If IsWindow(hpopup) then
                    Msgbox "We are here"
                    Dialog End hpopup
                    Function=1
                End If[/i] 
        end select
    end function

    Leave a comment:


  • ws_topmost, BringWindowToTop, F4 closing wrong dialog

    Attempting to preserve the z-relationship between two dialogs, so that the popup one always appears to overlay the other.

    Although this arrangement works, pressing F4 after task-switching closes the wrong dialog - ie, not the top one!

    Would someone care to spot my mistake?

    Code:
    ' F4 problem
    ' in this example, after task-switching away from
    ' then back to the "popup" dialog, F4 appears to close the "wrong"
    ' dialog - i.e., not the top one.
    ' Possibly a consequence of using BringWindowtoTop,
    ' which is used to preserve the z-relationship between
    ' the "main" and "popup" dialogs, but how to correct it?
    '
    ' Chris Holbrook 21st Jan 2009
    '
    #compile exe
    #dim all
    #include "win32api.inc"
    '------------------------------------------------------------------
    callback function CBPopup
        static hMain as dword
        local n as long
    
        select case as long cb.msg
            case %wm_initdialog
                'BringWindowToTop(hMain)
    
            case %wm_user + 400
                hMain = cb.wparam
                enablewindow hMain, %false
    
            case %wm_destroy
                enablewindow hMain, %true
                BringWindowToTop(hMain)
                setfocus (hMain)
    
            case %wm_syscommand
                'n = cb.wparam and &HFFF0
                'dialog set text cb.hndl, "sys " + hex$(n)
                'sleep 500
    
            case %wm_ncactivate
                'dialog set text cb.hndl, "NCA " + hex$(cb.wparam)
                'sleep 500
                if cb.wparam = %false then exit select ' we are losing focus
                enablewindow hMain, %true
                BringWindowToTop(hMain)
                enablewindow hMain, %false
                setfocus (cb.hndl)
        end select
    end function
    
    '------------------------------------------------------------------
    callback function CB1
        static hpopup, hDmain as dword
        local lresult, W, H as long
    
        select case as long cb.msg
            case %wm_command
                if cb.ctl = 1001 then
                    if hpopup <> 0 then exit select ' child window already exists
                    dialog new 0, "popup", 110, 110, 80, 80, _
                           %ws_popup or %ws_caption, %ws_ex_topmost to hpopup
                    dialog show modeless hpopup call CBpopup to lresult
                    dialog send hpopup, %wm_user + 400, cb.hndl, 0
                    do
                        dialog doevents
                        dialog get size hpopup to H, W
                    loop while H
                    hPopup = 0
                end if
        end select
    end function
    '------------------------------------------------------------------
    function pbmain () as long
        local lresult as long
        local hdlg as long
    
        dialog new 0, "main", 100, 100, 100, 100, _
               %ws_visible or %ws_popup or %ws_caption, to hDlg
        control add label, hDlg, 1001, "click here for popup dialog", 5, 90, 90, 15,  %ss_notify
        control set color hDlg, 1001, %white, %gray
        dialog show modal hDlg call CB1 to lresult
    
    end function
Working...
X