大侠请进,在理解下,截图打印类

jiuzhixiang007 2010-10-27 09:01:14
大侠“龙月 .NET”谢谢您。他已经给在下作了解答,但是还是有些不理解它的原理。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

namespace tsleyyg.panelPrint
{
class panelPrint
{
private static Bitmap mBitmap = null;
private static System.Drawing.Printing.PrintDocument printDoc = new System.Drawing.Printing.PrintDocument();

public static void PrintPanel(Panel p)
{
PrintPreviewDialog ppvw;
Graphics mygraphics = p.CreateGraphics();
Size s = p.Size;
mBitmap = new Bitmap(s.Width,s.Height,mygraphics);
Graphics memoryGraphics = Graphics.FromImage(mBitmap);
这几句的功能是:把 panel 当作画板,要在panel 上画东西

疑问1:“Graphics mygraphics = p.CreateGraphics();”和“Graphics memoryGraphics = Graphics.FromImage(mBitmap);
”有什么差别?

疑问2:为什么“mBitmap = new Bitmap(s.Width,s.Height,mygraphics);”这样生成“位图”之后,又“Graphics memoryGraphics = Graphics.FromImage(mBitmap);”回去生成“Graphics”。




IntPtr dc1 = mygraphics.GetHdc();
IntPtr dc2 = memoryGraphics.GetHdc();

疑问3:这两个句柄分别表示的是“原始设备”和“目标设备”是吧?



BitBlt(dc2,0,0,p.ClientRectangle.Width,p.ClientRectangle.Height,dc1,0,0,13369376);

疑问4:这个是利用“API”截图,但是截得的图片在哪啊?
mygraphics.ReleaseHdc(dc1);
memoryGraphics.ReleaseHdc(dc2);

ppvw = new PrintPreviewDialog();
ppvw.Width = 160;
ppvw.Height = 221;

疑问5:这个大小是不是表示预览界面的大小?如果是怎样把它的大小设置的和Panel的大小一致,因为只要这样才可以预览Panel截图的整体效果。要不然预览结果是Panel截图在预览界面的左上角?



ppvw.Document = printDoc;

printDoc.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(PrintDoc_PrintPage);



if (ppvw.ShowDialog() != DialogResult.OK)
{
printDoc.PrintPage -= new System.Drawing.Printing.PrintPageEventHandler(PrintDoc_PrintPage);
return;
}




printDoc.Print();

疑问六:截图是怎样传输给打印机的,是不是跟“printDoc”对象有关系?

}

[System.Runtime.InteropServices.DllImport("gdi32.dll")]
private static extern long BitBlt(IntPtr HDest, int nXDest, int nYDest, int nWidth, int hHeight, IntPtr Hsrc, int nXSrc, int nYSrc, int DwRop);


private static void PrintDoc_PrintPage(Object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
e.Graphics.DrawImage(mBitmap,0,0);

疑问七:这是干嘛的?不是截好图了吗,怎么还有画?

}
}
}


谢谢您的指教,大家一起学习。。。
...全文
83 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiuzhixiang007 2010-11-04
  • 打赏
  • 举报
回复
谁可以说说它的实现原理吗?
jiuzhixiang007 2010-11-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 rock870210 的回复:]
既然如此,偶就不罗嗦了。。。。。
[/Quote]

大侠说几句呗。。。
Rock870210 2010-10-30
  • 打赏
  • 举报
回复
既然如此,偶就不罗嗦了。。。。。
jiuzhixiang007 2010-10-30
  • 打赏
  • 举报
回复
雄起。。。
lulei 2010-10-27
  • 打赏
  • 举报
回复
Graphics mygraphics = p.CreateGraphics();是通过p,create出来的
Graphics memoryGraphics = Graphics.FromImage(mBitmap);是通过Graphics的静态方法获取的,将mBitmap读到内存中
内容概要:本文针对无刷直流电机驱动的电子机械制动(EMB)执行器,建立了考虑Stribeck摩擦特性的非线性耦合动力学模型,并在Simulink环境中完成了系统级仿真分析。研究综合集成了电机动力学、齿轮传动机构与制动执行机构的动力学特性,构建了高保真的机电一体化系统模型。重点引入Stribeck摩擦模型以精确描述低速工况下执行器内部存在的静摩擦、粘滞摩擦与库仑摩擦之间的过渡行为,有效提升了系统在启停、反向运动等瞬态过程中的动态响应仿真精度。通过多工况仿真验证了模型的有效性,能够准确反映摩擦引起的爬行、滞后与定位误差等非线性现象,为EMB系统的高性能控制算法设计(如摩擦补偿、滑模控制)与结构优化提供了高可信度的仿真平台。; 适合人群:从事汽车电子制动系统、电机驱动控制、机电系统建模与仿真研究的研究生、科研人员及工程技术人员,需具备扎实的机械动力学、自动控制理论基础和MATLAB/Simulink仿真能力。; 使用场景及目标:①用于高精度电子机械制动系统的设计验证与性能预测;②为消除摩擦非线性影响的先进控制策略(如自适应控制、智能控制)提供精确的被控对象模型;③深入探究Stribeck摩擦等非线性因素对系统动态性能(如响应延迟、稳态误差)的作用机理; 阅读建议:读者应结合提供的Simulink模型文件,深入剖析Stribeck摩擦模块的数学实现与参数辨识方法,建议通过改变输入指令(如阶跃、正弦)和负载条件进行对比仿真,以直观理解非线性摩擦对系统动态特性的影响。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧