NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
jt.e
Člen
Avatar
jt.e:5.1.2016 18:29

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.1.2016 18:30
 
Odpovědět
5.1.2016 18:29
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na jt.e
Petr Čech:5.1.2016 19:45

Window na to má vlastnost topmost

Editováno 5.1.2016 19:45
Nahoru Odpovědět
5.1.2016 19:45
the cake is a lie
Avatar
jt.e
Člen
Avatar
Odpovídá na Petr Čech
jt.e:5.1.2016 20:45

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

 
Nahoru Odpovědět
5.1.2016 20:45
Avatar
jt.e
Člen
Avatar
jt.e:5.1.2016 20:48

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.1.2016 20:50
 
Nahoru Odpovědět
5.1.2016 20:48
Avatar
Odpovídá na jt.e
Michal Štěpánek:5.1.2016 21:15

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

Nahoru Odpovědět
5.1.2016 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:6.1.2016 17:20

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.1.2016 17:21
 
Nahoru Odpovědět
6.1.2016 17:20
Avatar
jt.e
Člen
Avatar
jt.e:6.1.2016 17:40

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.1.2016 17:40
Avatar
jt.e
Člen
Avatar
jt.e:6.1.2016 19:34

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.1.2016 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.