Unterfesnter erscheinen nach Vollbild zu Windows switch nicht mehr im Vordergrund
-
Also über das Menu meines Hauptfensters lassen sich Unterfenster aufrufen, welche auch über dem Hauptfenster gezeichnet werden. Wechsle ich jedoch ins Vollbild und anschließend zurück zu Windows. Rufe ich dann mein Unterfenster erneut auf wird dieses immer hinter der Anwendung gezeichnet. Ebenso beim Verschieben rutscht es immer unter das Hauptfenster. Nur ein Neustart der Anwendung schafft Abhilfe. Wie kann ich das Problem lösen?
-
Hast Du evetl. das "always on top" Flag (WS_EX_TOPMOST) nicht wieder gelöscht? Bist Du sicher, dass Du für Deine Dialoge auch das richtige Parent fenster angegeben hast?
-
Das "WS_EX_TOPMOST" flag hab ich nie gesetzt. Alle Fenster, ob Hauptfenster oder Unterfenster werden bei mir gleich gebaut. Meine Fenster sind Objekte von Klassen, welche die unten beschriebene Window Klasse erben. Die Window Klasse soll grundlegene Fenster Methoden beinhalten, wie anlegen, zeigen, verstecken.
void Window::init(const char *classname, const char *title, int width, int height, HBRUSH hbr, uint16 style)
{
WNDCLASS wc;
wc.lpszClassName = classname;
wc.hbrBackground = hbr;
wc.hInstance = GetModuleHandle(0);
wc.hCursor = LoadCursor(0, IDC_ARROW);
wc.hIcon = LoadIcon(GetModuleHandle(0), MAKEINTRESOURCE(101));
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = wndproc;// Wo werden Fenstermeldungen verarbeitet
wc.lpszMenuName = 0;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;RegisterClass(&wc);
hwnd = CreateWindowEx(0, classname, title, WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
100, 100, width, height, 0, 0, wc.hInstance, 0);cursor_visible = true;
win_state.width = width;
win_state.height = height;
win_state.visible = false;
win_state.center = style & s_center;
}void Window::show()
{
ShowWindow(hwnd, SW_SHOW);
SetFocus(hwnd);
win_state.visible = true;
}void Window::hide()
{
ShowWindow(hwnd, SW_HIDE);
win_state.visible = false;
}
-
Dann verstehe ich nicht wie Du Deinen Vollbild Modus hinbekommst!
Änderst Du das Parent eines Fensters mit SetParent?IMHO musst DU ein Parent Fenster angeben, damit Windows die korrekte Cascading Reihe hinbekommt.
Nur wenn ein Parent angegeben wird ist auch garantiert, dass ein Child vor dem Parent zu sehen ist.
-
Nein ich verwende Setparent nicht. Nur mein Hauptfenster kann in den Vollbild modus wechseln. Die Unterfenster werden, wenn ich sie im Vollbild aufrufe ebenfalls nicht angezeigt, zumindest nicht im Vollbild. Wechsle ich zu Windows, sind sie hinter dem Hauptfenster zu finden. Das was du schreibst ist hilfreich. Ich muss also mein Hauptfenster als parent festlegen und die Unterfenster als child um gewünschtes Verhalten zu erzielen? Vielleicht sind dann die Unterfenste auch im Vollbild sichtbar.
void Window::resize(int width, int height, bool fullscreen, bool menu_switch)
{
win_state.width = width;
win_state.height = height;int style = GetWindowLong(hwnd, GWL_STYLE); // Windows Style abfragen
if (fullscreen)
{
if (!win_state.fullscreen) //wechselt von windows zu fullscreen
{
style &= ~WS_CAPTION;
style &= ~WS_SYSMENU;
style &= ~WS_MINIMIZEBOX;
}
hide_menu();
}
else
{
if (win_state.fullscreen) //wechselt von fullscreen zu windows
{
style |= WS_CAPTION;
style |= WS_SYSMENU;
style |= WS_MINIMIZEBOX;
}
if(!menu_switch) show_menu();width += GetSystemMetrics(SM_CXFIXEDFRAME) << 1; //Breite rechter + linker Bildrahmen
height += GetSystemMetrics(SM_CYFIXEDFRAME) << 1; //Breite oberer + unterer Bildrahmen
height += GetSystemMetrics(SM_CYCAPTION); //Titelzeilenhöheif(GetMenu(hwnd)) height += GetSystemMetrics(SM_CYMENU); //MenuHoehe
}
SetWindowLong(hwnd, GWL_STYLE, style);if(!fullscreen) SetWindowPos(hwnd, 0, 0, 0, width, height, SWP_NOZORDER | SWP_NOMOVE);
else SetWindowPos(hwnd, 0, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), SWP_NOZORDER | SWP_HIDEWINDOW);if(!menu_switch) d_video.set_video_mode(win_state.width, win_state.height, fullscreen);
win_state.fullscreen = fullscreen;
if ((win_state.center) && (!fullscreen)) center();
}
-
ok Problem gelöst. Ich möchte gar kein window als parent und das aufgerufene als child festlegen. Das aufgerufene soll vom haupt window nur so weit abhängig sein, dass wenn das Hauptfenster zerstört wird auch alle Fenster, welche aus ihm aufgerufen wurden, ebenfalls zerstört werden.
ich erzwinge mit SetWindowPos(hwnd, HWND_TOPMOST ... das gewünschte Verhalten.
Somit erscheint das Unterfenster auch, wenn ich es aus dem Vollbild aufrufe.