In the past I asked about why my MessagePump was not working for a Dialog/Window (or rather would work as long as the mouse was over the window) but would stop looping until there was a message to be gotten.
The rough answer was that I was mixing DDT and SDK commands, but since then I still have the same problem. Below is an example of each for comparison
DDT Modal ---> Works as advertised
DDT Modeless ---> Works as advertised
Sdk -------> Stops Looping until there is a Message to be gotten.
Run each in debugger under "Animate" and do not move the mouse or touch the keyboard and you will see the loop stop looping.
The rough answer was that I was mixing DDT and SDK commands, but since then I still have the same problem. Below is an example of each for comparison
DDT Modal ---> Works as advertised
Code:
#COMPILE EXE #DIM ALL '------------------------------------------------------------------------------ ' ** Includes ** '------------------------------------------------------------------------------ #IF NOT %DEF(%WINAPI) #INCLUDE "WIN32API.INC" #ENDIF '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Constants ** '------------------------------------------------------------------------------ %IDD_DIALOG1 = 101 '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Declarations ** '------------------------------------------------------------------------------ DECLARE CALLBACK FUNCTION ShowDIALOG1Proc() DECLARE FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Main Application Entry Point ** '------------------------------------------------------------------------------ FUNCTION PBMAIN() ShowDIALOG1 %HWND_DESKTOP END FUNCTION '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** CallBacks ** '------------------------------------------------------------------------------ CALLBACK FUNCTION ShowDIALOG1Proc() SELECT CASE AS LONG CBMSG CASE %WM_INITDIALOG ' Initialization handler CASE %WM_NCACTIVATE STATIC hWndSaveFocus AS DWORD IF ISFALSE CBWPARAM THEN ' Save control focus hWndSaveFocus = GetFocus() ELSEIF hWndSaveFocus THEN ' Restore control focus SetFocus(hWndSaveFocus) hWndSaveFocus = 0 END IF CASE %WM_COMMAND ' Process control notifications SELECT CASE AS LONG CBCTL END SELECT END SELECT END FUNCTION '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Dialogs ** '------------------------------------------------------------------------------ FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG LOCAL lRslt AS LONG LOCAL hDlg AS DWORD DIALOG NEW hParent, "Dialog1", 70, 70, 201, 121, %WS_POPUP OR %WS_BORDER _ OR %WS_DLGFRAME OR %WS_THICKFRAME OR %WS_CAPTION OR %WS_SYSMENU OR _ %WS_MINIMIZEBOX OR %WS_MAXIMIZEBOX OR %WS_CLIPSIBLINGS OR _ %WS_VISIBLE OR %DS_MODALFRAME OR %DS_3DLOOK OR %DS_NOFAILCREATE OR _ %DS_SETFONT, %WS_EX_CONTROLPARENT OR %WS_EX_LEFT OR _ %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR, TO hDlg DIALOG SHOW MODAL hDlg, CALL ShowDIALOG1Proc TO lRslt '<--- Works as advertised FUNCTION = lRslt END FUNCTION '------------------------------------------------------------------------------
Code:
#COMPILE EXE #DIM ALL '------------------------------------------------------------------------------ ' ** Includes ** '------------------------------------------------------------------------------ #IF NOT %DEF(%WINAPI) #INCLUDE "WIN32API.INC" #ENDIF '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Constants ** '------------------------------------------------------------------------------ %IDD_DIALOG1 = 101 '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Declarations ** '------------------------------------------------------------------------------ DECLARE CALLBACK FUNCTION ShowDIALOG1Proc() DECLARE FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Main Application Entry Point ** '------------------------------------------------------------------------------ FUNCTION PBMAIN() ShowDIALOG1 %HWND_DESKTOP END FUNCTION '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** CallBacks ** '------------------------------------------------------------------------------ CALLBACK FUNCTION ShowDIALOG1Proc() SELECT CASE AS LONG CBMSG CASE %WM_INITDIALOG ' Initialization handler CASE %WM_NCACTIVATE STATIC hWndSaveFocus AS DWORD IF ISFALSE CBWPARAM THEN ' Save control focus hWndSaveFocus = GetFocus() ELSEIF hWndSaveFocus THEN ' Restore control focus SetFocus(hWndSaveFocus) hWndSaveFocus = 0 END IF CASE %WM_COMMAND ' Process control notifications SELECT CASE AS LONG CBCTL END SELECT END SELECT END FUNCTION '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Dialogs ** '------------------------------------------------------------------------------ FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG LOCAL lRslt AS LONG LOCAL hDlg AS DWORD LOCAL MessagePumping AS LONG DIALOG NEW hParent, "Dialog1", 70, 70, 201, 121, %WS_POPUP OR %WS_BORDER _ OR %WS_DLGFRAME OR %WS_THICKFRAME OR %WS_CAPTION OR %WS_SYSMENU OR _ %WS_MINIMIZEBOX OR %WS_MAXIMIZEBOX OR %WS_CLIPSIBLINGS OR _ %WS_VISIBLE OR %DS_MODALFRAME OR %DS_3DLOOK OR %DS_NOFAILCREATE OR _ %DS_SETFONT, %WS_EX_CONTROLPARENT OR %WS_EX_LEFT OR _ %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR, TO hDlg DIALOG SHOW MODELESS hDlg, CALL ShowDIALOG1Proc TO lRslt DO '<--- Works as advertised DIALOG DOEVENTS 0 TO MessagePumping LOOP WHILE MessagePumping FUNCTION = lRslt END FUNCTION '------------------------------------------------------------------------------
Code:
'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ' Declares '¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ #COMPILE EXE #INCLUDE "WIN32API.INC" '---------------------------------------------------------------------- DECLARE FUNCTION WndProc (BYVAL hWnd AS LONG, BYVAL wMsg AS LONG, _ BYVAL wParam AS LONG, BYVAL lParam AS LONG) AS LONG DECLARE FUNCTION MessagePump() AS LONG '¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ' Program entrance '¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ FUNCTION WINMAIN (BYVAL hInst AS LONG, BYVAL hPrevInstance AS LONG, _ BYVAL lpszCmdLine AS ASCIIZ PTR, BYVAL nCmdShow AS LONG) AS LONG LOCAL hDlg AS LONG, hCtl AS LONG, hFont AS LONG, _ wc AS WndClassEx, szClassName AS ASCIIZ * 80 hFont = GetStockObject(%ANSI_VAR_FONT) szClassName = "MyClassName" wc.cbSize = SIZEOF(wc) wc.style = %CS_HREDRAW OR %CS_VREDRAW wc.lpfnWndProc = CODEPTR(WndProc) wc.cbClsExtra = 0 wc.cbWndExtra = 0 wc.hInstance = hInst wc.hIcon = LoadIcon (%NULL, BYVAL %IDI_APPLICATION) wc.hCursor = LoadCursor(%NULL, BYVAL %IDC_ARROW) wc.hbrBackground = %COLOR_3DFACE + 1 wc.lpszMenuName = %NULL wc.lpszClassName = VARPTR(szClassName) wc.hIconSm = LoadIcon (%NULL, BYVAL %IDI_APPLICATION) CALL RegisterClassEx (wc) hDlg = CreateWindowEx(%WS_EX_DLGMODALFRAME OR %WS_EX_CONTROLPARENT OR %WS_EX_WINDOWEDGE, "MyClassName", "Dialog1", _ %WS_POPUP OR %WS_VISIBLE OR %WS_CLIPSIBLINGS OR %WS_CAPTION OR _ %WS_SYSMENU OR %WS_THICKFRAME OR %WS_MINIMIZEBOX OR %WS_MAXIMIZEBOX OR _ %DS_3DLOOK OR %DS_NOFAILCREATE OR %DS_SETFONT OR _ %DS_MODALFRAME, _ (GetSystemMetrics(%SM_CXSCREEN) - 318) / 2, _ (GetSystemMetrics(%SM_CYSCREEN) - 233) / 2, _ 318, 233, 0, 0, GetModuleHandle(""), BYVAL %NULL) ShowWindow hDlg, nCmdShow UpdateWindow hDlg FUNCTION = MessagePump END FUNCTION '¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ' Main Window procedure '¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ FUNCTION WndProc (BYVAL hWnd AS LONG, BYVAL wMsg AS LONG, _ BYVAL wParam AS LONG, BYVAL lParam AS LONG) AS LONG SELECT CASE wMsg CASE %WM_CREATE 'A good place to initiate things, declare variables, 'create controls and read/set settings from a file, etc. '------------------------------------------------------- CASE %WM_COMMAND 'Messages from controls and menu items are handled here. '------------------------------------------------------- SELECT CASE LOWRD(wParam) CASE %IDCANCEL IF HIWRD(wParam) = %BN_CLICKED THEN SendMessage hWnd, %WM_DESTROY, wParam, lParam FUNCTION = 0 : EXIT FUNCTION END IF END SELECT CASE %WM_CTLCOLORDLG SetBkColor wParam, GetSysColor(%COLOR_WINDOW) FUNCTION = GetStockObject(%NULL_BRUSH) EXIT FUNCTION CASE %WM_CTLCOLORBTN, %WM_CTLCOLOREDIT, %WM_CTLCOLORLISTBOX, %WM_CTLCOLORSTATIC ' wParam is handle of control's display context (hDC) ' lParam is handle of control ' Example on how to set colors to a specific control: '----------------------------------------------------- 'IF lParam = GetDlgItem(hWnd, CtlId) THEN ' SetBkColor wParam, GetSysColor(%COLOR_INFOBK) ' SetTextColor wParam, GetSysColor(%COLOR_INFOTEXT) ' FUNCTION = GetSysColorBrush(%COLOR_INFOBK) ' EXIT FUNCTION 'END IF '----------------------------------------------------- CASE %WM_DESTROY ' is sent when program ends - a good place to delete any created objects and ' store settings in file for next run, etc. Must send PostQuitMessage to end ' properly in SDK-style dialogs. The PostQuitMessage function sends a WM_QUIT ' message to the program's (thread's) message queue, and then WM_QUIT causes ' the GetMessage function to return zero in WINMAIN's message loop. '---------------------------------------------------------------------------- PostQuitMessage 0 FUNCTION = 0 : EXIT FUNCTION CASE %WM_SIZE IF wParam <> %SIZE_MINIMIZED THEN ' LOWRD(lParam) = width of dialog's client area ' HIWRD(lParam) = height of dialog's client area ' Example that resizes a control to dialog's client area: '------------------------------------------------------ 'LOCAL pt AS POINTAPI, rc AS RECT 'GetWindowRect GetDlgItem(hWnd, CtlId), rc 'get control's position on screen 'pt.x = rc.nLeft : pt.y = rc.nTop 'need left and top pos 'ScreenToClient hWnd, pt 'convert coordinates to client area 'MoveWindow GetDlgItem(hWnd, CtlId), pt.x, pt.y, _ ' LOWRD(lParam) - pt.x, HIWRD(lParam) - pt.y, %TRUE END IF END SELECT FUNCTION = DefWindowProc(hWnd, wMsg, wParam, lParam) END FUNCTION FUNCTION MessagePump() AS LONG LOCAL Msg AS tagMsg LOCAL PerformanceFrequency AS QUAD STATIC LastTime AS QUAD WHILE GetMessage(Msg, %NULL, 0, 0)<>0 TranslateMessage Msg DispatchMessage Msg QueryPerformanceFrequency PerformanceFrequency #DEBUG PRINT "Hwnd = " + TRIM$(STR$(Msg.hwnd)) + SPACE$(5) _ + "Message = " + TRIM$(STR$(Msg.message)) + SPACE$(5) _ + "Wparam = " + TRIM$(STR$(Msg.wParam)) + SPACE$(5) _ + "Lparam = " + TRIM$(STR$(Msg.lParam)) + SPACE$(5) _ + "Time = " + FORMAT$(((1/(PerformanceFrequency) * (Msg.time - LastTime)) * 1000), "0.000000") + " MilliSeconds" + SPACE$(5) _ + "X = " + TRIM$(STR$(Msg.pt.x)) + SPACE$(5) _ + "Y = " + TRIM$(STR$(Msg.pt.y)) LastTime = Msg.time WEND '<--- Why do I stop looping until the window gets a mouse or keyboard message???? FUNCTION = Msg.wParam END FUNCTION

Comment