Kbase 21557: How To Change the RESIZE Attr of a Window After Realizing It
Autor |
  Progress Software Corporation - Progress |
Acesso |
  Público |
Publicação |
  01/07/2005 |
|
Status: Unverified
GOAL:
How to change the Window's RESIZE Attribute after it has been realized.
FIX:
When Progress creates a window, a number of procedures are linked to triggers to handle the resize calls. These cannot be put in place after the creation of a window widget. Thus, if a window object is created with its RESIZE Attribute set to FALSE, then Progress does not even look for the Windows WM_SIZING messages that are sent when resizing a Window.
The solution is to create the Progress Window object with its RESIZE Attribute set to TRUE and then, use Windows API calls to disable the resize until you are ready to allow it.
The code provided below demonstrates how this can be accomplished:
&SCOPED-DEFINE WINDOW-NAME vhWinHdl
&SCOPED-DEFINE FRAME-NAME DEFAULT-FRAME
DEFINE VARIABLE GWL_STYLE AS INTEGER INITIAL -16 NO-UNDO.
DEFINE VARIABLE viWinHWND AS INTEGER INITIAL 0 NO-UNDO.
DEFINE VARIABLE vhWinHdl AS WIDGET-HANDLE NO-UNDO.
DEFINE VARIABLE togRezise AS LOGICAL INITIAL YES
LABEL "Resizable":U
VIEW-AS TOGGLE-BOX
SIZE 13.4 BY .81 NO-UNDO.
DEFINE FRAME DEFAULT-FRAME
togRezise AT ROW 2.43 COL 6
WITH 1 DOWN NO-BOX KEEP-TAB-ORDER OVERLAY
SIDE-LABELS NO-UNDERLINE THREE-D
AT COL 1 ROW 1
SIZE 33 BY 4.14.
IF SESSION:DISPLAY-TYPE = "GUI":U THEN
CREATE WINDOW vhWinHdl ASSIGN
HIDDEN = YES
TITLE = "Window Resizing":U
HEIGHT = 4.24
WIDTH = 36.2
MAX-HEIGHT = 16
MAX-WIDTH = 80
VIRTUAL-HEIGHT = 16
VIRTUAL-WIDTH = 80
RESIZE = YES
SCROLL-BARS = NO
STATUS-AREA = NO
BGCOLOR = ?
FGCOLOR = ?
KEEP-FRAME-Z-ORDER = YES
THREE-D = YES
MESSAGE-AREA = NO
SENSITIVE = YES.
ELSE
{&WINDOW-NAME} = CURRENT-WINDOW.
IF SESSION:DISPLAY-TYPE = "GUI":U AND
VALID-HANDLE(vhWinHdl) THEN
ASSIGN {&WINDOW-NAME}:HIDDEN = NO.
ON END-ERROR OF {&WINDOW-NAME}
OR ENDKEY OF {&WINDOW-NAME} ANYWHERE
DO:
IF THIS-PROCEDURE:PERSISTENT THEN
RETURN NO-APPLY.
END.
ON WINDOW-CLOSE OF {&WINDOW-NAME}
DO:
APPLY "CLOSE":U TO THIS-PROCEDURE.
RETURN NO-APPLY.
END.
ON VALUE-CHANGED OF togRezise IN FRAME {&FRAME-NAME}
DO:
/*
* viWinHWND is windows handle of the windows' parent
* Progress windows are just a child window of the
* real Windows window, which has the title bar and
* borders.
*
* viWinHWND should typically be set once at
* beginning of program.
*/
IF viWinHWND = 0 THEN
RUN GetParent({&WINDOW-NAME}:HWND,
OUTPUT viWinHWND).
/*
* The number 348848128 is what testing showed when displaying
* the style of a non-resizable window on a Windows 2000
* Professional system, and the number 349110272 is the
* style of a resizable window on the same system
*/
RUN SetWindowLongA(viWinHWND,
GWL_STYLE,
IF togRezise:SCREEN-VALUE = "NO":U THEN
348848128
ELSE
349110272).
END.
ASSIGN CURRENT-WINDOW = {&WINDOW-NAME}
THIS-PROCEDURE:CURRENT-WINDOW = {&WINDOW-NAME}.
ON CLOSE OF THIS-PROCEDURE
RUN disable_UI.
PAUSE 0 BEFORE-HIDE.
MAIN-BLOCK:
DO ON ERROR UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK
ON END-KEY UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK:
RUN enable_UI.
IF NOT THIS-PROCEDURE:PERSISTENT THEN
WAIT-FOR CLOSE OF THIS-PROCEDURE.
END.
PROCEDURE GetParent EXTERNAL "user32..dll":U:
DEFINE INPUT PARAMETER plHWND AS LONG NO-UNDO.
DEFINE RETURN PARAMETER plWinLong AS LONG NO-UNDO.
END PROCEDURE.
PROCEDURE GetWindowLongA EXTERNAL "user32.dll":U:
DEFINE INPUT PARAMETER plHWND AS LONG NO-UNDO.
DEFINE INPUT PARAMETER plNIndex AS LONG NO-UNDO.
DEFINE RETURN PARAMETER plOValue AS LONG NO-UNDO.
END PROCEDURE.
PROCEDURE SetWindowLongA EXTERNAL "user32.dll":U:
DEFINE INPUT PARAMETER plHWND AS LONG NO-UNDO.
DEFINE INPUT PARAMETER plNIndex AS LONG NO-UNDO.
DEFINE INPUT PARAMETER plDwNewLong AS LONG NO-UNDO.
END PROCEDURE.
PROCEDURE disable_UI :
IF SESSION:DISPLAY-TYPE = "GUI":U AND
VALID-HANDLE({&WINDOW-NAME}) THEN
DELETE WIDGET {&WINDOW-NAME}.
IF THIS-PROCEDURE:PERSISTENT THEN
DELETE PROCEDURE THIS-PROCEDURE.
END PROCEDURE.
PROCEDURE enable_UI :
DISPLAY togRezise
WITH FRAME DEFAULT-FRAME IN WINDOW {&WINDOW-NAME}.
ENABLE togRezise
WITH FRAME DEFAULT-FRAME IN WINDOW {&WINDOW-NAME}.
{&OPEN-BROWSERS-IN-QUERY-DEFAULT-FRAME}
VIEW {&WINDOW-NAME}.
END PROCEDURE.
.