Consultor Eletrônico



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