我的程序会窗体上不停地画图像,(最小化时不画)因为画得很频繁,而且不只是一个函数在画,所以每画一次先存入变量再贴到界面就显得效率不高。我知道当窗体最小化后再恢复,图像就不见了,所以我想在窗体最小化之前把图像“抢先”存入变量,窗体还原后再贴上去。有没有办法?我是菜鸟,大侠讲得详细点好吗,谢谢了!

解决方案 »

  1.   

    “我知道当窗体最小化后再恢复,图像就不见了”这句话什么意思?
    你只要在窗体的SizeChanged事件中重绘图像,图像就不会丢失啊。如果想在最小化的时候做保存图像处理
    private void Form1_SizeChanged(object sender, EventArgs e)
    {
        if (this.WindowState == FormWindowState.Minimized) //判断最小化状态
        {
            保存图像处理;
        }
    }
      

  2.   

    把图象写到一个byte[]里面,我也是菜鸟一个,个人的观点
      

  3.   

         if (this.WindowState == FormWindowState.Minimized) //判断最小化状态 
        { 
            保存图像处理; 
    /*这句话太抽象!
    已知是用窗体的Graphics画的,就是画在窗体(Form)上,怎么保存?*/
         } 另外我是因为没办法重绘,所以需要在原来画的基础上再画。
      

  4.   


    你图像绘制在(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画板创建成全局变量
      

  5.   


    谢谢你的回答,但我希望能直接画到Form上,在需要时获取已经画的图像。
    听说可以用截屏的方式,就是在最小化之前截取Form上的图像。这样似乎需要的代码比较多,其他的方法还有吗?
      

  6.   

    窗体有Paint的属性可以选择重画窗体的相关信息。
    另外如果是自己画的图片可以在OnPaint的事件里写上
      

  7.   


    呵呵,你的思路一可以啊,可以用截屏的方式做,代码量其实不大,但你要对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);
            }