2012-03-05 14 views
5

Chciałbym móc zmienić kolor obramowania kontrolek ToolStripComboBox w niektórych z moich pasków narzędzi, ponieważ domyślny kolor obramowania ComboBox przy użyciu z płaską stylizacją to SystemColors.Window, który jest zasadniczo niewidoczne w stosunku do domyślnego koloru kontrolki paska narzędziowego. Po wielu poszukiwaniach w Reflectorze nie widzę żadnego oczywistego sposobu, aby to zrobić, ponieważ cała infrastruktura odpowiedzialna za renderowanie ComboBox jest wysoce chroniona za wewnętrznymi i prywatnymi interfejsami.Zmień obramowanie ToolStripComboBox z płaskim stylem

Poza ToolStrips, często spotykanym rozwiązaniem proponowanym do ustawiania koloru obramowania na ComboBoxach jest podklasa ComboBox, nadpisanie WndProc i ręczne malowanie obramowania. Nie działa to w przypadku kontrolek ToolStripComboBox, ponieważ wewnętrzna kontrolka ComboBox jest własną prywatną podklasą ComboBox, bez żadnej możliwości, która mogłaby zastąpić wystąpienie kontrolki.

Alternatywne rozwiązanie, które rozważam, to umieszczenie jednego z rozszerzonych obiektów ComboBox w narzędziu ToolStripControlHost, co pozwala mi narysować obramowanie, ale muszę zrezygnować z niektórych profesjonalnych ulepszeń mechanizmu renderującego. Wtórną wadą, którą zauważyłem, jest to, że od czasu do czasu dostaję migotanie.

Przełączanie projektu na WPF nie jest rozwiązaniem dopuszczalnym. Kontrolowanie zawijania w formantu rodzica w celu rysowania obramowań również nie jest dopuszczalne, ponieważ nie ma to wpływu na alternatywę ToolStripControlHost.

Czy ktoś ma sprytne rozwiązanie, aby pokonać ten problem, czy też istnieje istniejąca (dopuszczalna licencjonowana) powtórna implementacja płaskiego stylu renderowania ComboBox w środowisku naturalnym, który usuwa niektóre niedociągnięcia w istniejących realizacja?

Odpowiedz

2

Oto sposób, aby to działało ... rodzaj :)

Załóż obsługi zdarzeń dla zdarzenia Paint na ToolStrip. Następnie przeprowadź pętlę przez wszystkie ToolStripComboBoxes i pomaluj wokół nich prostokąt.

private Color cbBorderColor = Color.Gray; 
    private Pen cbBorderPen = new Pen(SystemColors.Window); 

    private void toolStrip1_Paint(object sender, PaintEventArgs e) 
    {    
     foreach (ToolStripComboBox cb in toolStrip1.Items) 
     { 
      Rectangle r = new Rectangle(
       cb.ComboBox.Location.X - 1, 
       cb.ComboBox.Location.Y - 1, 
       cb.ComboBox.Size.Width + 1, 
       cb.ComboBox.Size.Height + 1); 

      cbBorderPen.Color = cbBorderColor; 
      e.Graphics.DrawRectangle(cbBorderPen, r); 
     } 
    } 

Oto jak to wygląda (zauważ, że może trzeba wyregulować wysokość ToolStrip, aby zapobiec malowane granicę od odcięcia):

enter image description here

1

poprawy: sprawdź typ elementu paska narzędziowego, , aby program nie zgniótł się, jeśli jest to na przykład toolstipLabel.

foreach (var item in toolStrip1.Items) 
{ 
     var asComboBox = item as ToolStripComboBox; 
     if (asComboBox != null) 
     { 
      var location = asComboBox.ComboBox.Location; 
      var size = asComboBox.ComboBox.Size; 
      Pen cbBorderPen = new Pen(Color.Gray); 
      Rectangle rect = new Rectangle(
        location.X - 1, 
        location.Y - 1, 
        size.Width + 1, 
        size.Height + 1); 

      e.Graphics.DrawRectangle(cbBorderPen, rect); 
     } 

}