2011-08-04 27 views
7

Używam Windows Forms w języku C#.Aktywuj przycisk formularza i przycisku procesu w tym samym czasie?

Mam główny formularz z kilkoma paskami narzędzi, które zawierają toolStripButtons. Po pracy z innym formularzem, który zawiera dane, główny formularz traci ostrość, a kliknięcie narzędzia ToolStripButton nie wyzwala zdarzenia OnClick: pierwsze kliknięcie aktywuje główny formularz, a tylko drugie kliknięcie powoduje naciśnięcie przycisku. Potrzebuję, aby użytkownik kliknął przycisk tylko raz, aby wywołać zdarzenie Click, wszelkie pomysły, jak to zrobić? Dzięki.

Uwagi:

  • używałem MDI i nie było żadnych problemów klikający przyciski tworzą dominującej. Ale teraz najważniejsze jest, aby formularze swobodnie unoszą się na wielu wyświetlaczach.
  • Formularze pracownicze mają formę główną jako właściwość Właściciel, w ten sposób pozostają na głównym formularzu.
  • Po kliknięciu przycisku nieaktywnej formy nie uruchamia się żaden obiekt MouseHover, MouseEnter, MouseDown ani MouseUp. Jest to tylko aktywowane zdarzenie Activate, które uruchamia się.
  • Istnieje drzewoView (wewnątrz tabControl, wewnątrz splitContainer, wewnątrz panelu), w głównym formularzu. Jego elementy są wybierane po pierwszym kliknięciu myszą, nawet jeśli główna forma jest nieaktywna. Chyba nie wszystkie kontrole są równe!

Odpowiedz

6

Co musisz zrobić, to stworzyć klasę, która dziedziczy ToolStrip i obsługuje WndProc. Jest to jeden sposób na zrobienie tego. Są inni.

private class MyToolStrip : ToolStrip 
{ 
    private const uint WM_LBUTTONDOWN = 0x201; 
    private const uint WM_LBUTTONUP = 0x202; 

    private static bool down = false; 

    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == WM_LBUTTONUP && !down) 
     { 
      m.Msg = (int)WM_LBUTTONDOWN; 
      base.WndProc(ref m); 
      m.Msg = (int)WM_LBUTTONUP; 
     } 

     if (m.Msg == WM_LBUTTONDOWN) down = true; 
     if (m.Msg == WM_LBUTTONUP) down = false; 
     base.WndProc(ref m); 
    } 
} 

Widziałem też tego rozwiązania:

protected override void WndProc(ref Message m) 
{ 
    // WM_MOUSEACTIVATE = 0x21 
    if (m.Msg == WM_MOUSEACTIVATE && this.CanFocus && !this.Focused) 
     this.Focus(); 
    base.WndProc(ref m); 
} 

wpadłem na to na ostatnim miejscu pracowałem, myślę, że rozwiązanie wpadłem pracował bardziej jak ten ostatni, ale don nie mam dostępu do dokładnego kodu, którego użyłem.

+2

Używam drugie rozwiązanie i działa świetnie. Dziękuję Ci! –

+0

Po prostu uwaga, powinna być base.WndProc (ref m); –

+0

Przepraszam, dokonałem autokonwersji tego z VB. Naprawię to. – dwidel

-4

jeśli u mieć formie bez granic, więc logika ta pracowała dla ciebie zbudowany w :)

form.FormBorderStyle = FormBorderStyle.None 
+4

Twoja odpowiedź nie ma nic wspólnego z pytaniem. – LarsTech

Powiązane problemy