水晶报表用API自定义纸张,大家帮我看看怎么不对

wozuihaole 2013-08-24 06:30:38
code=csharp][StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
internal struct structSize
{
public Int32 width;
public Int32 height;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
internal struct structRect
{
public Int32 left;
public Int32 top;
public Int32 right;
public Int32 bottom;
}

[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Unicode)]
internal struct FormInfol
{
[FieldOffset(0), MarshalAs(UnmanagedType.I4)]
public uint Flags;
[FieldOffset(4), MarshalAs(UnmanagedType.LPWStr)]
public string pName;
[FieldOffset(8)]
public structSize Size;
[FieldOffset(16)]
public structRect ImageableArea;
};

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
internal struct structPrinterDefaults
{
[MarshalAs(UnmanagedType.LPWStr)]
public String pDatatype;
public IntPtr pDevMode;
[MarshalAs(UnmanagedType.I4)]
public int DesiredAccess;
};
[DllImport("winspool.Drv", EntryPoint = "OpenPrinter", SetLastError = true, CharSet = CharSet.Unicode)]
internal static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPWStr)]
string printerName,
out IntPtr phPrinter,
ref structPrinterDefaults pd);

[DllImport("winspool.Drv", EntryPoint = "DeleteForm", SetLastError = true, CharSet = CharSet.Unicode)]
internal static extern bool DeleteForm(IntPtr phPrinter, [MarshalAs(UnmanagedType.LPWStr)] string pName);

public void AddCustomPaperSize(string PrinterName, string PaperName, double WidthInMm, double HeightInMm)
{
const int PRINTER_ACCESS_USE = 0x00000008;
const int PRINTER_ACCESS_ADMINISTER = 0x00000004;
structPrinterDefaults defaults = new structPrinterDefaults();
defaults.pDatatype = null;
defaults.pDevMode = IntPtr.Zero;
defaults.DesiredAccess = PRINTER_ACCESS_ADMINISTER | PRINTER_ACCESS_USE;
IntPtr hPrinter = IntPtr.Zero;
if (OpenPrinter(PrinterName, out hPrinter, ref defaults))
{
DeleteForm(hPrinter,PaperName);
FormInfol forminfo = new FormInfol();
forminfo.Flags = 258;
forminfo.pName = PaperName;
forminfo.Size.width = (int)(WidthInMm * 1000.0);
forminfo.Size.height = (int)(HeightInMm * 1000.0);
forminfo.ImageableArea.left = 0;
forminfo.ImageableArea.right = forminfo.Size.width;
forminfo.ImageableArea.top = 0;
forminfo.ImageableArea.bottom = forminfo.Size.height;
}
}[[/code]
然后AddCustomPaperSize("打印机名","纸张名",8,5)这么调用有问题么??为什么每次预览纸的大小倒是改了,不过不是我指定的大小啊,要大很多,完全不对,求指点,分有点少,不过要是解决了,可以另开贴再给
...全文
270 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yj01263431 2015-05-08
  • 打赏
  • 举报
回复
引用 3 楼 wozuihaole 的回复:
解决了,来人接分啦!!
楼主用的是什么系统啊,上面的API我试过了,报错呢 未能从程序集“ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中加载类型“FormInfol”,因为它在 0 偏移位置处包含一个对象字段,该字段已由一个非对象字段不正确地对齐或重叠。 什么原因呢,我的是WIN7的系统
yj01263431 2015-05-08
  • 打赏
  • 举报
回复
楼主是怎么解决的,能分享下吗
wozuihaole 2013-08-28
  • 打赏
  • 举报
回复
解决了,来人接分啦!!
wozuihaole 2013-08-25
  • 打赏
  • 举报
回复
别沉啊,大神们帮帮忙啊

4,816

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 图表区
社区管理员
  • 图表区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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