Consultor Eletrônico



Kbase 22037: How To Apply Focus To a Widget Using Windows API Programming
Autor   Progress Software Corporation - Progress
Acesso   Público
Publicação   20/05/2001
SUMMARY:

This Knowledge Base Solution shows you a way to force focus to a particular widget using Windows API programming from within a Progress procedure. This is simply an alternative approach to using the APPLY Progress 4GL Statement, which provides you with the same functionality in a higher level.

SOLUTION:

This code places calls to the Win32 API function, PostMessageA, in order to accomplish the job of programmatically changing widget focus.

&SCOPED-DEFINE WM_LBUTTONDOWN 513
&SCOPED-DEFINE WM_LBUTTONUP 514
&SCOPED-DEFINE MK_LBUTTON 1

DEFINE VARIABLE FILL-IN-1 AS CHARACTER FORMAT "X(256)":U
LABEL "Focus on"
VIEW-AS FILL-IN
SIZE 24 BY 1 NO-UNDO.

DEFINE VARIABLE FILL-IN-2 AS CHARACTER FORMAT "X(256)":U
LABEL "Fill 2"
VIEW-AS FILL-IN
SIZE 24 BY 1 NO-UNDO.

DEFINE FRAME DEFAULT-FRAME
FILL-IN-1 AT ROW 1.62 COL 11 COLON-ALIGNED
FILL-IN-2 AT ROW 1.62 COL 49 COLON-ALIGNED
WITH 1 DOWN NO-BOX KEEP-TAB-ORDER OVERLAY
SIDE-LABELS NO-UNDERLINE THREE-D
AT COL 1 ROW 1
SIZE 80.4 BY 2.86.

ON ENTRY OF FILL-IN-1 IN FRAME DEFAULT-FRAME
DO:
ASSIGN FILL-IN-1:SCREEN-VALUE = SELF:NAME.
END.

ON ENTRY OF FILL-IN-2 IN FRAME DEFAULT-FRAME
DO:
ASSIGN FILL-IN-1:SCREEN-VALUE = SELF:NAME.
PAUSE 3.
RUN moveFocus(FILL-IN-1:HANDLE).
RETURN NO-APPLY.
END.

MESSAGE
"Click on fill-in 2 and wait for 3 seconds to see the cursor":U
"moving back to fill-in 1".

ASSIGN
CURRENT-WINDOW:TITLE = "Changing widget focus sample program"
CURRENT-WINDOW:HEIGHT = 2.86
CURRENT-WINDOW:WIDTH = 80.4.

ENABLE ALL WITH FRAME DEFAULT-FRAME.

WAIT-FOR CLOSE OF THIS-PROCEDURE.

PROCEDURE moveFocus:
DEFINE INPUT PARAMETER phWidget AS HANDLE NO-UNDO.

DEFINE VARIABLE viReturnValue AS INTEGER NO-UNDO.

RUN PostMessageA(phWidget:HWND,
{&WM_LBUTTONDOWN},
{&MK_LBUTTON}, /* Mouse left button click */
0,
OUTPUT viReturnValue).
RUN PostMessageA(phWidget:HWND,
{&WM_LBUTTONUP},
0,
0,
OUTPUT viReturnValue).
END PROCEDURE.

PROCEDURE PostMessageA EXTERNAL "user32.dll":U:
DEFINE INPUT PARAMETER hwnd AS SHORT NO-UNDO.
DEFINE INPUT PARAMETER wMsg AS SHORT NO-UNDO.
DEFINE INPUT PARAMETER wParam AS SHORT NO-UNDO.
DEFINE INPUT PARAMETER lParam AS LONG NO-UNDO.
DEFINE RETURN PARAMETER ReturnValue AS SHORT NO-UNDO.
END PROCEDURE.


References to Written Documentation:

Progress Knowledge Base Solution 21284, "ACTIVEX - How To Send Accelerators To Normal Widgets."