我正在尝试开发Windows Mobile 6(在WF / C#中)应用程序。只有一个窗体,并且在窗体上只有一个PictureBox对象。在其上绘制所有所需的控件或所需的任何控件。
我正在做两件事。绘制自定义形状并从.png文件加载位图。
下一行在加载时锁定文件(这是不希望的情况):
Bitmap bmp = new Bitmap("file.png");
所以我正在使用另一种方式加载位图。
public static Bitmap LoadBitmap(string path) { using (Bitmap original = new Bitmap(path)) { return new Bitmap(original); } }
我想这要慢得多,但是我不知道有什么更好的方法来加载图像,同时快速释放文件锁。
现在,当绘制图像时,有一种我使用的方法:
public void Draw() { Bitmap bmp = new Bitmap(240,320); Graphics g = Graphics.FromImage(bmp); // draw something with Graphics here. g.Clear(Color.Black); g.DrawImage(Images.CloseIcon, 16, 48); g.DrawImage(Images.RefreshIcon, 46, 48); g.FillRectangle(new SolidBrush(Color.Black), 0, 100, 240, 103); pictureBox.Image = bmp; }
但是,这似乎是某种内存泄漏。如果我做的时间太久,该应用程序最终将崩溃。
因此,我有3个问题:
1.) 从文件加载位图而不锁定文件的更好方法是什么?
2.) 哪些对象需要在Draw()函数中手动放置(以什么顺序排列),所以没有内存泄漏和ObjectDisposedException抛出?
3.) 如果将pictureBox.Image设置为bmp,就像代码的最后一行一样,pictureBox.Image.Dispose()会只分配与维护pictureBox.Image或设置为它的基础位图有关的资源吗?
1:我不知道它是否可以在Windows Mobile中运行,但是请尝试以下操作:
FileStream bitmapFile = new FileStream("mybitmap.bmp", FileMode.Open, FileAccess.Read, FileShare.ReadWrite); Image loaded = new Bitmap(bitmapFile);
2:SolidBrush必须丢弃。有处理的一般规则。->“您实例化的,实现处置的每个对象都必须手动处置,该对象 是 返回/引用/输出值时应展示”
SolidBrush
在这种情况下,最好使用一条using语句
using
using (new objecttodispose){ ..... }
该using语句将确保Dispose()在任何情况下都进行调用(例如,例外)。
Dispose()
3:Dispose()将释放位图资源。