Entwickler-Ecke

Windows API - grauen Rahmen begrenzen - Fenstergröße


Tobi482 - So 03.08.08 11:26
Titel: grauen Rahmen begrenzen - Fenstergröße
Hi Leute,

ich habe einen kleinen schönheitsmakel in meinem programm gefunden und weiß nicht recht wie man ihn behebt. auf meiner form sind mehrere controls angeordnet, die sich beim "resizen" der form dynamische positionieren. ihre lage zueinander ist jedoch nur bis zu einem gewissen grad realisierbar (sonst wird alles funzelig klein). deshalb habe ich die größe meiner form begrenzt (constraints).

vergrößert oder verkleinert man ein fenster durch ziehen mit der maus, so ensteht ein grauer rahmen, der die neue größe angibt. ich erinner mich an programme, die in der lage waren diesen rahmen zu begrenzen.

wie geht das?

in meinem fall kann ich den rahmen viel zuklein wählen und mein fenster springt, aber wieder auf meine limitierung zurück. also im prinzip geht alles außer, dass dieser graue rahmen potentiell kleiner gezogen werden kann als erlaubt.

wie behebe ich diesen kleinen schönheitsfehler?

Mit freundlichen Grüßen
Tobi


Blawen - So 03.08.08 15:22
Titel: Re: grauen Rahmen begrenzen - Fenstergröße
So richtig verstanden habe ich Dein Problem nicht wirklich.

Daher mal ne "dumme" Frage:
Du willst anscheinend, dass die Grösse Deiner Form nicht verändert werden kann.
Wieso nimmst Du beim BorderStyle nicht einach (z.B) bsDialog?


Tobi482 - Do 07.08.08 13:23

hi danke für deine Antrowrt, also ich probiere es nochmal^^

ich habe eine form auf der sind controls angeordnet. diese controls müssen imemr in bestimmen relationen zueinander stehen (leiste links muss immer 20% der fenster breite sein etc). diese relationen werden nach jedem resize im onresize event neu besetzt.

soweit sogut

es ist jedoch nicht möglich diese reltionen bis ins kleinste aufrecht zu halten. irgendwann würden die controls sehr sehr klein werden und die funktionalität wäre nicht mehr gewährleistet, da einige control fast verschwinden (zu kline werden). daher habe ich eine mindestgröße für mein fenster festgelegt.
diese mindestgröße habe ich durch constraints festgelegt.

die limiterung klappt! ich kann das fenster nicht mehr kleiner machen als erwünscht.

nun zu meinem problem. es handlet sich hierbei um einen schönheitsfehler der an sich keine auswirkungen hat, mich aber trotzdem stört.

klickt man auf den fensterrahmen und hält die maustaste gedrückt, so friert windows das fenster ein und einer grauer semitransparenter rahmen wird sichtbar. solange man die maus nicht loslässt, ist man in der lage diesen rahmen zu verändern. er ist ein repäsentant der neuen zukünftigen fenstergröße.

trotz der limitierung der constraints ist man in der lage diesen grauen rahmen kleiner zu machen als man ihn machen drüfte. lässt man den rahmen in einem zukleinen zustand los, so treten die constraints in kraft und stelle die mindestgröße wieder her. ich kann mich aber auch an programme erinnern(gerade kein beispiel) bei denen dieser graue rahmen beschränkt wurde.

Frage: wie beschränke ich diesen grauen rahmen?

Gruß
Tobi


Tobi482 - Fr 08.08.08 14:36

da mir bisher keiner helfen konnte und mich dieser schönheitsfehler wirklich wurmt, hab ich die entsprechende stelle in einem geeigneten Programm reverse't.

Durch etwas Backtracing ergab die Analyse folgenden Resultate


Delphi-Quelltext
1:
procedure OnMessage_GETMINMAXINFO(var Msg:TWMGETMINMAXINFO); message WM_GETMINMAXINFO;                    


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm.OnMessage_GETMINMAXINFO(var Msg:TWMGetMinMaxInfo);
function cp(x,y:Integer):TPoint;
begin
     Result.X := x;
     result.Y := y;
end;
begin
     Msg.MinMaxInfo^.ptMinTrackSize := cp(100100);
     Msg.MinMaxInfo^.ptMaxTrackSize := cp(640480);

     inherited;
end;


Habe trotz Hilfe der MSDN keine auswirkungen der anderen Parameter finden können.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
typedef struct {
    POINT ptReserved;
    POINT ptMaxSize;
    POINT ptMaxPosition;
    POINT ptMinTrackSize;
    POINT ptMaxTrackSize;
}
 MINMAXINFO;

Members
ptReserved
     Reserved; do not use.

ptMaxSize
     Specifies the maximized width (POINT.x) and the maximized height (POINT.y) of
     the window. For top-level windows, this value is based on the width of the
     primary monitor.

ptMaxPosition

     Specifies the position of the left side of the maximized window (POINT.x) and
     the position of the top of the maximized window (POINT.y). For top-level windows,
     this value is based on the position of the primary monitor.

ptMinTrackSize
     Specifies the minimum tracking width (POINT.x) and the minimum tracking height
     (POINT.y) of the window. This value can be obtained programmatically from the
     system metrics SM_CXMINTRACK and SM_CYMINTRACK.

ptMaxTrackSize
     Specifies the maximum tracking width (POINT.x) and the maximum tracking height
     (POINT.y) of the window. This value is based on the size of the virtual screen
     and can be obtained programmatically from the system metrics SM_CXMAXTRACK and
     SM_CYMAXTRACK.


Mit freundlichen Grüßen
Tobi