2015-04-26 2 views
0

Я пытаюсь отобразить растровое изображение, созданное с рисования на экран, но только визуализировать после минимизации и максимизации снова.Растровое изображение из чертежа не отображается за пределами Load_Form

Я выполните следующие действия: Using Bitmaps for Persistent Graphics in C#

Но только может сделать растровое изображение на экране за пределами Load_Form.

Если я ставлю код:

using System.Drawing; 
... 

Graphics graphicsObj; 
myBitmap = new Bitmap(this.ClientRectangle.Width, 
     this.ClientRectangle.Height, 
     Imaging.PixelFormat.Format24bppRgb); 
graphicsObj = Graphics.FromImage(myBitmap); 

Pen myPen = new Pen(Color.Plum, 3); 
Rectangle rectangleObj = new Rectangle(10, 10, 200, 200); 
graphicsObj.DrawEllipse(myPen, rectangleObj); 
graphicsObj.Dispose(); 

в другом месте, например, кнопки, мне нужно сворачивать и разворачивать, чтобы увидеть изображение.

Edit:

ВМР является Bitmap глобальная переменная создается экземпляр в виде события Load_Form1

bmp = new Bitmap(this.ClientRectangle.Width, 
       this.ClientRectangle.Height, 
       System.Drawing.Imaging.PixelFormat.Format24bppRgb); 

Краска события Формы для перерисовки:

private void Form1_Paint(object sender, PaintEventArgs e) 
{ 
    Graphics graphicsObj = e.Graphics; 
    graphicsObj.DrawImage(myBitmap, 0, 0, myBitmap.Width, myBitmap.Height); 
    graphicsObj.Dispose(); 
} 

Но мне нужно сделать сразу же после создания рисунка.

+1

Код, который вы показываете, создает растровое изображение (и пропускает перо). __Where__ Вы думаете, что это должно показать? Вы присваиваете это чему-то, например, Image или BackgroundImage? Мини-макс 'трюк' звучит так, как будто вам не хватает Invalidate для отображения вещей, нарисованных в событии Paint, которое не имеет ничего общего с вышеуказанным кодом. – TaW

+0

Я хочу показать в открытой форме. Я могу рисовать только тогда, когда Paint_Form1 запускается как шоу в «Правке», но мне нужно рисовать после генерации Bitmap. Я пытаюсь показать с ** graphicsObj.DrawImage (myBitmap, 0, 0, myBitmap.Width, myBitmap.Height); ** но работает только в Form1_Load. Я не могу показать из щелчка кнопки, которые создают растровое изображение. – omixam

+0

OK. Если это то, что вы хотите (как это ни странно, странно), все, что вам нужно сделать, это добавить 'this.Invalidate();' после создания растрового изображения. И __please__ do __not__ уничтожить все, что вы __didn't__ создаете, например 'e.Grahphics' !! - Конечно, просто глядя на код, который вы нам показываете, вам совсем не нужно, кроме: 'using (Pen myPen = new Pen (Color.Plum, 3) e.Graphics.DrawEllipse (myPen, rectangleObj) , '' и Rectangle, конечно. Остальное кажется бесполезным, если вам не нужен битмап для какой-то другой цели. - Наконец: 24bpp не рекомендуется, если вам это действительно нужно, используйте 32bpp – TaW

ответ

1

не говорят нам о более широкой картине делает его трудно рекомендовать лучший курс действий, но позвольте мне просто предположить две возможных цели:

  • или вы просто хотите что-то нарисованное на форму

  • или вы хотите отобразить растровое изображение, в которое вы успешно делаете все больше и больше вещей.

Для первого все, что вам нужно закодировать Paint событие так:

private void Form1_Paint(object sender, PaintEventArgs e) 
{ 
    Rectangle rectangleObj = new Rectangle(10, 10, 200, 200); 
    using (Pen myPen = new Pen(Color.Plum, 3)) 
     e.Graphics.DrawEllipse(myPen, rectangleObj); 
} 

Если данные, которые контролируют рисунок динамичны вы должны хранить их в переменных уровня класса или их списки и измените их по мере необходимости, чтобы вы могли использовать их в событии Paint.

Для последней цели будут различные времена, когда вы добавите в растровое изображение.

Таким образом, вы начинаете путем создания, вероятно, уровень класса Bitmap:

public Form1() 
    { 
     InitializeComponent(); 
     bmp = new Bitmap(this.ClientRectangle.Width, 
         this.ClientRectangle.Height);   
    } 

    Bitmap bmp = null; 

И есть одно или несколько мест, где вы рисуете в нее, как это:

void drawALittle() 
{ 
    Rectangle rectangleObj = new Rectangle(10, 10, 200, 200); 
    using (Pen myPen = new Pen(Color.Plum, 3)) 
    using (Graphics G = Graphics.FromImage(bmp)) 
    { 
     G.DrawEllipse(myPen, rectangleObj); 
     //.. 
    } 
    this.Invalidate(); 
} 

Обратите внимание, как я InvalidateForm после изменения Bitmap, поэтому инициируется событие Paint.

Также обратите внимание, что если это обновление произойдет очень часто, будет хорошей идеей сохранить живой объект Graphics между вызовами; либо сделав его переменный класс, как битмап или сохранить его локально в методе, который делает все обновления и передач его в качестве параметра методы рисования ..

В Paint событий форм все, что вам нужно, это

private void Form1_Paint(object sender, PaintEventArgs e) 
{ 
     e.Graphics.DrawImage(bmp, 0, 0); 
}  

Также обратите внимание, что 32bppARGB - рекомендуемый формат по умолчанию. Is используется для всего, что вы показываете в любом случае, поэтому наиболее эффективно использовать его для начала.

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