Avatar billede spyrodrag Nybegynder
21. februar 2006 - 12:41 Der er 3 kommentarer og
1 løsning

Captionbar click event

Hej eksperter!

Hvordan fanger jeg eventet når brugeren klikker oppe i captionbar? Jeg har søgt lidt rundt på nettet, og fundet følgende VB kode, som skulle kunne løse mit problem. Jeg har dog ikke haft held med at få koden til at virke i CSharp.

VB kode: http://www.andreavb.com/forum/viewtopic.php?TopicID=2930

Mit forsøg (om fejler):
---------------------
public const int GWL_WNDPROC = -4;
public const int WM_NCLBUTTONDOWN = 161; //&HA1;
private const int HTCAPTION = 0x0002;
private const int WS_SYSMENU = 0x80000;

[DllImport("user32", EntryPoint="SetWindowLong")]
public static extern int SetWindowLongA(int hwnd, int nIndex, int dwNewLong);

[DllImport("user32", EntryPoint="CallWindowProc")]
private static extern int CallWindowProcA(int lpPrevWndFunc, int hwnd, int MSG, int wParam, int lParam);

[DllImport("user32")]
private static extern int ReleaseCapture();

public int prevProc;

private long WinProc(int hwnd, int uMsg, int wParam, int lParam)
{
  int returnValue = CallWindowProcA(prevProc, hwnd, uMsg, wParam, lParam);

  if ((uMsg == WM_NCLBUTTONDOWN) && (wParam == HTCAPTION))
    Trace.WriteLine("Captionbar clicked!");

  return returnValue;
}

private void Form1_Load(...)
{
  prevProc = SetWindowLongA(this.Handle.ToInt32(), GWL_WNDPROC, WS_SYSMENU);
}

private void Form1_FormClosing(...)
{
  SetWindowLongA(this.Handle.ToInt32(), GWL_WNDPROC, prevProc);
}
---------------------

En anden accepteret løsning er også hvis man på en eller anden måde kan sikre sig at man kan holde én form over en anden. Hele tiden.
Følgende virker ikke korrekt:

---------------------
Form1_Activated(...)
{
  if (!form2.TopMost)
    form2.TopMost = true;
}
Form1_Deactivate(...)
{
  if (form2.TopMost)
    form2.TopMost = false;
}
---------------------

Venlig hilsen,
Martin.
Avatar billede dr_chaos Nybegynder
21. februar 2006 - 14:47 #1
jeg kan ikke hjælpe dig med det første men er er kode som gør det umuligt at fokusere på den underliggende form før den overliggende er lukket eller noget i den stil:
simpel klasse:
public Menu : Form
{
public Menu()
        {
            InitializeComponent();

        }
private void InitializeComponent()
{
Form Classform = new Classform(this);
                        Classform.Show();
}
}

klasse 2

public class Classform : System.Windows.Forms.Form
    {
private Menu Menus;

}

public Classform(Form owner)
        {
            this.Owner = owner;
            InitializeComponent();
            Menus = (Menu)this.Owner;
        }
jeg kan ikke hjælpe dig med det første men er er kode som gør det umuligt at fokusere på den underliggende form før den overliggende er lukket eller noget i den stil:
simpel klasse:
public Menu : Form
{
public Menu()
        {
            InitializeComponent();

        }
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Functionsform_Load);
}
private void Functionsform_Load(object sender, System.EventArgs e)
        {

            //disable owner form så brugeren ikke kan bruge den
            this.Owner.Enabled = false;
        }
protected override void Dispose( bool disposing )
        {
            //enable owner form
            this.Owner.Enabled = true;
            if( disposing )
            {
                if(components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }
}
Avatar billede dr_chaos Nybegynder
21. februar 2006 - 14:49 #2
lol rydder lige lidt op dumme copypast:

public Menu()
        {
            InitializeComponent();

        }
private void InitializeComponent()
{
Form Classform = new Classform(this);
                        Classform.Show();
}
}

klasse 2

public class Classform : System.Windows.Forms.Form
    {
private Menu Menus;

}

public Classform(Form owner)
        {
            this.Owner = owner;
            InitializeComponent();
            Menus = (Menu)this.Owner;
        }
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Functionsform_Load);
}
private void Functionsform_Load(object sender, System.EventArgs e)
        {

            //disable owner form så brugeren ikke kan bruge den
            this.Owner.Enabled = false;
        }
protected override void Dispose( bool disposing )
        {
            //enable owner form
            this.Owner.Enabled = true;
            if( disposing )
            {
                if(components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }
}
Avatar billede spyrodrag Nybegynder
21. februar 2006 - 15:12 #3
Hej.

Det var pokkers! Tusind tak!
this.Owner = owner; Denne linie redede lige fejlen. Giv et svar, så får du alle points.

Venlig hilsen,
Martin.
Avatar billede dr_chaos Nybegynder
21. februar 2006 - 15:19 #4
svar :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester