PowerBuilder – Resizing a Response Window or User Object

Posted on Wednesday, May 23rd, 2012 at 5:16 pm in

Here is a technique you can use to resize a response window or userobject as needed. It makes use of the GetWindowLong and SetWindowLong Windows API methods. The oldest reference I found to this is from Eric Aling back in 2000. In a nutshell, you are changing the border around the object to one which Windows allows to be resized. What’s even nicer about this is the standard resize events are triggered so you can reposition/change objects within the window as well (PFC resize service for example). From Eric’s original post:

"The Get function retrieves the complete defenition of the window in 
a big long variable. All the bits in this long value describe the window. 
So there are bits for the type of border (which indicates if a window is 
resizable), menu, colors etc.etc. We can modify this long value, altering 
the design of the window. Using the SetWindowLong() we update the window with 
our specific modifications."

I used this in ancestor code of a userobject I use to create visible panels within the main window.

// Unicode declarations, used 'A' for ANSI
function long GetWindowLongW (long hWindow, integer nIndex) Library "user32.dll"
function long SetWindowLongW (long hWindow, integer nIndex, long dwNewLong) library "user32.dll"

// code in my post constructor event
n_cst_numerical lnv_num // PFC numeric service
long		ll_Styles
boolean		lb_Control

constant long	WS_THICKFRAME = 262144
constant long	WS_SYSMENU = 524288

ll_styles = GetWindowLongw(handle(THIS), -16)
if ll_styles <> 0 then

	ll_styles = lnv_num.of_BitWiseOr(ll_styles, WS_THICKFRAME)
// don't need control menu but leave this for reference 
//	if ab_Control then 
//		ll_styles = lnv_num.of_BitWiseOr(ll_styles, WS_SYSMENU)
//	end if

	SetWindowLongW(handle(THIS), -16, ll_styles)
end if

At first my UO cannot be resized.

Now it can!

I’ve seen other references to these API calls for manipulating windows for other things but I have not investigated further.

You might also be interested in

3 Comments

Add your comment

  1. DanCooperstock - June 17, 2012 at 7:56 pm

    I tried this on a response window itself (not a user object) but it removes the title bar of the window, so you can’t see the Title text or icon of the window. Any ideas for a solution?
    Thanks.

  2. DanCooperstock - June 18, 2012 at 8:23 am

    Solved it. I need to add in WS_CAPTION (12582912) to the styles to get the Title back on a title bar, and also WS_SYSMENU (524288) if I want the icon at the top left to re-appear (from which you can drop down the normal Windows system menu).

    • DanCooperstock - November 15, 2012 at 1:17 pm

      Whoops, should have posted this earlier – adding WS_SYSMENU doesn’t work. It adds back in the control menu, particularly the “X” at the top right, but it also makes the window no longer be resizable. (The cursor does change to a resize cursor at the window’s edges, but you can’t actually resize.)

      I have posted a question about fixing this in the new SAP PB forums at http://scn.sap.com/thread/3266956.

Leave a Reply

Top