WIN32 API: Popup/Toolwindow im Vordergrund halten
lima-city → Forum → Programmiersprachen → Sonstige Programmiersprachen
bleiben
code
dialog
eigentliche zielstellung
fenster
flag
folgenden code
funktion
funktioniert danke
halten
holen
kleines problem
methode
null
problem
relevanten flags
setzen
signal
tag
vordergrund
-
Hallo alle miteinander,
ich habe ein tag/kleines problem">kleines Problem damit ein Popup- bzw. Toolboxfenster im Vordergrund zu halten.
Zuerst einmal ein bisschen Beispielcode, der die eigentliche Zielstellung illustriert:
#include "application.h" #include "frame.h" static Frame frm_main; static Frame frm_toolbox; static void frm_main_on_close(Signal sig) { Application_Quit(0); } void Application_OnInit(int argc, char ** argv) { frm_main = Frame_Create(); Frame_SetTitle(frm_main, "Hello Popup!"); Frame_SetSize(frm_main, 640, 320); frm_toolbox = Frame_Create(); Frame_SetTitle(frm_toolbox, "Nice to meet you."); Frame_SetSize(frm_toolbox, 128, 128); Frame_SetStyle(frm_toolbox, FRM_STY_TOOLBOX); SignalDispatcher_Connect(frm_main, SIG_CLOSE, NULL, frm_main_on_close); Frame_Show(frm_main); Frame_SHow(frm_toolbox); }
Dieser Code erzeugt ein Hauptfenster und ein Toolbox-Fenster.
Die Funktion Frame_Create() erzeugt standardmäßig ein Fenster mit WS_OVERLAPPEDWINDOW Style.
Die Funktion Frame_SetStyle() dient dazu, das Fenster gemäß einem vorgegebenen Template einzustellen.
In diesem Fall soll es eine Toolbox sein, d.h. ein Fenster fester Größe mit kleiner Titelleiste und einer 'Schließen'-Schaltfläche, welches immer im Vordergrund bleibt.
Die wesentlichen Codeteile der Frame_SetStyle()-Methode sind die Folgenden:
LONG_PTR ws, ws_ex; /* aktuelle Styles der Fensters holen */ ws = GetWindowLongPtr(hwnd, GWL_STYLE); ws_ex = GetWindowLongPtr(hwnd, GWL_EXSTYLE); /* alle relevanten Flags löschen */ ws &= ~(WS_BORDER|WS_CAPTION|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_POPUP|WS_SYSMENU|WS_THICKFRAME); ws_ex &= ~(WS_EX_TOOLWINDOW|WS_EX_TOPMOST); /* ... */ /* setze Styleflags für Toolbox: */ ws |= WS_BORDER|WS_POPUP|WS_SYSMENU; ws_ex |= WS_EX_TOOLWINDOW|WS_EX_TOPMOST; /* ... */ SetWindowLongPtr(hwnd, GWL_STYLE, ws); SetWindowLongPtr(hwnd, GWL_EXSTYLE, ws_ex); SetWindowPos(hwnd, NULL, 0,0,0,0, SWP_FRAMECHANGED|SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER);
Das Problem ist jetzt, dass sich das Fenster (frm_toolbox) einfach nicht dazu überreden lässt im Vordergrund zu bleiben.
Die Styles werden erfolgreich angewendet (Rahmen, Titelleiste usw. sind korrekt).
Ich habe auch schon mit WS_CHILD herumgespielt und einen Parent gesetzt.
Aber das hat alles nichts geholfen.
Weis jemand, welche Flags ich setzen muss, damit das funktioniert?
Danke im Voraus.
Edit:
Ich habe heute den ganzen Tag daran herumgetüftelt und festgestellt, dass es wohl nicht geht nachträglich aus einem Top-Level-Window einen (modalen) Dialog/Toolbox/Popup zu machen. Das Problem lässt sich nur dann beheben, wenn bei CreateWindowEx() ein Parent gesetzt wird. Ein nachträgliches SetParent() führt nicht zum selben Ergebnis (auch wenn sonst alle Flags des Fensters gleich sind).
Daher habe ich mir noch zwei Konstruktoren gebaut (Frame_CreateDialog(const Frame parent) und Frame_CreateModal(const Frame parent)) damit geht es dann.
Von daher (zumindest soweit es mich betrifft): closed
Beitrag zuletzt geändert: 10.2.2011 19:45:27 von darkpandemic -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage