ループして 1 つの新しいビットマップにすべてを書き込むビットマップ イメージのコレクションがあります。基本的に、ビットマップの緩いコレクションを取得し、それらをすべて 1 つのビットマップに次々と書き込んで、1 つの画像として表示します。
コレクション内のビットマップの 1 つから新しいビットマップに dc.DrawImage を呼び出すと、winform のフォームに大きな赤い X が表示されます。PictureBox.Image を新しく描画したビットマップに設定すると、大きな赤い X が表示されます。
何らかの理由で、どこにもエラーが見つかりません。デバッグでエラーを特定できません。
ここで、PictureBox.Image を画像のコレクション内の画像の 1 つに設定するだけで、ループや新しいビットマップへの描画を行わずにすべて正常に動作します。
すべてを簡単にするために、コレクション内の 1 つのビットマップのみを操作し、その 1 つのビットマップを新しいビットマップに描画します。したがって、動作するビットマップが 1 つしかないことがわかっているので、他のビットマップを追加できます。
下の画像は、コレクション内の画像の picturebox.image を設定した場合のフォームの外観です。2 番目の画像は、ループしてコレクション内のビットマップを別のビットマップに描画した後に表示されるエラーです。
以下のコードは機能する必要がありますが、エラーをスローします。
次のように PictureBox.Image のプロパティを設定している場所に注目してください。これにより、エラーが発生します。
しかし、picturebox.imageを次のように設定すると:
this.picBx.Image = schedules[0].Door; それはうまく動作します。
DoorSchedules schedules = GetDoorDrawing(elev, projInfo.ProjectName);
int prevWidth = 0;
//
using (Bitmap schedule = new Bitmap(schedules.Width + 50, schedules.Height + 50))
{
using (Graphics dc = Graphics.FromImage(schedule))
{
using (Pen pen = new Pen(LINE_COLOR))
{
pen.Width = 4;
pen.Color =
Color.FromArgb(50, LINE_COLOR.R, LINE_COLOR.G, LINE_COLOR.B);
//
for (byte i = 0; i < schedules.Count; i++)
{
if (i > 0)
{
dc.DrawLine(pen, prevWidth - 25, 0,
prevWidth - 25, schedule.Height);
};
dc.DrawImage(schedules[i].Door, prevWidth, 0);
prevWidth += schedules[i].Door.Width;
};
};
};
this.picBx.Image = schedule;
this.picBx.BackColor = BACK_COLOR;
this.Size = new System.Drawing.Size(schedule.Width, schedule.Height);
};