2009-10-11 10 views

Odpowiedz

20

I zdobione:

layoutMenus.Show(Cursor.Position.X, Cursor.Position.Y); 
+5

Ściśle mówiąc, to nie jest odpowiedzią do pytania. Spowoduje to wyświetlenie menu kontekstowego w miejscu wskaźnika, a nie w punkcie tuż pod przyciskiem. –

+0

Przyjechałem tutaj, szukając właśnie tego. Dziękuję Ci!! –

+0

Metoda ContextMenu.Show() ma wiele przeciążeń - w twoim przypadku dobrym rozwiązaniem byłby ten: Ustawia menu kontekstowe _relatywne dla twojego przycisku_. 'layoutMenus.Show (Button1, new Point (0, Button1.Height))' – AeonOfTime

1

Upewnij się, że kiedy jesteś pozycjonowanie z menu kontekstowego, aby przekazać go poprawne współrzędne ekranu. Będziesz musiał użyć czegoś takiego jak Control.PointToScreen, używając współrzędnych x, y, w oparciu o pozycję kontrolki w rodzica.

33

wiem, że to jest stare pytanie, ale myślę, że może pomóc innym ludziom. Poniższy kod wyświetli menu kontekstowe tuż pod kliknięciem przycisku, a przycisk będzie wyglądać jak przycisk rozwijany.

private void Button1_Click(object sender, EventArgs e) 
{ 
    Button btnSender = (Button)sender; 
    Point ptLowerLeft = new Point(0, btnSender.Height); 
    ptLowerLeft = btnSender.PointToScreen(ptLowerLeft);   
    ctMenuStrip.Show(ptLowerLeft); 
} 
+0

to zachowanie, którego szukam w Twoim rozwiązaniu! Nie mogę dowiedzieć się, jak to zrobić w chronionym zastąpieniu OnMouseClick (DataGridViewCellMouseEventArgs e) ... Próbuję ustawić ContextMenuStrip tuż pod moim dataGridViewCell. –

+0

@ D.Allen: Wygląda na to, że mówisz o klasie DataGridView w .NET i nadpisujesz zdarzenie OnCellMouseClick w klasie dziedziczonej z DataGridView. Jeśli tak, to czy możesz opisać, co dokładnie chcesz zrobić.Myślę, że możesz uzyskać położenie, współrzędne X/Y z obiektu DataGridViewCellMouseEventArgs –

+0

To rozwiązanie nie obejmuje przypadku krawędzi, w którym umieszczamy przycisk w pobliżu paska zadań, a następnie klikamy go, aby wyświetlić pasek menu kontekstowego. Czasami pasek menu ukryje przycisk z powodu przepełnienia, podczas gdy zachowanie "oczekiwane" powinno przerzucać menu, a następnie nad przyciskiem. Ale nie ma łatwego sposobu na uzyskanie takiego przerzucenia. –

-1

Łatwy sposób

contextMenuStrip1.Show (Przycisk1, Button1.PointToClient (Cursor.Position));

+0

To nie działa w ogóle działać. –

3

O ile wiem, kod potrzebna była tutaj:

// Po prawej stronie przycisku

ContextMenuName.Show(ButtonName.Left + ButtonName.Width + this.Left, ButtonName.Top + this.Top); 

na dole przycisk

ContextMenuName.Show(ButtonName.Left + this.Left, ButtonName.Top + ButtonName.Height + this.Top); 

W prawym dolnym rogu przycisku

ContextMenuName.Show(ButtonName.Left + ButtonName.Width + this.Left, ButtonName.Top + ButtonName.Height + this.Top); 
+0

Co to jest "ten" tutaj? Masz na myśli samą formę? Obliczenia nie działają, a menu pojawia się w nieoczekiwanej lokalizacji. –

1

Mam toolstripDropDown i po kliknięciu przycisku toolstripDropDown chciałem wyświetlić menu kontekstowe. Z powyższych komentarzy zmodyfikowałem swój kod w zdarzeniu toolStripDropDown_Openining w następujący sposób. to działa dobrze.

void toolStripDropDownButton_DropDownOpening(object sender, EventArgs e) 
    { 


      ToolStripDropDownButton btnSender = (ToolStripDropDownButton)sender; 
      Point ptLowerRight = new Point(btnSender.Bounds.Right, btnSender.Bounds.Bottom); 
      ptLowerRight = PointToScreen(ptLowerRight); 
      contextMenuStrip.Show(ptLowerRight); 
    } 
4

ContexMenuName pod przyciskiem, wyrównany do prawej strony przycisku (rozszerza się przycisk poniżej i na lewo): ContexMenuName.Show(ButtonName, new Point(ButtonName.Width - ContexMenuName.Width, ButtonName.Height)); nadzieję, że pomoże sb :)

+0

Używam rozwiązania @ saper_2 i działa idealnie dla mnie. –

Powiązane problemy