2013-03-11 12 views
5

cercavo un trucco per ottenere il nome del modulo quando il mouse è posizionato su di esso. supponiamo di avere una forma mdi e molti moduli sdi come form1, form2, form3 e tutti i moduli sdi vengono aperti. supponiamo di avere un timer in esecuzione su form1 e che verrà eseguito periodicamente. Voglio mostrare il nome del modulo sull'etichetta di form1 dall'evento tick del timer quando il mouse è posizionato su qualsiasi finestra del modulo SDI.Come rilevare il nome del modulo quando il mouse è posizionato su qualsiasi modulo SDI

in questo modo provo a farlo. ecco il codice

private void timer1_Tick(object sender, EventArgs e) { 
    var handle = WindowFromPoint(Cursor.Position); 
    if (handle != IntPtr.Zero) { 
     var ctl = Control.FromHandle(handle); 
     if (ctl != null) { 
      label1.Text = ctl.Name; 
      return; 
     } 
    } 
    label1.Text = "None"; 
} 

[System.Runtime.InteropServices.DllImport("user32.dll")] 
private static extern IntPtr WindowFromPoint(Point pos); 

il codice sopra riportato funziona perfettamente ma c'è qualche problema tecnico. quando metto il mouse su un modulo MDI o su Form1, il nome del modulo viene visualizzato su form1 ma quando si posiziona il mouse su Form2 o Form2, il loro nome non viene visualizzato. non riesco a capire qual è il problema in questo codice. per favore guidami a ripararlo

+1

Che cosa si intende per "mouse su di esso"? Vuoi dire sorvolare su di esso, senza necessariamente attivare la forma, o che la forma è la forma attiva tra i bambini, cioè quella che si concentra? –

+0

Ho modificato il tuo titolo. Per favore vedi, "[Le domande dovrebbero includere" tag "nei loro titoli?] (Http://meta.stackexchange.com/questions/19190/)", dove il consenso è "no, non dovrebbero". –

risposta

1

Dal momento che hai il controllo, penso che è sufficiente utilizzare la funzione FindForm():

var ctl = Control.FromHandle(handle); 
if (ctl != null) { 
    var form = ctrl.FindForm(); 
    if (form != null) { 
    label1.Text = form.Name; 
    } 
} 
+0

cosa trova FindForm() ?? – Thomas

+0

@Thomas Restituirà l'istanza del modulo per il genitore del controllo. Vedere [Metodo Control.FindForm] (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.findform.aspx). Sembrava quello che stai cercando di fare con il tuo codice. Non è chiaro se si desidera il "nome" del modulo o il "testo" (titolo) del modulo. Per il titolo, sostituisci 'form.Name' con' form.Text'. – LarsTech

0

La ragione per cui il nome di Form2 non viene visualizzato è che l'istanza di Form2 che si è creato non ha un nome. Per dimostrare questo, date un'occhiata al seguente blocco di codice, situato in un file Program.cs:

MDIParent mdi = new MDIParent(); 
Form1 frm1 = new Form1(); 
frm1.MdiParent = mdi; 
Form2 frm2 = new Form2(); 
frm2.MdiParent = mdi; 
frm1.Show(); 
frm2.Show(); 
Application.Run(mdi); 

Se si aggiunge un punto di interruzione, si vedrà che il nome di Form2 è vuoto. Ma aspetta, c'è di più!

Se si aggiunge un controllo, qualsiasi controllo, a Modulo 2, lo avrà un nome al momento della sua creazione. Sembra che il sistema di denominazione non senta la necessità di assegnare un nome al controllo del modulo finché non sono presenti più controlli, cosa che fa durante la sua chiamata InitializeComponent. Puoi dare un'occhiata a questo codice. Ecco il codice generato per "Form3" senza controlli:

private void InitializeComponent() 
{ 
    this.components = new System.ComponentModel.Container(); 
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
    this.Text = "Form3"; 
} 

E qui è la stessa forma dopo un'etichetta è stata aggiunta:

private void InitializeComponent() 
{ 
    this.label1 = new System.Windows.Forms.Label(); 
    this.SuspendLayout(); 
    // 
    // label1 
    // 
    this.label1.AutoSize = true; 
    this.label1.Location = new System.Drawing.Point(13, 13); 
    this.label1.Name = "label1"; 
    this.label1.Size = new System.Drawing.Size(35, 13); 
    this.label1.TabIndex = 0; 
    this.label1.Text = "label1"; 
    // 
    // Form3 
    // 
    this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
    this.ClientSize = new System.Drawing.Size(284, 262); 
    this.Controls.Add(this.label1); 
    this.Name = "Form3"; 
    this.Text = "Form3"; 
    this.ResumeLayout(false); 
    this.PerformLayout(); 

} 

Come si può vedere, un nome viene assegnato solo al modulo se sono presenti altri controlli. Per quanto riguarda il motivo per cui questo è il caso, probabilmente dovresti chiedere alla persona che ha scritto il codice di generazione automatica per quella risposta.

Problemi correlati