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."