精华内容
下载资源
问答
  • HTML打印指定区域

    千次阅读 2019-06-12 02:03:51
    通常在浏览网页的时候,网页上总是出现一些和内容无关的内容,在打印的时候,要是把整个网页都打印下来,总会有些不方便。。。所以在有需要打印的网页上稍微设置一下打印页是很有必要的。。。 首先在head里面加入...

    一、直接利用JS技术实现打印HTML表格

    通常在浏览网页的时候,网页上总是出现一些和内容无关的内容,在打印的时候,要是把整个网页都打印下来,总会有些不方便。。。所以在有需要打印的网页上稍微设置一下打印页是很有必要的。。。

    首先在head里面加入下面一段js代码:

    <scriptlanguage="javascript"> function preview(oper){ if (oper < 10){ bdhtml=window.document.body.innerHTML;/ /获取当前页的html代码 sprnstr="";/ /设置打印开始区域 eprnstr="";/ /设置打印结束区域 prnhtml=bdhtml.substring(bdhtml.indexOf(sprnstr)+18); / /从开始代码向后取html prnhtml=prnhtml.substring(0,prnhtml.indexOf(eprnstr));/ /从结束代码向前取html window.document.body.innerHTML=prnhtml; window.print(); window.document.body.innerHTML=bdhtml; } else {   window.print(); } } 然后在所需要打印的代码,用和包围着,如下:

        ...
    最后加上一个打印的按钮

    <input type=buttonname='button_export' title='打印1' οnclick=preview(1) value=打印1> 另外说明一下,在一个HTML页面里面,可以设置多个打印区域,需要改动一下的就只是几个数字就OK了。如:

    在选择第二个区域里面时用包围着,而按钮自然也改成对应的preview(1)了。这样第二区域的打印就完成。

    还有一点,就是CSS样式表的问题了,打印的效果是不包含背景的打印的,设置是注意一下。

    转载于:https://juejin.im/post/5d005d65f265da1b7152ed07

    展开全文
  • //设置第一工作簿上的打印区域 方法1 /// wb.setPrintArea(0, "$A$1:$C$2"); //设置第一工作簿上的打印区域 方法2 //这里后面的四参数和合并单元格的参数的意思是一样的 wb.setPrintArea( ...

    @author YHC

    格式化单元格数据:

                     //创建Excel
    		   Workbook wb = new HSSFWorkbook();
    		   //创建工作薄
    		    Sheet sheet = wb.createSheet("format sheet");
    		    //创建样式
    		    CellStyle style;
    		    //创建格式化数据对象
    		    DataFormat format = wb.createDataFormat();
    		    //创建行
    		    Row row;
    		    //创建单元格
    		    Cell cell;
    		    //
    		    short rowNum = 0;
    		    //
    		    short colNum = 0;
                         //创建行
    		    row = sheet.createRow(rowNum++);
    		    //创建单元格
    		    cell = row.createCell(colNum);
    		    //设置Cell值
    		    cell.setCellValue(11111.25);
    		    //创建样式
    		    style = wb.createCellStyle();
    		    //设置格式化数据样式,保留一位小数
    		    style.setDataFormat(format.getFormat("0.0"));
    		    //应用此样式
    		    cell.setCellStyle(style);
                
    		    //创建新行
    		    row = sheet.createRow(rowNum++);
    		    //创建单元格
    		    cell = row.createCell(colNum);
    		    //设置值
    		    cell.setCellValue(11111.25);
    		    //创建样式
    		    style = wb.createCellStyle();
    		    //设置格式化数据格式, 模式中的"#"表示如果该位存在字符,则显示字符,如果不存在,则不显示。
    		    //0表示该位有值则显示,没有则补0
    		    style.setDataFormat(format.getFormat("#,##0.0000"));
    		    //应用此样式
    		    cell.setCellStyle(style);
    
    		    //写入文件
    		    FileOutputStream fileOut = new FileOutputStream("workbook.xls");
    		    wb.write(fileOut);
    		    fileOut.close();    

    运行后效果:



    设置打印区域:

                    //创建Excel
    		   Workbook wb = new HSSFWorkbook();
    		    //创建工作簿
    		    Sheet sheet = wb.createSheet("Sheet1");
    		    //设置第一个工作簿上的打印区域  方法1
    		     /// wb.setPrintArea(0, "$A$1:$C$2");
    		    
    		    //设置第一个工作簿上的打印区域  方法2
    		    //这里后面的四个参数和合并单元格的参数的意思是一样的
    		    wb.setPrintArea(
    		            0, //工作薄 下标0开始
    		            0, //起始列 下标0开始
    		            1, //终止列 下标0开始
    		            0, //起始行 下标0开始
    		            0  //终止行 下标0开始
    		    );
    		    
                        //写入文件
    		    FileOutputStream fileOut = new FileOutputStream("workbook.xls");
    		    wb.write(fileOut);
    		    fileOut.close();

    设置后的效果图:


    上面应该说单元格的线条变色的是打印区域;

    如果以上有错误的地方还请大家指出!thanks!

    展开全文
  • 经常在开发实际的应用程序中,需要用到图形绘制和打印程序。如何实现完整的精确打印和绘图是需要注意许多细节地方的。最近在遇到打印问题的时候,仔细研究一阵,总结这篇博文,写得有点杂乱,看文要还请费点神。 ...

    经常在开发实际的应用程序中,需要用到图形绘制和打印程序。如何实现完整的精确打印和绘图是需要注意许多细节地方的。最近在遇到打印问题的时候,仔细研究一阵,总结这篇博文,写得有点杂乱,看文要还请费点神。

    基本功能:窗体绘图与鼠标交互

     打印预览与打印输出

    开发平台:VisualStudio 2010 C#

    1绘图坐标系统

    1.1绘图系统坐标转换(屏幕窗口/打印机)

       绘图程序涉及到多种坐标系统,总体上可分为三个坐标系:世界坐标系、页面坐标系以及设备坐标系。想要将图形图像会知道最终的设备上,中间需要做各种坐标转换,下面将详细介绍绘图系统中的坐标转换关系

    1、世界坐标

    实际的绘图区域,如港口码头的2000米长度的范围、测井3000米的测量深度等。通常的实际应用中如果用到有打印这样的精确绘制功能,则还需要注意由世界坐标映射到逻辑坐标的比例,有两种方式:

    1)根据绘图窗口大小动态的计算映射比例,一般绘图都是这样,这种方式可以让用户更加方便的阅览全局绘图;

    2)设定映射比例为一个定值,计算出相应的转换坐标,如测井中绘图的MD 1:200这样的参数,这样绘图区域大小是不变的,超出窗口位置要设定滚动条拖动显示。

    通常还需要根据需要,把以上两种方式都实现出来,供选择使用,如Adobe PDF浏览器既具有整页缩放功能,也有按比例缩放这样的功能。

    2、页面坐标

    绘图页面总体设计大小,如默认选择A4的纸张(210mm * 297mm),此时系统建立基于所选纸张大小区域作为逻辑坐标范围。

    3、设备坐标

    1屏幕窗口:根据具体绘图区域获取,如屏幕窗口绘图的客户区ClientRectangle等,单位是pixel

    2打印机:绘图区域也可以是打印机的实际绘制区域,但此时要注意单位,VS.NET默认的是单位1/100 inch,即VC++编程用到映射模式中的的MM_LOENGLISH映射方式,逻辑单位为0.01 inch(如下表中颜色标识项所示)。

    Windows定义了的8种映射方式

    MM_TEXT

    MM_LOMETRIC

    0. 1mm

    0.1

    MM_HIMETRIC

    0. 01mm

    0.01

    MM_LOENGLISH

    0. 01英寸

    0.254

    MM_HIENGLISH

    0.001英寸

    0.0254

    MM_TWIPS

    1/1440英寸

    0.0176

    MM_ISOTROPIC

    意(x=y

    MM_ANISOTROPIC

    意(x!=y

    注:MM_TWIPS经常在打印机上,单位是1/20磅(1=1/72英寸)。

    三个坐标系转换关系如下图所示:


    由于打印机的分辨率参数经常是600Dpi或者更高的1200Dpi等数值,远比屏幕的96Dpi或者120Dpi数值大得多,为了保证能有效的实现所见即所得效果,即屏幕窗口绘图跟实际打印结果一致,需要处理不同分辨率问题。此处有两种解决方案:一种是计算打印机和屏幕的分辨率比例,然后屏幕绘图的结果,在向打印机上绘图时候进行比例缩放计算,这种方法是又世界坐标直接映射到像素在做计算;另一种则是基于页面坐标绘图,所有绘图坐标单位设置映射到页面坐标(mm单位),随后进行的绘图就直接计算LPtoDP转换即可。两种方法都是主动计算转换的像素,也可换成简便的开发平台自带的绘图系统,即设置GraphicsPageUnit属性为毫米即可。

    设置Graphics.PageUnit为默认的Pixel单位,此后所有绘图单位都是基于像素单位,此处设备坐标大小,即多少像素是程序计算。为了方便计算页面坐标同设备坐标之间的转换,可以建立函数处理,类似MFC中的逻辑坐标与设备坐标之间的转换函数LPtoDP,如上图所示的坐标转换过程。

    设定窗口到视口的绘图单位为像素单位,两种坐标系设定如下:

    1)屏幕绘图:

    Graphics g = panel1.CreateGraphics();

         g.PageUnit= GraphicsUnit.Pixel;

    2)打印机绘图:

        PrintPageEventArgse

         Graphics g = e.Graphics;

         g.PageUnit= GraphicsUnit.Pixel; 

    4、坐标转换差异测试2013/11/17

    坐标轴绘图测试代码(注:边框线是用m_WPtoDP_X绘制的,而坐标轴是用两种方法进行绘制,由此看出两种绘图方式存在的差异

     for (float fX = 0; fX <= WorldSize.Width;fX += v_f_MarkLong)

    1)测试由世界坐标到页面坐标转换,再由页面坐标到设备坐标转换,并加上缩放系数最后得到窗口范围内的坐标值绘图如下所示。

    v_f_TempX = m_WPtoLP_X(fX);

                  v_f_TempX = m_LPtoDP_X(v_f_TempX);

                  v_f_TempX *= v_f_ScaleZoomX;

    左边为小窗体时的首尾绘图,存在明显误差;右边为窗体放大后的首尾绘图,误差明显减小,但仍然存在一定误差。

    2)测试直接由世界坐标转换到设备坐标窗口绘图,结果如下:

    v_f_TempX = m_WPtoDP_X(fX);

    实际效果证明窗体缩放对误差大小基本没有影响,基本没有误差。

    结论:直接由世界坐标到设备坐标映射减少了坐标转换的计算次数,有效避免了转换将计算过程中的误差累积,效果较好。其余的坐标转换则可以在需要的时候,直接使用,避免多次叠加使用。但是在实际使用过程中,还是使用了第一种方法(所有绘图都用相同方法,保证了绘图的一致性,不存在差异),这样避免了总是设定设备坐标(DP)的区域参数,在窗体缩放大小等变化的时候,减少计算量。

    5、绘图显示缩放问题

    进一步采用(1)的绘制方法注意的问题,即采用页面坐标到设备坐标映射比例绘图,此时基于页面坐标的区域进行绘图,会造成与设备坐标之间的绘图区域部匹配问题,例如A3纸张大小的区间需要的设备区域是2000*3000, 而实际的绘图窗口大小事800*600,因此会出现绘图显示不完全的情况,所以再次引进缩放系数v_f_ScaleZoomXv_f_ScaleZoomY。此时存在四种屏幕显示方式,如下表所示。

    1.2屏幕坐标系

    在屏幕窗体上绘图的坐标系原点在左上角位置:

    Origin = ( 0, 0)(Pixel)

    逻辑坐标和设别坐标都基于该Origin点进行计算,具体的绘制转换计算关系如下图所示:

       其中需要注意设置的是逻辑坐标,根据打印机选择的纸张,设定页面坐标系,同时考虑了打印机物理边距和打印纸页面边距,真正用于坐标转换的,只有PlotArea区域的尺寸大小。

    1.3打印坐标系

    在实际的物理打印中,经常出现以前问题:

    Problem由于实际的物理打印机可能存在物理边距问题,使得实际的物理打印坐标存在偏移(PrintOffset),因此在获取页面边距后,需要进一步考虑物理边距,才能更好的计算实际的打印区域。


    Analysis分析打印系统的坐标系统成为必要,上述问题中明显出现的坐标平移情况,同时导致右边和下边出现了打印不完全的情况。最后得出C#的提供的平台中,打印的坐标原点是需要设定的,由于存在打印机的物理边距问题,实际物理打印坐标原点分两种情况:

    1)原点在物理边距线上,Origin = (HardMaeginX, HardMarginY )(1/100inch)

    2)原点在页面边距线上,Origin = (MaeginLeft, MarginTop )(1/100inch)

    打印文档类关于打印坐标原点位置属性的MSDN解释:

    public bool OriginAtMargins { get; set; }

    ---trueif the graphics origin starts at the page margins;对应于(2)

    ---falseif the graphics origin is at the top-left corner of the printable page. 对应于(1)

    具体坐标如下图所示:打印纸的总体尺寸为黑色坐标系(827*11690.01 inch,而真正可打印的区域为v_PrintDocument.DefaultPageSettings.PrintableArea提供的绿色坐标系区域,此时应该把PrintableArea作为真正的打印计算坐标系。

    Solution知道物理边距影响因素后,打印问题的处理通常有两种方案:

    方案一:普遍采用的讲绘图内容进行位移

    通常的做法是将可打印区域进行Offset平移,平移量为打印机物理边距(HardMarginX / HardMarginY),这样结合默认的打印纸张的页面边距(MarginLeft /MarginRight / MarginTop / MarginBottom)也能按照预览时的绘图一模一样的打印出来。

    这种做法比较简单,只需要进行位移一下Graphics即可。但是注意,此时的页面边距不能为0,否则任然会出现打印绘图缺失现象,物理边距是不可避免的。要避免这种情况就需要判断页面边距的值,不能小于物理边距的值才行。

    方案二:可以重新定义页面坐标,对页面尺寸进行裁剪

    方案一在计算了左边和上边的不可打印区域,但是没有计算右边和下边的不可打印区域。这样位移和绘图的时候,就需要考虑是否打印出来的图正好在正中等问题。要精确控制就是将可打印区域裁剪到实际物理可打印的区域,如上图所示的绿色区域。

    设定OriginAtMargins = false使得打印机的绘图Graphics的坐标原点在有效打印区域的边界上,即坐标原点为物理边距上,而不是在页面边距上。于是,我们绘制的时候,X坐标0100,实际上是从HardMarginX+0HardMarginX+100,在计算页面坐标的时候,考虑物理边距进行排除后,就能实现在可打印区域内(排除了物理不可打印区域)进行精确的绘图。

    但是也要注意,在屏幕绘图和打印预览的时候,需要将坐标进行向下向右平移物理尺寸,使得绘图效果与打印效果一致。同时,针对不同的Dpi造成的误差,避免的办法是定义单位是mm,然后采用LPtoDP进行转换,在转换的过程中,会用到GraphicsDpi属性进行计算,屏幕Dpi和打印机Dpi不同,但是得到最后的绘图效果将会统一,实现所见所得。

     

    物理边距的误差

    至于物理边距问题,有可能打印出来的实际纸张上的物理边距跟程序获取的边距有误差,原因可能是打印机自身有关,也可能跟纸张在纸盒中放置有偏移有关。但这都算是不可避免的误差了,也不知道如何校正,我们只需要实现实际绘图内容打印完整,且绘制内容的精确定位绘制即可!

    ?当纸张方向改变的时候,程序获取到的HardMarginXHardMarginY会有所改变,不知是何原因啊?

    LandScapefalse的时候:HardMarginX = 23HardMarginY = 16

    LandScapetrue的时候:HardMarginX = 19HardMarginY = 16

    希望有网友能解决这问题的麻烦留个言指导一二哦。

     

    其他关于物理边距讨论的一部分链接

    (1) How to Find the ActualPrintable area

    http://stackoverflow.com/questions/8761633/how-to-find-the-actual-printable-area-printdocument

    (2) I am Loss in Printing Margins

    http://bytes.com/topic/c-sharp/answers/275603-im-loss-printing-margins

    (3)How to print in full page withoutmargins

    http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.drawing/2005-08/msg00311.html

    (4)使用.Net 下的打印控件进行预览和打印时的模型初探

    http://blog.csdn.net/windcoder/article/details/8178096

     

    1.4绘图操作流程

      绘图工作开始后,需要进行一系列的绘图参数设定,其中绘图坐标系的设定最为重要。大概可分为以下几个步骤:

    Step 1:设定世界坐标系。给定需要绘制的世界坐标区域大小,相当于绘图的视野范围;

    Step 2:设定页面坐标系。即纸张大小,相当于逻辑坐标系。这点在打印机的绘制程序中尤为重要,同时为了实现所见即所得的绘图思路,此处的窗体绘图跟打印绘图应该有良好的对应关系,所以设定的纸张应该一致。

    Step 3:设定绘图对象Graphics,可以是打印机绘图,也可以是屏幕窗口绘图。

    Step 4:设定设备坐标系。给定绘图设备的实际区域,如屏幕窗口大小、打印机的实际可打印区域等。

    Step 5:输入绘图数据。

    Step 6:绘图输出

    简单的绘制流程图如下:

    1.5交互操作中屏幕坐标系与打印坐标系的转换

    1)鼠标屏幕拾取转换,讲鼠标坐标值(Pixel)转换为页面坐标值(mm),需要考虑滚动条位置、物理边距和屏幕显示缩放系数等,页面坐标(mm)转换为世界坐标(M)直接调用函数即可。伪代码如下:

    // 需要考虑滚动条位置

    Graphics g = panel1.CreateGraphics();

    int i_PosHor = panel1.HorizontalScroll.Value;

    int i_PosVer =panel1.VerticalScroll.Value;

    int i_OffsetX = (int)(m_LPtoDP_X(v_f_LogicHardMarginX, g) /v_f_ScaleZoomX) - i_PosHor;

    int i_OffsetY = (int)(m_LPtoDP_Y(v_f_LogicHardMarginY, g) /v_f_ScaleZoomY) - i_PosVer;

    float v_f_LogicMousePosDownX =m_DPtoLP_X(e.X + i_PosHor, g) * v_f_ScaleZoomX - v_f_LogicHardMarginX;

    float v_f_LogicMousePosDownY =m_DPtoLP_Y(e.Y + i_PosVer, g) * v_f_ScaleZoomY - v_f_LogicHardMarginY;

    转换为世界坐标:

    float v_f_WorldMousePosDownX= m_LPtoWP_X(v_f_LogicMousePosDownX);

     

    2)世界坐标转换为页面坐标和设备坐标伪代码:

    Graphics g = panel1.CreateGraphics();

    float v_f_WorldX = 2000;

    float v_f_LogicTempX = m_WPtoLP_X(fX);

    float v_f_DeviceTempX =m_LPtoDP_X(v_f_TempX, g) / v_f_ScaleZoomX;

    1.6提高绘图效率

       现在一般的GDIGDI+绘图都没有问题,关键是提高绘图的效率,防止绘图刷新时的闪烁问题,在此参考了两篇高质量的网文如下:

    1使用bitblt提高GDI+绘图的效率(转)

    http://www.cnblogs.com/carekee/articles/2178308.html

    引用(略)

    2绘图效率完整解决方案——三种手段提高GDI/GDI+绘图效率

    http://www.cnblogs.com/fyhui/archive/2011/06/09/2076298.html

    现在的cpu飞快,其实数学计算一般很快,cpu大部分时间是在处理绘图,而绘图有三种境界:1>每次重绘整体Invalidate() 2>每次局部绘制Invalidate(Rect) 3>有选择的局部绘制。

      不能说,一定是第三种方式好,得视情况,境界高程序肯定就复杂,如果对效率要求不高或者绘图量小当然直接用第一种方式。然而,稍微专业点的绘图程序,第一第二种方式肯定满足不了要求,必须选用第三种方式。而第三种方式的手段多样,也得根据实际情况拿相应的解决之道。这里讲解一般的三种手段,他们可以联合使用。

    1. 缓存——Bitmap或者DoubleBuffer。缓存就是先把绘制的图形绘制到一张内存位图上,然后在一次性的贴位图,他可以提高绘图速度,也能避免闪烁。DoubleBuffer=trueC#窗体的属性,设置了此属性估计系统本身会起用无效区的内存位图缓存,而不需要程序员Bitmap处理。

    2. 合理利用无效区域。无效区域就是系统保存当前变化需要重绘的区域,可以在OnPaint()中,e.ClipRectangle直接获得,也可以通过其他方式获得。Windows系统只会重绘无效区域内的绘图信息,然而我们用户的绘制代码一般是绘制整个区域的,很多时候无效区域只是一小部分区域,虽然执行了所有的绘图代码,但是Windows系统只会重新更新无效区域内的绘图。这里有两个利用点:1>用户请求重绘时,只请求重绘指定区域的,而不是整个区域,如Invalidate(Rect)2>在用户绘图代码Graphics g; g.DrawLine\g.DrawString\g.FillRectangle...前,先判断绘图的内容是否在无效区域,如果不是就不直接g.Draw...绘图代码。

    3. 直接贴图。一般绘图或者重绘是Windows根据无效区域绘制的,如果在鼠标移动时需要重绘通过Windows系统处理Paint消息,有时满足不了要求,比如鼠标移动绘制十字测量线就得用异或线而不是Paint消息,又比如鼠标移动绘制跟随的信息提示框需要频繁擦除上次覆盖的背景,又比如台球滚动时台球与球桌背景的关系。类似的这些问题如何解决?首先肯定不能利用Windows原来的绘图机制。其中一种解决方式是,不断的帧间变化区域贴内存位图——中的信息框每次鼠标位置变化时可以重新g.Draw...或者贴早生成的信息框内存位图,中被信息框覆盖的背景应该把本来的大背景截取此需要擦除区域的位置大小位图贴回来就是擦除背景了。由于每次大背景发生变化时,都应会重新生成大背景内存位图,所以可以是变化的背景。

      这三种方式可以一起使用,应该可以解决中等的绘图项目的效率问题。中大型的绘图,必须记住两点1>只绘制电脑屏幕能显示的部分;2>只绘制变化的部分。

    1.7异或作图法响应鼠标实时绘制

       异或作图法不同于普通的绘图方法中的刷新需要按照Invalidate的区域全部重新绘制,它只是采用覆盖绘制的方式,实现了擦除原有轨迹来达到刷新绘制,这样就极大的提高了绘图效率,避免不必要的区域性重绘耗费资源成本,也能十分有效的避免因为小区域或线型实时绘制等任务造成的整个绘图窗体闪烁问题。需要注意的是,异或作图法跟普通的画法感觉最大的别扭就是需要“连续”的两次绘图,然后这两次绘图结果根据用户设定的异或方式,进行异或计算,得出擦除、反色或覆盖等结果。

       其实现方式很简单,直接调用GDI的相关函数进行设定即可,下图为已实现异或填充绘图。

    文章已经很长了,不想一一列举,以下是一些有用的参考链接:

    (1)<基础的异或作图方法>VC橡皮筋绘图技术的实现(异或模式绘图) 

    http://xvdongming001.blog.163.com/blog/static/739891892008613516138/

    (2)<C#实现异或作图方法>C#调用GDI实现.NET中XOR、AND和OR模式的贴图(填充不规则图形) 

    http://blog.163.com/xuanmingzhiyou@yeah/blog/static/14247767620116201178195/

    3<C#实现异或作图方法C#中利用GDI作图解决异或问题

    http://www.tp5u.com/winForm/1794.html

    校正:这篇文章中公布了一个异或法绘制直线的方法,但是其中关于MoveToEx的GDI库调用函数存在问题,需要增加ref关键字引用,

    [DllImport("gdi32.dll")]
    private static extern bool MoveToEx(IntPtr hDC, int x, int y, 
    ref POINTAPI lpPoint);

    调用函数:MoveToEx(hDC, 10, 10, ref ptsOld);  

    具体参考地址:

    GDI32.DLL API函数MoveToEx C#2.0中的调用问题

    http://bbs.csdn.net/topics/90040089

    4<C#使用其他GDI方法接口定义>C#中使用GDI的简单总结

    http://www.cnblogs.com/canson/archive/2011/07/09/2101862.html

    5C#Color  VC++COLORREF 转化

    http://blog.csdn.net/whchina/article/details/2639389

    http://responsibility.blog.sohu.com/86726377.html

    如果使用MFC.NET混合编程,就会遇到这个问题,通过MFC编写的控件,由.NET调用,则控件中背景色的设置,需要颜色的转换。

    COLORREF类型颜色的值COLORREFcr=RGB(123,200,12);

      其中的RGB三个分量的排列顺序是BGR

    .NET中通过数据类型Color表示颜色,该类有一个函数FromArgb(int,int,int),可以通过输入RGB三个值得到一个Color类型的颜色。同时也有一个ToArgb()函数,得到一个32位的整数值,

    32ARGB值的字节顺序为AARRGGBB。由AA表示的最高有效字节(MSB)alpha分量值。分别由RRGGBB表示的第二、第三和第四个字节分别为红色、绿色和蓝色颜色分量 

    ColorCOLORREF

    COLORREFColor

    uint  GetCustomColor(Color color)

    {            

        int nColor = color.ToArgb();      

        int blue = nColor & 255;        

        int green = nColor >> 8 &  255;    

        int red = nColor >> 16 &  255;    

        return Convert.ToUInt32(

    blue << 16 |  green << 8 | red);

    }

    Color  GetArgbColor(int color)        

    {            

        int blue = color & 255;            

        int green = color >> 8 &  255;          

        int red = color >> 16 & 255  ;            

        return Color.FromArgb(blue, green, red);  

    }

    或者直接通过下面的代码:

    Color.FromArgb(nColorRef&255,

    nColorRef>>8&255,nColorRef>>16&255);

    注:(1)注意COLORREF中颜色的排列是BGR,红色分量在最后面;(2)上面的代码使用C#编写。

    最后还有.NET自带的函数:ColorTranslator

    6)异或绘图模式设置的Index

    绘图模式(drawing mode)指前景色的混合方式,它决定新画图的笔和刷的颜色(pbCol)如何与原有图的颜色(scCol)相结合而得到结果像素色(pixel)

    可使用CDC类的成员函数SetROP2 ROP = Raster OPeration光栅操作)来设置绘图模式:

    其中,R2_COPYPEN(覆盖)为缺省绘图模式,R2_XORPEN(异或)较常用。

    CDC::SetROP2

    int SetROP2(int nDrawMode);

    返回值:绘图模式的前一次取值。可以取联机文档“Windows SDK”中提供的任意值。

      数: nDrawMode 指定新的绘制模式,可以为下列值之一:

    绘制模式

    定义说明

    索引值

    R2_BLACK

    像素始终为黑色

    1

    R2_WHITE

    像素始终为白色

    16

    R2_NOP

    像素保持不变

    11

    R2_NOT

    像素为屏幕颜色的反色

    6

    R2_COPYPEN

    像素为笔的颜色

    13

    R2_NOTCOPYPEN

    像素为笔颜色的反色

    4

    R2_MERGEPENNOT

    像素为笔颜色屏幕颜色反色

    14

    R2_MASKPENNOT

    像素为笔颜色屏幕颜色反色

    5

    R2_MERGENOTPEN

    像素为笔颜色反色屏幕颜色

    12

    R2_MASKNOTPEN

    像素为笔颜色反色屏幕颜色

    3

    R2_MERGEPEN

    像素为笔颜色屏幕颜色

    15

    R2_NOTMERGEPEN

    R2_MERGEPEN的反色

    2

    R2_MASKPEN

    像素为笔颜色屏幕颜色

    9

    R2_NOTMASKPEN

    R2_MASKPEN的反色

    8

    R2_XORPEN

    像素为笔颜色异或屏幕颜色。连续异或两次会变为原来颜色

    7

    R2_NOTXORPEN

    R2_XORPEN的反色(同或

    10

    说明:
    设置绘图模式。绘图模式指出笔与被填充对象的颜色是怎样同显示表面的颜色组合的。绘图模式只用于光栅设备,不用于矢量设备。绘图模式是双重的光栅操作代码,代表了两个变量所有可能的布尔组合,分别使用ANDORXOR(异或)和NOT运算符。 

    7)字符串绘制,能否异或?(答曰:不能)

    字符串输出绘制不能采用异或的方式进行擦除更新,那么需要实时的动态位置显示信息的时候如何解决?目前看到三种方案:

    方案一:利用局部更新文字形成的位图方法(参考CSDN论坛,忘了地址)

    如何通过两次绘制的方式从屏幕上擦除文字

    OnDraw
     CDC mem;
     CBitmap memmap;
     mem.CreateCompatibleDC(pDC);
     memmap.CreateCompatibleBitmap(m_pDC,1000,1000);
     CBitmap *memoldmap=mem.SelectObject(&memmap);
     /*
    在这里画你的字,mem```
     */
     pDC->BitBlt(0,0,1000,1000,&mem,0,0,SRCCOPY); 
     mem.SelectObject(memoldmap);
     memmap.DeleteObject();

    重载BOOL CXXXView::OnEraseBkgnd(CDC* pDC) 
    直接return TRUE;

     

    方案二:利用文字的点阵图输出

    在背景上输出和擦除文字

    http://eyinlu.blog.163.com/blog/static/242321612011627921975/

    在背景上输出文字,并且可以不留痕迹的擦除。
    微软提供的 CDC 函数, TextOut  DrawText 不支持界面像素的异或运算操作,所以无法从背景中擦除输出的文字。要达到这种目的,只好使用支持像素的异或运算的图形函数了。
    有两种方式可以选择:
     1
        输出轮廓路径,然后指定画刷填充封闭的路径区域。
     2
        得到文字的点阵图,使用向屏幕花点的方式输出文字。
    下面给出第二种方式的实现代码。
    调用两次下面的函数可以擦除输出的文字,还可以显示按任意角度旋转的文字。
    注意:传入的设备上下文变量 pDC ,其中的 ROP2 属性应该指定为 R2_XORPEN  R2_NOTXORPEN 
    void  CDicfexView :: DrawVectorText ( CDC * pDC , CString & strText , CPoint  pntPosition , int nAngle ) 
     { 
          if ( strText . IsEmpty ()) 
             return ; 
       
          CClientDC dc ( this ); 
       
          // 
    确认要按文本输出的坐标映射模式
          if ( pDC -> GetMapMode () != MM_TEXT ) 
          { 
              // 
    转换到原坐标映射
              dc . SetROP2 ( pDC ->  GetROP2 () ); 
       
              pDC -> LPtoDP ( &  pntPosition ); 
              pDC = & dc ; 
          } 
       
          DWORD dwSize ; 
             
          MAT2 stM2 ; 
          GLYPHMETRICS stGM  ;         
          TEXTMETRIC stTM ; 
       
          // 
    创建字体
         CFont font ; 
          LOGFONT stFont ; 
          memset (& stFont ,0, sizeof ( stFont )); 
          // 
    设置字体结构的属性;
          stFont . lfHeight =12; 
          stFont . lfWeight = FW_NORMAL ; 
          stFont . lfClipPrecision = CLIP_LH_ANGLES ; 
          strcpy (( char *) stFont . lfFaceName ,  "Courier New" ); 
          stFont . lfEscapement =  nAngle * 10; 
          stFont . lfOrientation =  nAngle * 10; 
       
          font . CreateFontIndirect ( & stFont ); 
       
          CFont * pOldFont = pDC -> SelectObject (&  font ); 
         pDC -> SelectObject (& font ); 
          pDC -> GetTextMetrics (& stTM ); 
       
          // 
    坐标变换矩阵 , 但这种转换时 , 由于精度舍入的原因 , 取得的字体点阵的质量很差 , 
          // 
      stFont.lfEscapement 变量赋值 , 似乎微软做过优化 , 取得字体点阵勉强能说的过去 , 
          /*double nEscapement = nAngle * 3.1415926 / 180.0; 
         stM2.eM11 = FloatToFixed(cos(nEscapement)); 
          stM2.eM12 = FloatToFixed(sin(nEscapement)); 
          stM2.eM21 = FloatToFixed(-sin(nEscapement)); 
          stM2.eM22 = FloatToFixed(cos(nEscapement));*/ 
       
          stM2 . eM11 = FloatToFixed (1.0); 
          stM2 . eM12 = FloatToFixed (0.0); 
          stM2 . eM21 = FloatToFixed (0.0); 
          stM2 . eM22 = FloatToFixed (1.0); 
       
          int nChar = 0;  
         int nSx = pntPosition . x ; 
         int nSy = pntPosition . y ; 
       
          int nFontSpace = 0; 
       
          int nCx = 0; 
         int nCy = 0; 
       
         for ( int i = 0; i < strText . GetLength (); i ++) 
         { 
             if ( strText . GetAt ( i ) >=  0) 
                 nChar =  strText . GetAt ( i ); 
             else 
             { 
                    // 
    宽字节
                 int th =  strText . GetAt ( i ); 
                 int tl =  strText . GetAt ( i + 1); 
                 nChar = ((  th & 0x00ff)<<8) + ( tl & 0x00ff); 
                 i ++; 
             } 
        
              // 
    得到字体轮廓信息的尺寸
              dwSize = pDC -> GetGlyphOutline  ( nChar , GGO_BITMAP ,& stGM , 0L , NULL ,& stM2 ); 
              // 
    定义缓冲区
              BYTE * pBuffer = new BYTE [  dwSize ]; 
              memset ( pBuffer , 0, dwSize  ); 
              // 
    取得字体轮廓
              pDC -> GetGlyphOutline (  nChar , GGO_BITMAP , & stGM , dwSize , pBuffer , & stM2 ); 
          
              int nStride = dwSize / stGM  . gmBlackBoxY ; 
       
              // 
    轮廓数据
              OUTLINETEXTMETRIC     stOtm ;  
              memset ( & stOtm , 0,  sizeof ( stOtm ) );  
              stOtm . otmSize = sizeof (  stOtm );  
              pDC ->  GetOutlineTextMetrics ( sizeof ( stOtm ), & stOtm ); 
       
              //x 
    的偏移量
              int nXOffset = stGM .  gmptGlyphOrigin . x ;     
              //y 
    的偏移量     字的顶部         - y 方向原点  都是相对于  baseline  
              int nYOffset = stOtm .  otmAscent - stGM . gmptGlyphOrigin . y ;    
              
              for ( int y =0; y < stGM  . gmBlackBoxY ; ++ y ) 
              { 
                    for ( int x =0; x < nStride ; ++ x ) 
                    { 
                         for ( int k =0; k < 8; ++ k ) 
                         { 
                             if ( ( pBuffer [ y * nStride + x ] >> (7- k ) ) & 1 ) 
                             { 
                                  int nX = nCx + 8 * x + k + nXOffset ; 
                                  int nY = nCy + y + nYOffset ; 
       
                                  pDC -> SetPixel ( nSx + nX , nSy + nY , RGB (255,200,200) ); 
                             } 
                         } 
                    } 
              } 
       
              // 
    设置下一个字符的位置
              nCx += stGM . gmCellIncX ; 
             nCx += nFontSpace ; 
             nCy += stGM . gmCellIncY ; 
       
              delete [] pBuffer ; 
         }   
         pDC -> SelectObject ( pOldFont ); 
     }

    方案三:直接用Label控件显示信息,让Label跟随鼠标移动显示文字内容

    直接修改Label控件LeftTop属性,更新其Text属性内容,然后改变控件位置,实现实时显示。默认情况下,控件不支持透明背景色。在属性框里设置background属性为transparent。同时修改Visible属性进行显示和隐藏。

    2数据管理

    绘图内容数据管理按照数据库方式的拓扑结构进行管理,而单个对象则采用面向对象方式进行存储和管理操作。

    3窗体绘图显示设计

    工具栏主要操作项:

    4绘图打印

    4.1公制与英制单位的换算问题

       利用PageSetupDialog对话框设置纸张的类型、页边距等信息后,再次进入页面设置的对话框,发现里面的页边距全部改变了,再进入又改变了,这是为什么呢?

    其实原因很简单,单位的不同造成了这个现象。我们可以再看看上图中页边距一项明确的注明了单位采用的是毫米,说明在页面设置对话框中使用的是公制长度计量单位,而在.net中采用的是英制的计量单位。英制中长度的基本计量单位是英寸,公制中长度的基本计量单位是厘米,打印时默认的长度单位为 1/100英寸。因此假设我们在页面设置对话框中设置上部边距为10mm(如下左图),.net把它转换成了英制单位,数值是1/2.54 * 100=391/100英寸,(1英寸约等于2.54厘米,1厘米=10毫米)所以,这时上部页边距的数值变成了39,当你再次打开页面设置对话框时,系统将认为上部页边距是391/100厘米,也就是3.9毫米(如下右图),按下确定按钮后,.net将再次对页边距进行转换,这时上部边距就约为15 1/100英寸,这样结果当然与我们设置的相差甚远。

    知道了原因,解决问题就很好办了。其实微软也考虑到了这个问题,提供了一个用于单位转换的类PrinterUnitConvert,如下所示:

    If(System.Globalization.RegionInfo.CurrentRegion.IsMetric) Then

    '如果使用的是公制单位

    '将英制单位的数据转换成公制单位的数据

    psd.PageSettings.Margins= PrinterUnitConvert.Convert (psd.PageSettings.Margins, PrinterUnit.Display,PrinterUnit.TenthsOfAMillimeter)

    EndIf

    pap.DefaultPageSettings= psd.PageSettings

    Margins属性中保存的页面的上(Top)、下(Bottom)、左(Left)、右(Right)的页边距数值,利用 PrinterUnitConvertConvert方法都可以转换,在上例中,PrinterUnit.Display是指1/100英寸的单位, PrinterUnit.TenthsOfAMillimeter是指1/100毫米的单位,这样就可以将英制单位转换为公制单位。

      当然我们也可以自己编写代码进行转换,但请注意,转换时英制的单位是1/100英寸,转换后要以毫米为单位。

    注意:转换时只须对纸张的页边距进行转换,纸张本身的宽度和高度在你选择一种纸张类型的时候,它已经自动帮你转换成英制单位了,千万不要画蛇添足。 以上我们介绍了如何利用PageSetupDialog对话框设置页面、公制与英制单位的换算,已经为打印程序的编写建立了一个良好的基础。接下来,我们就来介绍如何实现具体的特殊打印功能。

    .NET的升级版本也可以一句话就解决问题:

    // 打印页面设置

           publicPageSetupDialogv_PrintPageSetDlg = newPageSetupDialog();

    // 英制单位转换为公制单位

         v_PrintPageSetDlg.EnableMetric = true;

    结果如下:

    但是注意:此时显示的25.4mm,实际上获取Margins属性的时候,仍然是1001/100英寸,因此存在0.254的系数关系。

    4.2绘图单位转换问题

    这里需要统一打印时的度量单位,打印文档的DefaultPageSettings中的参数都是以1/100英寸为单位,而窗口界面绘图中的尺寸获取(widthHeight)是以像素为单位,而中文操作系统中以毫米为单位(如打印设置页面),在打印时如何统一单位是必须要进行的。

    而程序设定的坐标转换是基于世界坐标(单位:m)、逻辑坐标(单位:mm)以及设备坐标(单位:pixel),因此需要将C#提供的英制单位1/100英寸转换为mm,然后最终转换为像素绘图坐标。

    // mmPixel

           publicfloat m_LPtoDP_X(floatv_f_Logicmm_X)

           {

               floatd_X = (float)((v_f_Logicmm_X / 25.4) *v_Graphic.DpiX);

               returnd_X;

           }

    NOTE:在绘图时基于像素的时候,Graphics的绘图单位也必须要设定为Pixel,尤其是打印机事件参数的e.Graphics

    e.Graphics.PageUnit = GraphicsUnit.Pixel;

    获取打印机相关信息后,将1/100英寸转换为像素:

    float f_DeviceMargin_Left =m_LPtoDP_X(v_PrintDocument.DefaultPageSettings.Margins.Left * 0.254f);

    float f_DeviceMargin_Top =m_LPtoDP_Y(v_PrintDocument.DefaultPageSettings.Margins.Top *0.254f);

    4.3关于物理页边距

    相同的打印绘图内容,如果是PDF虚拟打印机,则是严格的根据页面边距打印出来;而物理打印机出现偏差。如前面所阐述的打印坐标系原点,如果设定为true,怎会出现以下问题:

    // 打印文档

           publicPrintDocument v_PrintDocument = newPrintDocument();

    // 边距

           v_PrintDocument.OriginAtMargins = true;

    利用Adobe PDF虚拟打印机打印出来的PDF文档,然后在PDF文档中打印出来的页边距是准确的,标准的默认25.4mm页面边距,如下图所示:

    若选择实际的物理打印机,此时的打印机存在物理边距,错误打印结果如下:

    考虑到物理边距以后,打印事件参数(PrintPageEventArgs e)的绘图区域e.MarginBounds 需要进行向左和向上的偏移处理。

    NOTE:打印机绘图用MarginBounds,而不是直接用PaperSize,那样计算起来很麻烦              

    classPrinterBounds

       {

           [DllImport("gdi32.dll")]

           privatestaticexternInt32 GetDeviceCaps(IntPtrhdc, Int32 capindex); 

           privateconstintPHYSICALOFFSETX = 112;

           privateconstintPHYSICALOFFSETY = 113; 

           publicreadonlyRectangleBounds;

           publicreadonlyintHardMarginLeft;

           publicreadonlyintHardMarginTop; 

           publicPrinterBounds(PrintPageEventArgs e)

           {

               IntPtrhDC = e.Graphics.GetHdc(); 

               HardMarginLeft =GetDeviceCaps(hDC, PHYSICALOFFSETX);

               HardMarginTop = GetDeviceCaps(hDC,PHYSICALOFFSETY); 

               e.Graphics.ReleaseHdc(hDC); 

               HardMarginLeft = (int)(HardMarginLeft * 100.0 / e.Graphics.DpiX);

               HardMarginTop = (int)(HardMarginTop * 100.0 / e.Graphics.DpiY); 

               Bounds = e.MarginBounds; 

              Bounds.Offset(-HardMarginLeft, -HardMarginTop);

           }

       }

    .NET以后的版本中,也可以直接用打印文档类的获取物理边界属性

    DefaultPageSettings.HardMarginX, DefaultPageSettings.HardMarginY

    然后进行打印的时候,就基本不会存在边距相差太大的情况,不过还是存在1点几个毫米的误差

    1)页面边距25.4mm时预览结果:

    打印结果:左图为打印图纸左侧,右图为打印图纸右侧。

    2)边距为0mm时预览,由于计算绘图区域的时候,有物理边界存在,导致得到的绘图区域是经过了Offset向左向上平移的,所以有空白的地方出现在预览图像的右边和下边。

    打印的时候出现物理边界的影响,导致绘图能完整打印出来,如下图所示:

    4.4误差?绘制问题

    // 绘制0边距位置

    Graphics.DrawLine(Pens.Red, 0, 0, m_LPtoDP_X(v_PrintDocument.DefaultPageSettings.PaperSize.Width* 0.254f), 0);

    Graphics.DrawLine(Pens.Blue,  0, 0, 0,m_LPtoDP_Y(v_PrintDocument.DefaultPageSettings.PaperSize.Height * 0.254f));

    Adobe PDF虚拟打印结果如下:在设置页边距为0的时候,可以准确的打印到0位置(如左边距),但是如果存在页边距的情况,打印0位置会出现偏差(如上边距),不知道为什么?


    Solve不是误差,而是打印机绘图原点坐标问题2013/11/24,已解决

    4.5打印结果

    4.5.1页面设置

    测试采用普通的A4纸张,并设置为横向,如下图所示:

    4.5.2打印预览

    查看打印阅览,跟绘图内容是否相同,测试结果一致。


    4.5.3打印成果图

    选用两种打印成果(虚拟打印 + 物理打印),如下图所示:

    1AdobePDF虚拟打印机,无物理边距打印


    2)实际物理打印机HP LaserJet P4515打印机,物理边距 (4.8, 4.1)mm,以前两张图是不同时期打印,图纸上的物理边距线存在打印不完全现象,这就是经常出现的打印不完全现象,可以看出两张图纸的上和顶部边距不同,这是人工装载纸盒的时候,可能存在一定偏差,造成打印不完全等各种现象。但是两张图都保证了页面边距完全的效果,都是有25.4mm的默认边距,实现真正的可打印区域的完全打印功能。




    http://blog.sciencenet.cn/blog-244606-747345.html 
    展开全文
  • 在很多项目中间都需要对web页面进行打印输出,有的是打印表格内容,有的是打印局部文字,这时候可以选择的方案大体有两种。 1.利用组件把报表的内容生成WORD文档或者是Excel文档,导出以后利用Office自带的打印功能...

          在很多项目中间都需要对web页面进行打印输出,有的是打印表格内容,有的是打印局部文字,这时候可以选择的方案大体有两种。

       1.利用组件把报表的内容生成WORD文档或者是Excel文档,导出以后利用Office自带的打印功能进行打印

       2.在网页上利用javascript或者是其他基于javascript和其他语言的组建

    下面详细介绍这两种方法

      1.生成word或者是Excel文档,当要打印的区域内容为文本的时候适合导出为Word文档来处理,当要打印的内容为表格的时候适合导出为Excel文档,在JSP中可以利用Jxl,jacob,POI等组建进行office文档的处理,个人推荐使用POI,这个组件是由apache基金开发维护的,其在开源领域的地位无可置疑。这个组件的使用方法不再详细介绍,再它的帮助文档上面有详细的使用方法和示例代码。可以满足各种基本的开发需要。

    2.采用javascript或者打印组件的方法就更多了,下面简单介绍几种方案并给出其中一个方案的详细代码

       a.用纯javascript代码:

          这种方法就是简单的调用window.open()方法,这中方法的功效等同于用IE的打印功能,将对整个页面所见的内容进行全部的打印,而且会自动打印出页眉页脚。

       b.修改注册项,和其它针对某一种浏览器的解决方案

         这种方法的原理基本上都是进入客户端系统的注册表,把里面的某些IE选项进行修改,例如屏蔽或者是修改页眉页脚等自定义的打印方方案,这种反感的弊端是非常明显的,首先要在网页上修改注册表项需要再客户端降低浏览器的安全性设置,这将给客户的计算机带来很大的风险,而且这些方法都是在注册表中找到浏览器的位置然后进行操作,这就将处理局限为某一种或者是几种浏览器,而且也将客户端的操作系统局限为Windows

      c.第三方的插件

        采用第三方的插件,例如ScriptX,WebPrint等,这也第三方的原理基本上同 b 方案相同,也有的是采用纯javascript代码进行封装,但是采用这种插件就需要客户端在打印的时候安装插件,同样需要降低客户端的安全设置,如果有防火墙或者是杀毒软件的影响将不能起到作用,而且这种方案的运行速度很成问题,加载插件的处理严重影响运行速度,不过这种方案的打印效果倒是非常理想的

      d.折衷方案

        采用WebBrowser和javascript和CSS结合起来

    •     打印指定区域
    •    在页面上显示 打印   打印预览   页面设置  按钮 ,用来对打印进行设置,这样可以去掉页眉页脚
    •    在javascript中采用CSS控制隐藏不想打印的内容

           下面是详细的代码(注:由于利用javascript里面构造新页面,所以构造代码连在一起,否则javascript解释错 误):

         <html>
        <head>
        <script language="javascript">
          function printme()
         {
             var print = this.document.getElementById("print").innerHTML;
             print = print +"<br/>"
         print = print +'<SCRIPT language=javascript> function printView(){hidden();document.all.WebBrowser.ExecWB(7,1); } function print(){hidden();document.all.WebBrowser.ExecWB(6,6)}function pageSetup(){hidden();document.all.WebBrowser.ExecWB(8,1);}function hidden(){document.all("printView").style.display="none"; document.all("print").style.display="none";  document.all("pageSetup").style.display="none";}<//script>';
            print = print + "<OBJECT   classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2   height=21   id=WebBrowser   width=87></OBJECT> <input  id=printView name=Button   onClick=printView()   type=button   value=打印预览> <input  id = print name=Button   onClick=print()   type=button   value=直接打印>   <input  id = pageSetup name=Button   onClick= pageSetup()  type=button   value=页面设置>";
            var newWindow = window.open();
            newWindow.document.open("text/html");  
            newWindow.document.write(print);  
            newWindow.document.close();    
       } 
    </script>

      </head>
      <body>
        <span id='print'>把要打印的内容放这里</span>
     <p>所有内容</p>
     <a href="javascript:printme()" target="_self">打印</a>
       
      </body>
    </html>

         代码解释: 把要打印的内容放在 id为print 的区域内在  printme函数中把 要输出的内容放入一个新的也页面,在新页面里面进行打印的处理,在新页面里面用WebBrowser对象进行打印的处理,用css控制隐藏不想打印的内容。

          

    展开全文
  • web打印实现种方法

    万次阅读 热门讨论 2014-11-30 12:42:22
    在工作中出现web打印的情况是非常多的,其实这也是一比较烦人的问题,这篇博客整理一下关于Web打印的一些方法...所以如果使用这种方法的话最好将结果放到两注释中间,之后通过JS来实现打印区域的功能。具体做法:
  • web打印种方案

    万次阅读 2017-10-27 11:21:35
    -------------------------------------------一 基于Web的打印方案比较分析--------------------------------  基于web的套打,难度在于要将浏览器中呈现的html,精确地打印到票据中,而且能够实现对分页位置...
  • 说说性能测试的几个概念

    千次阅读 2019-04-27 12:21:03
    性能测试数据收集中很重要的一部分是被测系统的资源使用情况,因为系统性能和资源使用是密切相关的,主要的目的有下面几个方面: 了解在当前压力下,系统各项资源的使用情况,也可以用于横向对比。 通过资源使用情况...
  • 本例为打印网页上的一表格 window.print()打印的是整个网页的HTML内容,不包括CSS @media print{ ... }可以设置打印时样式 正文 网页效果: 目标:右键点击打印按钮时能打印表格,忽略下方的文字和图片,...
  • WEB打印种方案

    万次阅读 2016-07-29 10:34:10
    -------------------------------------------一 基于Web的打印方案比较分析--------------------------------  基于web的套打,难度在于要将浏览器中呈现的html,精确地打印到票据中,而且能够实现对分页位置...
  • 了这样几个东西:Paint.Style,Paint.Cap,Paint.Join等,这些都是Paint中的一些枚举值,相关 方法我们可以通过设置这些枚举值来设置特定效果比如:Style:画笔样式,Join图形结合方式等, 本节我们走进Paint的...
  • JVM 堆栈区域数据存放流程

    千次阅读 2015-11-18 11:10:35
    一、堆、栈、方法区数据...其它的数据区域与每线程相关。这些数据区域,在线程创建时创建,在线程退出时销毁。JVM 由3部分组成:栈区---------------------------------基础数据类型 byte short int long float do
  • 分享几个实用的破解软件

    千次阅读 2018-03-21 20:24:48
    在这主要分享几个实用的绿色软件,便大家更好的学习生活。1 迅雷极速版 迅雷极速版可算得上是迅雷历代最经典的版本,支持关闭上传,边下边播支持自定义播放器,全面兼容Win10操作系统。此迅雷极速版绿色纯净版,去...
  • C# 报表系统打印几种方法

    千次阅读 2014-09-20 16:26:51
    你写上什么,它就打印什么..有一很重要的"动作"要注意. 就是在什么时候"写上"东东呢..这要写的"时间"就是用printpage事件..  printpage事件,表示当要在printdocument写东东时,会触发该事件..然后你可以在...
  • 书中给了几个例子,比较好的说明了几种OOM(OutOfMemory)产生的过程,大部分的程序员在写程序时不会太关注Java运行时数据区域的结构:感觉有必要通过几个实在的例子来加深对这几个区域的了解1)Java堆所有对象的...
  • 关于Unity粒子系统碰撞的几个

    千次阅读 2019-03-23 12:45:14
    关于Unity粒子系统碰撞的几个坑 最近公司的项目正好要用到粒子系统的碰撞,所以特意研究了一下。在实践中遇到了很多问题,所以借此文记录一下学习的过程。而且学习过程中发现网上这方面文章极少,所以也算借这篇文章...
  • 对于Java开发人员来讲,在虚拟机自动内存管理机制的帮助下,不需要每一new操作去写配对的delete/free代码, 不容易出现内存泄露和内存溢出的问题。 正是因为JVM管理内存控制的权利,一旦出现内存泄露和内存溢出...
  • 编写VB打印控制程序的点心得

    万次阅读 2007-08-11 12:50:00
    一般在对打印质量要求不高的场合,或者是编程项目的早期开发过程中,可以直接使用VB窗体的Printform方法实现打印。用这种方法实现打印具有编程简单、易用并且功能强大的优点,它只需要通过一行代码,几乎能打印所有...
  • vue 打印(分页打印

    万次阅读 热门讨论 2019-05-13 13:57:36
    最近项目中碰到一需求,需要前端预览打印当前页面的内容,但是在打印的时候需要分页打印,想了很多办法,最后解决,在这做一分享。 首先是打印,网上有很多方法,这里面我用的是一插件 vue-print-nb --save,...
  • java六大存储区域

    千次阅读 多人点赞 2018-06-18 17:11:28
    java六大存储区域 参考资料:https://blog.csdn.net/qq_28009065/article/details/79087831 存储速度: 寄存器(register) 这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的...
  • Java内存区域怎么划分的?

    万次阅读 2020-09-18 15:12:57
    运行时数据区域包含以下五个区域:程序计数器,Java虚拟机栈,本地方法栈,堆,方法区(其中前三个区域各线程私有,相互独立,后面两个区域所有线程共享) 线程私用的部分(Java虚拟机栈,本地方法栈,程序计数器) ...
  • 点云分割 博文末尾支持二维码赞赏哦_ 点云分割是根据空间,几何和纹理等特征对点云进行划分, 使得同一划分内的点云拥有相似的特征,...点云的分割与分类也算是一大Topic了,这里因为多了一维就和二维图像比...
  • 比如,为了提高准确性,我们在进行正样本的训练时,必须把正样本置于整个正样本的大部分中,以交通标志中的禁止驶入例,如下图的就是正确的正样本之一: 我们可以看到,禁止驶入交通标志占了图片面积的大部分。这...
  • 参数:labels:Type: Array,设置默认标签区域提示语,可设置["年", "月", "日", "时", ""]这五字段,可以根据视图模式选择设置个别标签,也可以设置所有标签,dtpicker显示的时候只会根据当前视图显示设置项,*建议...
  • 给一不多于5位的正整数,要求:1)求它是位数,2)逆序打印出各位数字。关于这问题比较简洁的写法 代码如下: package com.oracle.lianxi4; import java.util.Scanner; public class Test6 { public static ...
  • 到这阶段,我们用C的结构编译的代码以及源码能看到Block结构体内部的isa指针是指向_NSContreteStackBlock 的,其实这只是其中的一种,分别还有_NSContreteGlobalBlock 和 _NSContreteMallocBlock,可以根据命名的...
  • smartbi学习记四之几个简单的设置

    千次阅读 2017-11-01 16:52:34
    5、color 绘图的几个主色系 九、套用表格样式后取消,在设计-转换为区域。 十、冻结窗格,在视图-冻结窗格 十一、获取当前年 Year(Now())&"年" 显示2017年 Year(Now())-1&"年" 显示2016  ...
  • JVM内存区域详解

    千次阅读 2016-11-30 14:22:50
    因此每线程有要有一独立的程序计数器,记录下一条要运行的指令。线程私有的内存区域。如果执行的是JAVA方法,计数器记录正在执行的java字节码地址,如果执行的是native方法,则计数器空。 虚拟机栈 线程私有的...
  • 内存区域的划分

    千次阅读 2017-08-12 16:38:48
    1. 在c中分为这几个存储区:堆、栈、全局区(静态区)、常量区 (1).栈 - 由编译器自动分配释放。 栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明...
  • 分享一下小经验 首先需要下载PDF Factory Pro 原文地址: https://www.newasp.net/soft/327974.html CAD2014版本链接:...提取码:tt50 PDFFactoryPro 是一款无须 Acrobat 创建 Adobe pdf 文件的打印...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 104,563
精华内容 41,825
关键字:

为什么打印区域分几个