Avatar
jt.e
Člen
Avatar
jt.e:

Zdravím vás lidi, a prosím o radu:
nevím jak nastavit formulář tak, aby nebyl modální (form.Show()), ale přitom aby nešel překrýt hlavním oknem (Parentem), ale mohl být překryt jakýmkoliv dalším formulářem nebo aplikací.

Editováno 5. ledna 18:30
 
Odpovědět 5. ledna 18:29
Avatar
Odpovídá na jt.e
Petr Čech (czubehead):

Window na to má vlastnost topmost

Editováno 5. ledna 19:45
Nahoru Odpovědět 5. ledna 19:45
Why so serious? -Joker
Avatar
jt.e
Člen
Avatar
Odpovídá na Petr Čech (czubehead)
jt.e:

jenže jak jsem psal, potřebuji aby to šlo překrýt jiným oknem.

 
Nahoru Odpovědět 5. ledna 20:45
Avatar
jt.e
Člen
Avatar
jt.e:

myslím to tak, že když formulář zjistí, že je pod parentem, aby skočil nad něj. Ale nebude mu vadit, že je pod jiným formulářem.

Editováno 5. ledna 20:50
 
Nahoru Odpovědět 5. ledna 20:48
Avatar
Odpovídá na jt.e
Michal Štěpánek:

Pak musíš mít to hlavní okno jako MDI container a ostatní okna jako jeho child.

Nahoru Odpovědět 5. ledna 21:15
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
jt.e
Člen
Avatar
Odpovídá na Michal Štěpánek
jt.e:

jenže tohle mě taky nevyhovuje. Hodilo by se mi, abych mohl vytvořený formulář umístit i tak, že bude přesahovat přes hlavní formulář a bude přesto celý viditelný.

Možná, že by se to mělo řešit tak, že pokud bude má aplikace aktivní a zároveň bude i aktivní hlavní formulář, bude "nový form" TopMost=true, jinak se přepne na TopMost=false.

Ale jak na to?

Editováno 6. ledna 17:21
 
Nahoru Odpovědět 6. ledna 17:20
Avatar
jt.e
Člen
Avatar
jt.e:

Takhle jednoduché to je:

    public partial class Form1 : Form
    {
        Form2 SecondForm = null;

        public Form1()
        {
            InitializeComponent();
        }

        private void OpenSecondForm(object sender, EventArgs e)
        {
            if (SecondForm == null) SecondForm = new Form2();
                SecondForm.Show();
                SecondForm.TopMost = true;
        }

        private void Form1_Activated(object sender, EventArgs e)
        {
            if (SecondForm != null) SecondForm.TopMost = true;
        }

        private void Form1_Deactivate(object sender, EventArgs e)
        {
            if (SecondForm != null) SecondForm.TopMost = false;
        }
    }
}

ono často stojí za to si čas odpočinout. :)

Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět 6. ledna 17:40
Avatar
jt.e
Člen
Avatar
jt.e:

Jsem to musel trochu upravit, nechovalo se to tak jak jsem chtěl.
Teď už by to mělo být OK. :-)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WFA3
{
    public partial class Form1 : Form
    {
        Form2 SecondForm = null;

        public Form1()
        {
            InitializeComponent();

        }

        private void OpenSecondForm(object sender, EventArgs e)
        {
            try
            {
                if (SecondForm == null || SecondForm.IsDisposed) SecondForm = new Form2();
                SecondForm.Visible = true;
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void Form1_Activated(object sender, EventArgs e)
        {
            if (SecondForm != null && !SecondForm.IsDisposed) WinTools.SetFormAsTop(SecondForm.Handle, false);

        }

        private void Form1_Deactivate(object sender, EventArgs e)
        {
            if (SecondForm != null && !SecondForm.IsDisposed) SecondForm.TopMost = false;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Text = DateTime.Now.ToLongTimeString();
        }
    }



    public static class WinTools
    {
        [DllImport("User32.dll")]
        extern static IntPtr GetWindow(IntPtr h, Int32 t);

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool IsWindowVisible(IntPtr hWnd);

        [DllImport("user32.dll", SetLastError = true)]
        static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

        public static void SetFormAsTop(IntPtr formhandle, bool as_active)
        {

            IntPtr wnd = GetWindow(formhandle, 0);
            if (IsWindowVisible(formhandle))
            {
                if (wnd != formhandle)
                {
                    IntPtr pos = IntPtr.Zero - 1;
                    if (as_active)
                    {
                        SetWindowPos(formhandle, pos, 0, 0, 0, 0, 3);
                    }
                    else
                    {
                        SetWindowPos(formhandle, pos, 0, 0, 0, 0, 19);
                    }
                }
            }
        }
    }
}
 
Nahoru Odpovědět 6. ledna 19:34
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.