2012-06-05 12 views
2

Это другой подход к тому, что я делал ранее.C# combobox с линиями

В моем комб владельце обращается со списком рисовать 3 линии (твердый, тир, dashdot), который можно сделать с цветом, выбранным из ранее подборщики colpr выпадающего

this.DrawMode = DrawMode.OwnerDrawVariable; 
      this.DropDownStyle = ComboBoxStyle.DropDownList; 
    protected override void OnDrawItem(DrawItemEventArgs e) 
     { 
      e.DrawBackground(); 
      int startX = e.Bounds.Left + 5; 
      int startY = (e.Bounds.Y); 
      Point p1=new Point(startX,startY); 
      int endX = e.Bounds.Right - 5; 
      int endY = (e.Bounds.Y); 
      ComboBoxItem item = (ComboBoxItem)this.Items[e.Index]; 
      Point p2=new Point(endX,endY); 
      base.OnDrawItem(e); 
      Pen SolidmyPen = new Pen(item.foreColor, 1); 
      Pen DashedPen = new Pen(item.foreColor, 1); 
      DashedPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash; 
      Pen DashDot = new Pen(item.foreColor, 1); 
      DashDot.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDot; 
      // Pen DashedPen = new Pen(item.foreColor, (Int32)this.Items[e.Index]); 

      Bitmap myBitmap = new Bitmap(item.Picture); 
      Graphics graphicsObj; 
      graphicsObj = Graphics.FromImage(myBitmap); 
      switch (e.Index) 
      { 
       case 0: 
        graphicsObj.DrawLine(SolidmyPen, p1, p2); 
        break; 
       case 1: 
        graphicsObj.DrawLine(DashedPen, p1, p2); 
        break; 
       case 2: 
        graphicsObj.DrawLine(DashDot, p1, p2); 
        break; 


      } 

Вот что я пытаюсь сделать , Нарисуйте 3 строки (сплошной, тире, дашдот) в поле со списком.

Я не вижу каких-либо строк в поле со списком, за исключением какой-то синий, который является выбранным цветом

Спасибо и

+0

Вы используете WPF, ваш тег как winforms? ComboboxItem не существует в winforms? не то, что я знаю в любом случае. –

ответ

2

Попробуйте это.

Я начал новое приложение winforms. Созданный класс, основанный на ComboBox, добавил ваш код и немного изменил его. Я думаю, что основная проблема была в вашей растровой части. Вы создаете новое растровое изображение, затем нарисуете его, но никогда не используете созданный растровый рисунок. Если вы хотите сохранить созданный код, вам нужно будет добавить его в конец элемента method.Picture = myBitmap. Но я думаю, что это снова вызовет ondrawitem, и вы будете в бесконечном цикле. Вместо создания графического объекта, основанного на элементе item.Picture, просто используйте графический объект, созданный для вас в DrawItemEventArgs.

e.Graphics 

вот что я сделал, я думаю, что немного почистил его. И вы, возможно, уже знаете, но вы всегда должны обернуть ручки, кисти и графику, используя {....}, как показано ниже.

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 
} 

public class MyComboBox : ComboBox 
{ 
    public MyComboBox() 
    { 
    this.DrawMode = DrawMode.OwnerDrawVariable; 
     this.DropDownStyle = ComboBoxStyle.DropDownList; 
    } 
    protected override void OnDrawItem(DrawItemEventArgs e) 
    { 
     e.DrawBackground(); 
     //I removed you int startX... endy... stuff, unless you want to keep it for readability there is no need 
     Point p1 = new Point(e.Bounds.Left + 5, e.Bounds.Y + 5); 
     Point p2 = new Point(e.Bounds.Right - 5, e.Bounds.Y + 5); 

     //I am not sure why you would want to call the base.OnDrawItem, feel free to uncomment it if you wish though 
     //base.OnDrawItem(e); 

     switch (e.Index) 
     { 
      case 0: 
       using (Pen SolidmyPen = new Pen(e.ForeColor, 1)) 
       e.Graphics.DrawLine(SolidmyPen, p1, p2); 
       break; 
      case 1: 
       using (Pen DashedPen = new Pen(e.ForeColor, 1)) 
       { 
        DashedPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash; 
        e.Graphics.DrawLine(DashedPen, p1, p2); 
       } 
       break; 
      case 2: 
       using (Pen DashDot = new Pen(e.ForeColor, 1)) 
       { 
        DashDot.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDot; 
        e.Graphics.DrawLine(DashDot, p1, p2); 
       } 
       break; 


     } 
    } 
} 
+0

Thats it .... Спасибо uuu. – user575219

+0

Рад я мог помочь –

+0

@ K'Leg: Еще одно расширение. Я публикую его как новую дискуссию – user575219

1

Я использую подобный метод, чтобы нарисовать combobox. Но GDI + продолжает бросать исключение. Это отлично работает в Windows XP, но не в Windows 7.

Так что мне пришлось исправить это с помощью взлома.

Я добавил таймер, чтобы запустить событие, 100 мс после того, как форма была первоначально показана. Это событие показывает первый элемент в списке со списком.

private void timer1_Tick(object sender, EventArgs e) 
{ 
    // Use a short 100 ms delay before showing the default items 
    // in the dropdown lists 
    predefinedComboBox.SelectedIndex = 0; 

    // Disable the timer 
    timer1.Enabled = false; 
} 

Событие макета было слишком ранним. Элемент управления еще не был готов. Так было исключено исключение. Я не уверен, какие другие события могут быть использованы для достижения желаемого эффекта.

Смежные вопросы