Solved

large controls and SetWindowPos

Posted on 2004-08-17
11
1,247 Views
Last Modified: 2012-06-27
Hi,

I want to use same comtrols (Drawgrids) of very large size, more than 32k pixels high.

It is possible to assign (for instance)

var agrid:Tdrawgrid;

// in Formcreate of the mainform
begin
 // create of agrid etc.

 agrid.height:=48000;
 agrid.width:=120;
end;

This will displayed correctly.

If you change the size of such large grid if the form is visible, say

 agrid.width:=agrid.width+20;

than agrid.height is implicit also changed an set to 32767.

I determine, that this happens while the program calls SetWindowPos.

(SetWindowPos is the API-function from user32.dll.)

Nevertheless setwindowpos has integer - parameters (32-bit integer), it cuts the values to the maximum of 32767?

Is there any possibility to avoid this?

Any hint will be welcome!

nmm

p.s. I use win2000 SP4 and Delphi 6 (U2), but its the same under win2000 SP3.


0
Comment
Question by:nmm
  • 4
  • 3
  • 2
  • +1
11 Comments
 
LVL 3

Assisted Solution

by:Tyrsis
Tyrsis earned 200 total points
Comment Utility
Hello.  When a window is resized, it sends a WM_SIZE message.  Unfortunately the width and height parameters are set using only 16bit integers.  So you are limited to a size of 32K.  From MSDN Site: (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowmessages/wm_size.asp)

Remarks

If the SetScrollPos or MoveWindow function is called for a child window as a result of the WM_SIZE message, the bRedraw parameter should be nonzero to cause the window to be repainted.
Although the width and height of a window are 32-bit values, the nWidth and nHeight parameters of the WM_SIZE message contain only the low-order 16 bits.

0
 
LVL 33

Accepted Solution

by:
Slick812 earned 200 total points
Comment Utility
hello  nmm, I'm not sure where you get your values from for integer max value, according to several sources (the folowing is from Delphi Help)

Integer    –2147483648..2147483647           signed 32-bit

and in the WM_SIZE message it is limited to a Word value. . .

Word     0..65535      unsigned 16-bit

so in the   SetWindowPos( ) function you can go up to  2147483647 for the height

however your line

agrid.height:=48000;

seems like a unusable size for a window, I would think that you should be able to use some window height that is smaller than the Screen Height, especially since the Draw grid can have scroll bars. . . are you certian that you must have a  48000 window height?
0
 

Author Comment

by:nmm
Comment Utility
Hi Tyrsis,

I will try to handle wm_size myself, may be this will work...
unfortunately the URL dosen't work, eaven

http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowmessages/wm_size.asp

dont work, netherthless this adress is displayed by microsoft, if one search MSDN.

Regards
nmm

ps to Slick812: yes I really need that unusual window size.
0
 
LVL 33

Expert Comment

by:Slick812
Comment Utility
???, I'm not sure what your last comment is about at all? ?
I guess you want information about what is on the MSDN web page?

here is what it says - - - - - ->



WM_SIZE Notification

The WM_SIZE message is sent to a window after its size has changed.

A window receives this message through its WindowProc function.

Syntax

WM_SIZE

    WPARAM  wParam
    LPARAM  lParam;
   

Parameters

wParam - Specifies the type of resizing requested. This parameter can be one of the following values.

    SIZE_MAXHIDE - Message is sent to all pop-up windows when some other window is maximized.
    SIZE_MAXIMIZED - The window has been maximized.
    SIZE_MAXSHOW -  Message is sent to all pop-up windows when some other window has been restored to its former size.
    SIZE_MINIMIZED - The window has been minimized.
    SIZE_RESTORED - The window has been resized, but neither the SIZE_MINIMIZED nor SIZE_MAXIMIZED value applies.

lParam - The low-order word of lParam specifies the new width of the client area.

    The high-order word of lParam specifies the new height of the client area.

Return Value  - If an application processes this message, it should return zero.

Remarks

If the SetScrollPos or MoveWindow function is called for a child window as a result of the WM_SIZE message,
 the bRedraw or bRepaint parameter should be nonzero to cause the window to be repainted.

Although the width and height of a window are 32-bit values, the lParam parameter contains only the low-order 16 bits of each.

Notification Requirements  -
  Minimum DLL Version None
  Header Declared in Winuser.h, include Windows.h
  Minimum operating systems Windows 95, Windows NT 3.1
0
 
LVL 33

Expert Comment

by:Slick812
Comment Utility
I do not think that the system accually uses this  WM_SIZE message, this is Sent  AFTER the window has be sized, to  tell a coder that the window has ben resized so you can do code to move or resize child windows. . . I do not think that you will need to handle this message,  just let it pass to system (the usual default)


you might just reset the grid height  AFTER you set the grid width -

agrid.width:=agrid.width+20;
agrid.height:=48000;


But I would be in search of a way to use normal window heights (I.E  less than screen height)
0
What Should I Do With This Threat Intelligence?

Are you wondering if you actually need threat intelligence? The answer is yes. We explain the basics for creating useful threat intelligence.

 

Author Comment

by:nmm
Comment Utility
Hi Slick812,
thanks you for your comments. I try something and now it seems, that the large height is
cut by the Api-function  GetWindowRec.

Handle of wm_size will not do, I cheked it.

I tryed something like

var  saveheight:ingeger;
...
                saveheight:=agrid.height;
                agrid.width:=agrid.width+20;
                agrid.height:=saveheight;

but it doesn't work.

If you assign that large values *before* the window is visible, than it becomes so large I want, and the visible window
than is really 48000 heigh: I had a look at the windows height from "extern" using windowse.exe
(http://www.greatis.com/windowse.htm), and it shows 48000!

GetWindowRect is called by every assignment
height:=something  or width:=something
and GetWindowRect returns the rect-coordinates in a 16-integer-manner.

I try under WinXP Porf. SP1: the same "cut off" happens.

By calling SetWindowPos several WM_ messages are send (and can be handled from the calling programm.
But if you call GetWindowRect no message will posted.
I'am afraid, that one can overcome this only, if one changes the borland-Code of controls.pas
(eliminate all calls of GetWindowRect.).



Regards
nmm


0
 
LVL 33

Expert Comment

by:Slick812
Comment Utility
????
I do not have time now to search through the delphi source code for a limiting factor for your size, I think you may be correct to say that in the source code that there may be some delphi code that will cut off the height of your window, probally with a good reason . .

BUT

I do not know where you get your infomation from, but the  GetWindowRect(  )  function is NOT linited to  "16-integer-manner" it gets a C-Code  RECT structure (a delphi TRect) which has four 32-bit Integers in it. . . There must be a way to not use such gigantic window sizes, the purpose of a "Window" is for Graphacal optical display to the user (so he can see something), and the user CAN NOT SEE anything larger than the Monitor screen, so any thing larger than screen size would seem to be a bad idea, since if you can not see it why have it?


But if you are determined to get around the delphi Height restriction, then stop using the object "Width" and "Height"

do NOT use

               agrid.width:=agrid.width+20;
                agrid.height:=4800;

use the API functions instead

MoveWindow(agrid.Handle, 44, 157, 357, 48000,True);

or maybe SetWindowPos mat do better

SetWindowPos(agrid.Handle,0, 0, 0, 357, 48000,
                  SWP_NOMOVE or SWP_NOZORDER);

but remember, the Width and height will NO LONGER  have the correct width and height in them if you need to know the true width and height you will call the GetWindowRect function

var
aRect: TRect;

GetWindowRect(agrid.Handle, aRect);
0
 
LVL 3

Expert Comment

by:Tyrsis
Comment Utility
I'm pretty certain as I said above that when a window (any window that isn't virtual and is visible) gets sent a WM_SIZE message to size it.  Those API functions you're calling are just doing a SendMessage(hWnd, WM_SIZE, ...) to the window in order to size it.  

But anyhow, I think what Slick is trying to say is that, by definition, you really shouldn't be creating a control that is so large.  You should only be creating controls that are at most the size of the screen.

If you trace back through the Delphi code you can probably find out why it's limiting your height and width, and it will be next to impossible to fix without creating a window from scratch.  You can try sizing with the win32 api functions listed above, but I have my doubts.  Though hopefully it works for you.

Tyrsis
0
 
LVL 3

Expert Comment

by:gandalf_the_white
Comment Utility
just tell us why your drawgrid has to be so big
and maybe we find a way to solve the problem so that the window stays below 32k in height
0
 

Author Comment

by:nmm
Comment Utility
although none of the above comments give an satisfactory answer, I decide to split the points, because it seems, that Windows isnt able to hable such large controls right. It actually can handle it, bat there are inconsistecies, that are not due to Delphi but Windows-code itself. So there might be up to now no way to use large controls...
0

Featured Post

How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline

Join & Write a Comment

Suggested Solutions

This article explains how to create forms/units independent of other forms/units object names in a delphi project. Have you ever created a form for user input in a Delphi project and then had the need to have that same form in a other Delphi proj…
Objective: - This article will help user in how to convert their numeric value become words. How to use 1. You can copy this code in your Unit as function 2. than you can perform your function by type this code The Code   (CODE) The Im…
Sending a Secure fax is easy with eFax Corporate (http://www.enterprise.efax.com). First, Just open a new email message.  In the To field, type your recipient's fax number @efaxsend.com. You can even send a secure international fax — just include t…
In this seventh video of the Xpdf series, we discuss and demonstrate the PDFfonts utility, which lists all the fonts used in a PDF file. It does this via a command line interface, making it suitable for use in programs, scripts, batch files — any pl…

763 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

10 Experts available now in Live!

Get 1:1 Help Now