Jak narvat toolbar do formuláře spuštěného jako "As Top Level"

Nejdříve trochu teorie.

Formuláře foxky jsou tak trochu zvláštností ve světě Woken.
Windows, to jsou samá okna (odtud tedy název neproklínanějšího OS).
Plocha je okna,Taskbar je okno,menu je další okno,tlacitka jsou okna ikony taky.
Cokoliv uvnitř okna, je pravděpodobně další okno. Ověřit se to dá pomocí utilit (Spy,Spy++) dodávaných s prog. jazyky C++,MS C++, Pascal, Delphi.

(Ze seriálu: Dupeme Foxce po krku)


Nejdříve trochu teorie.

Formuláře foxky jsou tak trochu zvláštností ve světě Woken.
Windows, to jsou samá okna (odtud tedy název neproklínanějšího OS).
Plocha je okna,Taskbar je okno,menu je další okno,tlacitka jsou okna ikony taky.
Cokoliv uvnitř okna, je pravděpodobně další okno. Ověřit se to dá pomocí utilit (Spy,Spy++) dodávaných s prog. jazyky C++,MS C++, Pascal, Delphi.

Až potud je to s VFP v pořádku, taky samá okna.
Ale u formulářů, které se zobrazují v hlavním okně VFP, to je zcela jinak.
Každý formulář je prezentován jedním oknem. Cokoliv co je uvnitř tohoto formuláře (objekty atd.) je VYKRESLOVÁNO (což je neuvěřitelně pomalé, přiznávaj to i maníci co dělaj Foxku).
Výjimku tvoří formuláře spustěného "As Top Level". Takový to formulář je již prezentován dvěma okny. To první to pěkně zapouzdřuje, v tom druhém se již vykreslují ovladací prvky (taky vám leze krkem termín "ovladače" ?). Je to tak uděláno z jednoho prostého důvodu - MENU, do takovévo formuláře lze potom přidat menu.

Takže tohoto uspořádání zneužijeme.
Vnitřní okno fomuláře posuneme dolů a zmenšíme mu výšku. Následně donutíme toolbar aby se zobrazil ve formuláři.

Budeme potřebovat knihovnu Foxtools.fll a čtyři API funkce.

DECLARE INTEGER MoveWindow IN USER32.DLL INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER
DECLARE INTEGER GetWindowRect IN USER32.DLL INTEGER , STRING @
DECLARE INTEGER SetParent IN USER32.DLL INTEGER , integer
DECLARE INTEGER GetWindow IN win32api Integer hwnd,Integer uCmd

Dále předpokládejme,že již máme spuštěný formulář a vytvořený toolbar a nalinkované na PUBLIC proměnné (XXTool - toolbar,XXF000 - formulář).

Nejdříve zjistíme handly těchto oken ve Windows.
pihxxtool=FindVFPWindow(XXTool)
pihXXF000=FindVFPWindow(XXF000)

Poté zjistíme handle vnitřního okna formuláře.
lihFRame=GetWindow(pihXXF000,5)

Donutíme toolbar, aby se přesunul do okna formuláře.
=SetParent(pihxxtool,pihXXF000)


Teď posuneme vnitřní okno ve formuláři a zmenšíme mu výšku.

lcRect=SPACE(16) && Nastav buffer pro strukturu
=GetWindowRect(lihFrame,@lcRect) && Ujisti umístění a velikost vnitřního okna
liLeft=CharToI(LEFT(lcRect,4)) && Převod na čísla - pozice zleva
liTop=CharToI(SUBS(lcRect,5,4)) && Převod na čísla - pozice zeshora
liWidth=CharToI(SUBS(lcRect,9,4))-liLeft
liHeight=CharToI(RIGHT(lcRect,4))-liTop
=MoveWindow(lihFrame,1,32,liWidth,liHeight-32,1) && Přesun vnitřní okno

A to je vše. Nesmíme zapomenout, že výše sedm uvedených řádku je vhodno přidat do události Resize() na formuláři.
Když se na to tak dívám, pak je jednodušší na ten form naházet buttony, nebo použít OCX, popřípadně nedělat SDI aplikace. Potřebné soubory najdete zde.