2013-03-11 11 views
5

szukałem podstępu, aby uzyskać nazwę postaci, gdy mysz jest na niej umieszczona. załóżmy, że mam jedną formę mdi i wiele formularzy sdi takich jak form1, form2, form3 i wszystkie formularze sdi są otwarte. przypuśćmy, że mam jeden timer uruchomiony na formularzu 1, który będzie działał okresowo. Chcę wyświetlić nazwę formularza na etykiecie form1 z zdarzenia znacznika czasu, gdy mysz znajduje się w dowolnym oknie formularza SDI.Jak wykryć nazwę formularza, gdy mysz znajduje się na dowolnym formularzu SDI

w ten sposób próbuję to zrobić. tutaj jest kod

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); 

powyższy kod działa idealnie, ale jest jakaś usterka. kiedy umieszczam mysz na formularzu MDI lub na formularzu Form1, wtedy nazwa formularza jest wyświetlana na formularzu1, ale kiedy umieszczę mysz na formularzu 2 lub formularzu 2, ich nazwa nie jest wyświetlana. nie jestem w stanie zrozumieć, jaki jest problem w tym kodzie. poprowadź mnie, aby to naprawić.

+1

Co masz na myśli przez „Mysz jest na nim?” Czy chodzi ci o zawisanie nad nim, niekoniecznie aktywowanie formy, czy też forma jest aktywną formą wśród dzieci, tj. Tą, która się skupia? –

+0

Zmieniłem twój tytuł. Zobacz, "[Czy w tytułach pytania powinny znaleźć się" znaczniki "?] (Http://meta.stackexchange.com/questions/19190/)", gdzie konsensus brzmi "nie, nie powinien". –

Odpowiedz

1

Ponieważ masz kontrolę, myślę, że po prostu trzeba użyć FindForm() funkcję:

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

co robi FindForm()? – Thomas

+0

@Thomas Zwróci instancję formularza dla elementu nadrzędnego formantu. Zobacz [Metoda Control.FindForm] (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.findform.aspx). Brzmiało to jak próbujesz zrobić ze swoim kodem. Nie jest jasne, czy chcesz "nazwę" formularza, czy "tekst" (tytuł) formularza. W tytule zamień 'form.Name' na' form.Text'. – LarsTech

0

Powód, dla którego nazwa Form2 nie jest wyświetlana, to fakt, że utworzona przez Ciebie instancja Form2 nie ma nazwy. W celu wykazania tego, przyjrzeć się poniższym bloku kodu, położony w pliku 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); 

Jeśli dodać breakpoint, widać, że nazwa Form2 jest pusty. Ale czekaj, jest więcej!

Jeśli dodasz formant, dowolną formant, do formularza 2, to będzie mieć nazwę podczas tworzenia. Wygląda na to, że system nazewnictwa nie musi przypisywać formantowi formularza nazwy, dopóki nie pojawi się wiele elementów sterujących, które wykonuje podczas wywołania InitializeComponent. Możesz rzucić okiem na ten kod. Oto kod generowany dla „Form3” bez kontroli:

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

I tu jest ta sama forma po etykieta została dodana:

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(); 

} 

Jak widać, nazwa jest przypisany tylko do formularza, jeśli obecne są inne kontrole. Jeśli tak, to prawdopodobnie będziesz musiał poprosić osobę, która napisała kod automatycznej generacji, o tę odpowiedź.

Powiązane problemy