如何将窗体上的图像存入变量 我的程序会窗体上不停地画图像,(最小化时不画)因为画得很频繁,而且不只是一个函数在画,所以每画一次先存入变量再贴到界面就显得效率不高。我知道当窗体最小化后再恢复,图像就不见了,所以我想在窗体最小化之前把图像“抢先”存入变量,窗体还原后再贴上去。有没有办法?我是菜鸟,大侠讲得详细点好吗,谢谢了! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 “我知道当窗体最小化后再恢复,图像就不见了”这句话什么意思?你只要在窗体的SizeChanged事件中重绘图像,图像就不会丢失啊。如果想在最小化的时候做保存图像处理private void Form1_SizeChanged(object sender, EventArgs e){ if (this.WindowState == FormWindowState.Minimized) //判断最小化状态 { 保存图像处理; }} 把图象写到一个byte[]里面,我也是菜鸟一个,个人的观点 if (this.WindowState == FormWindowState.Minimized) //判断最小化状态 { 保存图像处理; /*这句话太抽象!已知是用窗体的Graphics画的,就是画在窗体(Form)上,怎么保存?*/ } 另外我是因为没办法重绘,所以需要在原来画的基础上再画。 你图像绘制在(Form)上,并且不能重绘,那就这样做创建一个bitmap画板:System.Drawing.Image bitmap = new System.Drawing.Bitmap(width, height);//高和宽和你要显示图像的Form一样System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap);把所有的画图操作放到这个bitmap中,这样你就能获得图像了,显示的时候把bitmap当作背景图添加到Form中,所有的画图修改在bitmap中操作,每次把修改后的图重新添加下Form的背景图bitmap画板创建成全局变量 谢谢你的回答,但我希望能直接画到Form上,在需要时获取已经画的图像。听说可以用截屏的方式,就是在最小化之前截取Form上的图像。这样似乎需要的代码比较多,其他的方法还有吗? 窗体有Paint的属性可以选择重画窗体的相关信息。另外如果是自己画的图片可以在OnPaint的事件里写上 呵呵,你的思路一可以啊,可以用截屏的方式做,代码量其实不大,但你要对API比较熟悉。截屏我做过,给你点代码参考下:相关的一些API函数class API { /// <summary> /// API函数,用于获取屏幕截图 /// </summary> /// <param name="hdcDest">目标设备的句柄</param> /// <param name="nXDest">目标对象的左上角的X坐标</param> /// <param name="nYDest">目标对象的左上角的Y坐标</param> /// <param name="nWidth">目标对象的矩形的宽度</param> /// <param name="nHeight">目标对象的矩形的长度</param> /// <param name="hdcSrc">源设备的句柄</param> /// <param name="nXSrc">源对象的左上角的X坐标</param> /// <param name="nYSrc">源对象的左上角的Y坐标</param> /// <param name="dwRop">光栅的操作值</param> /// <returns></returns> [DllImport("gdi32.dll")] //public static extern bool BitBlt( // IntPtr hdcDest, //目标设备的句柄 // int nXDest, // 目标对象的左上角的X坐标 // int nYDest, // 目标对象的左上角的Y坐标 // int nWidth, // 目标对象的矩形的宽度 // int nHeight, // 目标对象的矩形的长度 // IntPtr hdcSrc, // 源设备的句柄 // int nXSrc, // 源对象的左上角的X坐标 // int nYSrc, // 源对象的左上角的Y坐标 // System.Int32 dwRop // 光栅的操作值 // ); public static extern int BitBlt(IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, UInt32 dwRop); //创建桌面句柄 [DllImportAttribute("gdi32.dll")] public static extern IntPtr CreateDC(string lpszDriver, string lpszDevice, string lpszOutput, int lpInitData); [DllImport("gdi32.dll")] public static extern IntPtr CreateCompatibleDC(IntPtr hdc); //转换为本地的图像资源 [DllImport("gdi32.dll")] public static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight); [DllImport("gdi32.dll")] public static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj); [DllImport("gdi32.dll")] public static extern int DeleteDC(IntPtr hdc); //释放用过的画笔等资源 [DllImport("gdi32.dll")] public static extern bool DeleteObject(IntPtr hdc); //释放用过的设备句柄 [DllImport("user32.dll")] public static extern bool ReleaseDC(IntPtr hwnd, IntPtr hdc); }使用的一些方法:private void GetView() { IntPtr hScreenDc = API.CreateDC("DISPLAY", null, null, 0); // 创建桌面句柄 IntPtr hMemDc = API.CreateCompatibleDC(hScreenDc); // 创建与桌面句柄相关连的内存DC IntPtr hBitmap = API.CreateCompatibleBitmap(hScreenDc, 260, 400); IntPtr hOldBitmap = API.SelectObject(hMemDc, hBitmap); API.BitBlt(hMemDc, 0, 0, 260, 400, hScreenDc, 5, 200, (UInt32)0xcc0020); IntPtr map = API.SelectObject(hMemDc, hOldBitmap); this.picView.Image = Bitmap.FromHbitmap(map);//这里就是获取的截屏图,下面是对一些资源和句柄的释放 API.ReleaseDC(hBitmap, hScreenDc); API.DeleteDC(hScreenDc);//删除用过的对象 API.DeleteDC(hMemDc);//删除用过的对象 API.DeleteDC(hOldBitmap); API.DeleteObject(hBitmap); } C# toolstrip 外观 样式 怎么设置 winform 如何比较文件夹底下两两图片是否一样 求C#的winform或CS开源框架 问一个SQL语句的问题 count星的 下载网页源码 母版页的问题 菜鸟请教关于dll,线程的问题.急~ VS2005中的webform上的控件位置怎么自由放置呀? 请教:批量转换字符串的问题 ExpressionVisitor.Visit是什么意思? 有人知道为什么制作Setup时候中文文件名是乱码 richtextbox的字体问题
你只要在窗体的SizeChanged事件中重绘图像,图像就不会丢失啊。如果想在最小化的时候做保存图像处理
private void Form1_SizeChanged(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Minimized) //判断最小化状态
{
保存图像处理;
}
}
{
保存图像处理;
/*这句话太抽象!
已知是用窗体的Graphics画的,就是画在窗体(Form)上,怎么保存?*/
} 另外我是因为没办法重绘,所以需要在原来画的基础上再画。
你图像绘制在(Form)上,并且不能重绘,那就这样做
创建一个bitmap画板:
System.Drawing.Image bitmap = new System.Drawing.Bitmap(width, height);//高和宽和你要显示图像的Form一样
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap);
把所有的画图操作放到这个bitmap中,这样你就能获得图像了,显示的时候把bitmap当作背景图添加到Form中,所有的画图修改在bitmap中操作,每次把修改后的图重新添加下Form的背景图
bitmap画板创建成全局变量
谢谢你的回答,但我希望能直接画到Form上,在需要时获取已经画的图像。
听说可以用截屏的方式,就是在最小化之前截取Form上的图像。这样似乎需要的代码比较多,其他的方法还有吗?
另外如果是自己画的图片可以在OnPaint的事件里写上
呵呵,你的思路一可以啊,可以用截屏的方式做,代码量其实不大,但你要对API比较熟悉。截屏我做过,给你点代码参考下:相关的一些API函数class API
{
/// <summary>
/// API函数,用于获取屏幕截图
/// </summary>
/// <param name="hdcDest">目标设备的句柄</param>
/// <param name="nXDest">目标对象的左上角的X坐标</param>
/// <param name="nYDest">目标对象的左上角的Y坐标</param>
/// <param name="nWidth">目标对象的矩形的宽度</param>
/// <param name="nHeight">目标对象的矩形的长度</param>
/// <param name="hdcSrc">源设备的句柄</param>
/// <param name="nXSrc">源对象的左上角的X坐标</param>
/// <param name="nYSrc">源对象的左上角的Y坐标</param>
/// <param name="dwRop">光栅的操作值</param>
/// <returns></returns>
[DllImport("gdi32.dll")]
//public static extern bool BitBlt(
// IntPtr hdcDest, //目标设备的句柄
// int nXDest, // 目标对象的左上角的X坐标
// int nYDest, // 目标对象的左上角的Y坐标
// int nWidth, // 目标对象的矩形的宽度
// int nHeight, // 目标对象的矩形的长度
// IntPtr hdcSrc, // 源设备的句柄
// int nXSrc, // 源对象的左上角的X坐标
// int nYSrc, // 源对象的左上角的Y坐标
// System.Int32 dwRop // 光栅的操作值
// );
public static extern int BitBlt(IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, UInt32 dwRop); //创建桌面句柄
[DllImportAttribute("gdi32.dll")]
public static extern IntPtr CreateDC(string lpszDriver, string lpszDevice, string lpszOutput, int lpInitData); [DllImport("gdi32.dll")]
public static extern IntPtr CreateCompatibleDC(IntPtr hdc); //转换为本地的图像资源
[DllImport("gdi32.dll")]
public static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight); [DllImport("gdi32.dll")]
public static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj); [DllImport("gdi32.dll")]
public static extern int DeleteDC(IntPtr hdc); //释放用过的画笔等资源
[DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hdc); //释放用过的设备句柄
[DllImport("user32.dll")]
public static extern bool ReleaseDC(IntPtr hwnd, IntPtr hdc); }
使用的一些方法:
private void GetView()
{
IntPtr hScreenDc = API.CreateDC("DISPLAY", null, null, 0); // 创建桌面句柄
IntPtr hMemDc = API.CreateCompatibleDC(hScreenDc); // 创建与桌面句柄相关连的内存DC
IntPtr hBitmap = API.CreateCompatibleBitmap(hScreenDc, 260, 400);
IntPtr hOldBitmap = API.SelectObject(hMemDc, hBitmap);
API.BitBlt(hMemDc, 0, 0, 260, 400, hScreenDc, 5, 200, (UInt32)0xcc0020);
IntPtr map = API.SelectObject(hMemDc, hOldBitmap);
this.picView.Image = Bitmap.FromHbitmap(map);//这里就是获取的截屏图,下面是对一些资源和句柄的释放
API.ReleaseDC(hBitmap, hScreenDc);
API.DeleteDC(hScreenDc);//删除用过的对象
API.DeleteDC(hMemDc);//删除用过的对象
API.DeleteDC(hOldBitmap);
API.DeleteObject(hBitmap);
}