请问怎样设置打印的纸张方向,不要用预设的那种方法。

蓋茨 2009-03-22 02:49:25
我使用了微软知识库的在NT系统下定义页面大小的代码,但里面没有写到关于如何设置纸张方向

其中核心代码如下:

Public Function SelectForm(FormName As String, ByVal MyhWnd As Long) _
As Integer
Dim nSize As Long ' Size of DEVMODE
Dim pDevMode As DEVMODE
Dim PrinterHandle As Long ' Handle to printer
Dim hPrtDC As Long ' Handle to Printer DC
Dim PrinterName As String
Dim aDevMode() As Byte ' Working DEVMODE
Dim FormSize As SIZEL

PrinterName = Printer.DeviceName ' Current printer
hPrtDC = Printer.hdc ' hDC for current Printer
SelectForm = FORM_NOT_SELECTED ' Set for failure unless reset in code.

' Get a handle to the printer.
If OpenPrinter(PrinterName, PrinterHandle, 0&) Then
' Retrieve the size of the DEVMODE.
nSize = DocumentProperties(MyhWnd, PrinterHandle, PrinterName, 0&, _
0&, 0&)
' Reserve memory for the actual size of the DEVMODE.
ReDim aDevMode(1 To nSize)

' Fill the DEVMODE from the printer.
nSize = DocumentProperties(MyhWnd, PrinterHandle, PrinterName, _
aDevMode(1), 0&, DM_OUT_BUFFER)
' Copy the Public (predefined) portion of the DEVMODE.
Call CopyMemory(pDevMode, aDevMode(1), Len(pDevMode))

' If FormName is "MyCustomForm", we must make sure it exists
' before using it. Otherwise, it came from our EnumForms list,
' and we do not need to check first. Note that we could have
' passed in a Flag instead of checking for a literal name.
If FormName = "MyCustomForm" Then
' Use form "MyCustomForm", adding it if necessary.
' Set the desired size of the form needed.
With FormSize ' Given in thousandths of millimeters
.cx = 214000 ' width
.cy = 216000 ' height
End With
If GetFormName(PrinterHandle, FormSize, FormName) = 0 Then
' Form not found - Either of the next 2 lines will work.
'FormName = AddNewForm(PrinterHandle, FormSize, "MyCustomForm")
AddNewForm PrinterHandle, FormSize, "MyCustomForm"
If GetFormName(PrinterHandle, FormSize, FormName) = 0 Then
ClosePrinter (PrinterHandle)
SelectForm = FORM_NOT_SELECTED ' Selection Failed!
Exit Function
Else
SelectForm = FORM_ADDED ' Form Added, Selection succeeded!
End If
End If
End If

' Change the appropriate member in the DevMode.
' In this case, you want to change the form name.
pDevMode.dmFormName = FormName & Chr(0) ' Must be NULL terminated!

pDevMode.dmOrientation = 2

' Set the dmFields bit flag to indicate what you are changing.
pDevMode.dmFields = DM_FORMNAME

' Copy your changes back, then update DEVMODE.
Call CopyMemory(aDevMode(1), pDevMode, Len(pDevMode))
nSize = DocumentProperties(MyhWnd, PrinterHandle, PrinterName, _
aDevMode(1), aDevMode(1), DM_IN_BUFFER Or DM_OUT_BUFFER)

nSize = ResetDC(hPrtDC, aDevMode(1)) ' Reset the DEVMODE for the DC.

' Close the handle when you are finished with it.
ClosePrinter (PrinterHandle)
' Selection Succeeded! But was Form Added?
If SelectForm <> FORM_ADDED Then SelectForm = FORM_SELECTED
Else
SelectForm = FORM_NOT_SELECTED ' Selection Failed!
End If
End Function


其中红色字是我加上去的,我想这样来定义纸张的方向为横向,虽然通过设置断点知道pDevMode.dmOrientation是返回2,但在打印时返回的是1,即纵向而不是横向。

请问该加些什么令方向生效?我不想要网上另外的一种关于预设的那种方法,即dmOrientation = eOrientation 的那种,有一个好的现成无谓再加那么多代码上去,会变得很复杂很累赘的,所以如果非真的要用那种方法不行的话,请教怎么修改上面的代码令其能打印出横向纸呢?谢谢
...全文
429 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
蓋茨 2009-04-06
  • 打赏
  • 举报
回复
算了,反正问题基本解决了,结帖去...
蓋茨 2009-04-03
  • 打赏
  • 举报
回复
不好意思,那晚有点事一过忘记了这里...

to LS的:那就奇怪了,为什么那么多人都为XP系统下的打印问题头痛,而且微软还特意出了篇相关打印的解决方案代码~...

请问LS的VB6是SP多少?
熊孩子开学喽 2009-03-27
  • 打赏
  • 举报
回复
我的程序并不改变系统对打印机的任何默认设置,我只是把程序的打印偏好用自己的配置文件保存起来,下一次启动的时候自动加载而已.
2000 server和XP下都可以通过.
熊孩子开学喽 2009-03-27
  • 打赏
  • 举报
回复
我的代码就是在XP下运行的.
qzw405 2009-03-27
  • 打赏
  • 举报
回复
帮你顶!
蓋茨 2009-03-27
  • 打赏
  • 举报
回复
啊~耽误时间太久不能再等下去了,不知道为什么李洪根专家不进来看一下,他在这方面的研究颇深的,自己还写过代码。
这个方法不能只能想其他方法解决了,把要打印的内容旋转一下就可以了,这样应该没有问题吧,呵呵~

明晚结帖。
蓋茨 2009-03-26
  • 打赏
  • 举报
回复
不行哦~一切按默认的...
请问你有没有试过在XP下试过?你用的2000系统是SP多少?
熊孩子开学喽 2009-03-25
  • 打赏
  • 举报
回复
我的程序会生成一个配置文件,在程序运行的时候自动加载.
其中可以包括用户的一些偏好选项,一些常用设定,也包括打印设置.
上面的程序中已经列出了所有打印机和支持的纸张类型.只要把用户选择的打印机名字和纸张记录下来就可以.
我使用了以下的结构来记录一些我的程序中用到的打印设置相关的信息
Type PrintSetting
XO As Single
YO As Single
XRatio As Single
YRatio As Single
Orientation As Long
ScaleMode As Long
FontSize As Long
PaperSize As Long
PrintName As String * 100
End Type
自定义数据结构是可以直接读写到文件的,这个我就跳过.
每次程序加载后把上次程序关闭时保存的信息再读回上述结构中,然后再设定打印机:
Private Sub InitPrint()
Dim Ptr As Printer
For Each Ptr In Printers
If Ptr.DeviceName = Trim(PrintSettings.PrintName) Then
Set Printer = Ptr
Exit For
End If
Next

Printer.Orientation = PrintSettings.Orientation
Printer.ScaleMode = PrintSettings.ScaleMode '=6 设定单位为毫米
Printer.PaperSize = PrintSettings.PaperSize
Printer.FontSize = PrintSettings.FontSize
End Sub
蓋茨 2009-03-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 WallesCai 的回复:]
在打印之前设置Printer.Orientation就可以了
[/Quote]

NT系统不可以直接这样吧~
反正也试过了,不行的,反而连之前的设置也弄乱了...
蓋茨 2009-03-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 WallesCai 的回复:]
NT的话确实没有测试过,不过2000是可以的.
话又说回来,你不会是用的NT4.0作打印服务器吧?
如果服务器硬件性能还可以的话,2000server还是不错的.
对于2003我没有好感,觉得比较罗嗦,性能也不及2000server
[/Quote]

我意思是NT内核的系统,哈哈~2000、XP等都算了

请问你是怎样实现的?是不是基于上面那段代码加的?如果是请指点一下在哪个位置加?谢谢
熊孩子开学喽 2009-03-24
  • 打赏
  • 举报
回复
在打印之前设置Printer.Orientation就可以了
熊孩子开学喽 2009-03-24
  • 打赏
  • 举报
回复
NT的话确实没有测试过,不过2000是可以的.
话又说回来,你不会是用的NT4.0作打印服务器吧?
如果服务器硬件性能还可以的话,2000server还是不错的.
对于2003我没有好感,觉得比较罗嗦,性能也不及2000server
lmhcs 2009-03-23
  • 打赏
  • 举报
回复
帮顶一下,你也在研究vb打印阿?同样命苦哦,最近我也在搞这个,不过我要设置的默认纸张。前一段子都成功了,后来不知道哪里被改了,就再没有成功过。郁闷阿郁闷
蓋茨 2009-03-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhufenghappy 的回复:]
你的打印机没连接好,导致设置dmOrientation 出错,设置好就可以了。
[/Quote]

我是用Microsoft XPS Document Writer来打印的啊~难道Microsoft XPS Document Writer不支持横向打印?
zhufenghappy 2009-03-23
  • 打赏
  • 举报
回复
你的打印机没连接好,导致设置dmOrientation 出错,设置好就可以了。
蓋茨 2009-03-22
  • 打赏
  • 举报
回复
上面的红色字给代码格式格式化了,就是那段pDevMode.dmOrientation = 2
使用说明: ¨ 图框:图框的判断方式 e 理正图框:判断依据————在图层PUB_TITLE中的4个顶点的零宽度闭合多义线,程序就认为是理正的图框。如果是用户自定的PLINE图框,也可以把它们移到PUB_TITLE层中让程序自动选择过滤。 e 图块:这种情况,图框是图块。程序根据用户提供的数据判定。 ¨ 图块:图框为图块时的判断设置。可以从下列表中指定一个图块名告诉程序图框的图块名,或者用“拾取”按钮从图中点取一个图块样本指定图框。 ¨ 输出方式:提供了3种输出方式。 e 直接 批量打印,即以当前设置输出到打印机 e 批量生成布局。根据所选的图框生成布局,以后就无需模型空间批量打印程序了。可以使用标准的PLOT命令,打印所选择的布局。 e 生成PLT文件。根据设定生成。 e 打印已有布局。 以显示的标签顺序打印全部或选择的布局。这个命令比AutoCAD2005的Publish命令节省内存。有时在Publish命令无法正常工作时可以作为部分功能的替代。 ¨ 选择批量打印图纸:这是最主要的一步。从图中选择图框,自动过滤非图框物体。当没有任何图纸选中时,预览与确定两个按钮是灰显不可用的。命令启动时自动记忆上次批量打印选择的图框。 ¨ 亮显: 在图中以红色虚线框加叉表示当前选中的图纸。 ¨ 打印设置:使用AutoCAD的页面设置命令对当前打印机、当前纸张大小、当前打印样式表进行设定。最后请点击“确定”或“OK”回到主对话框。无需设定窗选范围,居中打印打印比例、旋转等等,因为本程序会根据选中的各个图纸的不同情况自动设定。 e 预设配置:用户可以从列表中选择一个预设配置。添加/删除/编辑预设配置列表在“打印设置..”对话框页面设置栏中点“添加(Add)”修改。 e 份数:打印份数会自动记忆上次的打印份数,因此打印前请小心设置,确认份数,以免多印。   ¨ 打印比例: e 自动比例:图纸大小与图框外轮廊线匹配,并对比例自动取整(一般建筑中用的整数比例),即允许图框有点误差,如果计算出比例为1:199.6之类的数值,自动取为1:200 e 适合图纸:图纸可打印区域与图框外轮廊线匹配,这样可以打印出外轮廓线。相当于AutoCAD标准比例中的"Scale To Fit" e 固定比例:对所有选中的图纸使用指定的固定比例。需用户手动输入比例值。 ¨ 图纸定位: e 自动旋转:打印时自动 根据图框形状与纸张决定是否旋转90度打印。 e 自动 居中打印打印时自动居中打印。 e 偏移:同AutoCAD标准Plot命令。需手动输入X, Y方向的偏移数值。 ¨ 打印顺序: e 按选择顺序:打印时按照在屏幕上选择图框时的顺序打印。 e 左→右,上→下:按先左右后上下的顺序打印。 e 上→下,左→右:按先上下后左右的顺序打印。 e 逆序:按前面设定的顺序的反向顺序打印。 ¨ 打印文件:生成PLT文件时的设置。 e 文件名前缀:批量生成打印文件时文件名前缀,后面程序自动编号。如,文件名前缀为"BP_", 生成的PLT文件则依次为: "BP_01.plt", "BP_02.plt", ...默认是当前的DWG文件名加"_" e 删除已有同前缀名的PLT文件。生成PLT文件前把目标目录的同前缀名的PLT文件删除。 e 保存位置:PLT保存的位置。默认为当前DWG文件位置。 ¨ 布局设置:批量生成布局时的设置 e 布局名前缀:批量生成布局时布局名称前缀,后面程序自动编号。如,前缀为"BP_", 生成的布局名则依次为: "BP_01", "BP_02", ...默认是"BP_" e 删除已有同前缀名的布局。生成布局前把当前文件中同缀名的布局删除。 e 在布局中强制使用图纸空间的线型比例。这一项选中后,在生成的布局中打印也将使用模型空间的显示线型比例。 ¨ 预览:依次预览各图 ¨ 确定:开始批量打印/生成布局/生成PLT文件 ¨ 取消:退出。 ¨ 帮助:显示本文。
2013-01-21 - 版本0.3.1.0 修复错误 ============ *有些文档错误已被删除 更改的函数 ================= * _XLChart_FillSet:增加了新的可选参数: $ sBitmap:图片的完整路径或预设的质感用来填充对象的背景 $ bTextureTile:如果真集图片或预设的质地由$ sBitmap瓷砖定义 其他事项 ============= *变量的命名现在坚持更加AutoIt的UDF标准 ------------------------------------------------------------------------------------------------------------------------------- 2012-04-29 - 版本0.3.0.0 - 下载次数:652 一般 ======= *在很多功能增强的文档 修复错误 ============ * _XLChart_ChartCreate:该图图表现在被设置在函数的末尾,以避免一些错误 * _XLChart_ChartExport:如果没有指定FILTERNAME返回一个错误 更改的函数 ================= * _XLChart_ChartSet:新的参数: $ iXLC_PlotBy - 指定对应于特定数据系列的值是否为行或列 $ bXLC_RoundedCorners - 如果设置为True,则图表将具有圆角 新功能 ============= * _XLChart_LineGet:返回一个行的性质(轴线,网格线,数据线...) 其他事项 ============= *变量的命名现在坚持更加AutoIt的UDF标准 ------------------------------------------------------------------------------------------------------------------------------- 2012-02-16 - 版本0.2.2.0 - 下载次数:212 一般 ======= *在很多功能增强的错误检查 *在很多功能增强的文档 新功能 ============= * _XLChart_MarkerSet:为折线图,散点图或雷达图中标记的对象设置属性 ------------------------------------------------------------------------------------------------------------------------------- 2012-02-12 - 版本0.2.1.0 - 内部版本(不公开) 新功能 ============= * _XLChart_BarGroupSet:设置条形图组的特性 * _XLChart_BubbleGroupSet:设置气泡图组性能 * _XLChart_ChartDataSet:设置现有图表或chartsheet的所有数据相关属性 * _XLChart_ColumnGroupSet:设置一个柱形图组的特性 更改的函数 ================= * _XLChart_Create:$ iXLC_PlotBy删除。将是_XLChart_ChartSet参数后 ------------------------------------------------------------------------------------------------------------------------------- 2012-02-10 - 版本0.2.0.0 - 内部版本(不公开) 修复错误 ============ * _XLChart_AxisSet:未进行处理设置为“自动”正确的参数 * _XLChart_TicksSet:未进行处理设置为“自动”正确的参数 新功能 ============= * _XLChart_AreaGroupSet:设置一个面积图组的特性 * _XLChart_DoughnutGroupSet:设置圆环图组性能 * _XLChart_ErrorBarSet:添加或数据系列设置误差线性质 * _XLChart_LineGroupSet:设置折线图组的特性 * _XLChart_ObjectPositionSet:调整大小和图表上重新定位一个对象(绘图区,传奇...) * _XLChart_OfPieGroupSet:设置饼图或饼图组棒的馅饼特性 * _XLChart_PieGroupSet:设置饼图或三维饼图组的特性 * _XLChart_ShadowSet:设置阴影的性质 更改的函数 ================= * _XLChart_DatalabelSet:增加了两个新的参数: $ iXLC_Position设置数据标签的位置。可以是任何XlDataLabelPosition枚举 $ iXLC_Orientation设置文本的方向。可以是一个值从-90到90度 * _XLChart_ChartPositionSet:您现在可以将图表移动到另一个Excel工作表或创建一个新的chartsheet(参数$ vXLC_Sheet) * _XLChart_COMError:现在返回@ AutoItVersion,@ AutoItX64,@编译,@ OSArch和@ OSVERSION,方便调试 * _XLChart_RGB:修改,使它能够正常使用的AutoIt 3.3.8.0(变函数十六进制的行为) ------------------------------------------------------------------------------------------------------------------------------- 2012-01-22 - 版本0.1.0.0 - 下载次数:128 一般 ======= *经过几个版本的α测试版第一。该UDF现在应该是相当稳定的(在未来很少脚本重大更改) *在很多功能增强的错误检查 *在很多功能增强的文档 *增强示例脚本 新功能 ============= * _XLChart_ChartsGet:列举在工作簿中的图表和图表工作表 * _XLChart_ObjectDelete:删除从图表对象 * _XLChart_TrendlineSet:添加一个新的趋势线或数据系列的现有趋势线的设置属性 更改的函数 ================= * _XLChart_ChartSet:现在,您可以设置图表的类型 * _XLChart_SeriesAdd:现在返回添加的数据系列的对象。 1是在旧版本 REMOVED功能 ================= * _XLChart_SeriesDelete:使用功能XLChart_ObjectDelete删除数据系列 ------------------------------------------------------------------------------------------------------------------------------- 2011-12-23 - 版本0.0.8.1 - 下载次数:129 修复错误 ============ * _XLChart_RGB:地方被换成了全球 新功能 ============= * _XLChart_ChartPositionSet:调整大小和重新定位一个图表对象 * _XLChart_SeriesAdd:添加一个数据系列的图表 * _XLChart_SeriesDelete:删除一个数据系列从图表 更改的函数 ================= * _XLChart_ChartDelete:图表现在可以通过名字被删除 * _XLChart_ChartExport:参数$ bXLC_Overwrite允许覆盖现有输出文件 * _XLChart_FillSet:参数$ bXLC_ThemeColor插入。如果为True指定的颜色是使用themeColor不是RGB或者ColorIndex * _XLChart_FontSet:参数$ bXLC_ThemeColor插入。如果为True指定的颜色是使用themeColor不是RGB或者ColorIndex * _XLChart_LineSet:参数$ bXLC_ThemeColor插入。如果为True指定的颜色是使用themeColor不是RGB或者ColorIndex * _XLChart_SeriesSet:允许设置一个数据系列作为次要轴组的成员 重命名的函数 ================= * _XLChart_3D_Position到_XLChart_3D_PositionSet:设置图表的三维位置 ------------------------------------------------------------------------------------------------------------------------------- 2011-12-12 - 版本0.0.7 - 下载次数:78 首次出版阿尔法。 更改的函数 ================= * _XLChart_ChartExport:参数$ bXLC_Overwrite允许覆盖现有输出文件 ------------------------------------------------------------------------------------------------------------------------------- 2011-12-11 - 版本0.0.6 - 内部版本(不公开) 一般 ======= *所有的功能处理的RGB颜色,ColorIndex和SchemeColor以同样的方式。每一个函数返回相同的颜色 更改的函数 ================= * _XLChart_3D_Position:新增参数$ iXLC_HeightPercent和$ iXLC_GapDepth * _XLChart_SeriesSet:参数$ iXLC_ChartType和$ bXLC_Smooth添加 新功能 ============= * _XLChart_ChartExport:导出图表中的图形格式(GIF,JPG,PNG ...),或者为PDF / XPS * _XLChart_ChartPrint:打印图表或图表工作表 * _XLChart_ChartSet:为图表设置属性 重命名的函数 ================= * _XLChart_Print到_XLChart_ChartPrint ------------------------------------------------------------------------------------------------------------------------------- 2011-12-05 - 版本0.0.5 - 内部版本(不公开) 更改的函数 ================= * _XLChart_FillSet:使用_XLChart_RGB正确的RGB值 * _XLChart_FontSet:使用_XLChart_RGB正确的RGB值 * _XLChart_LegendSet:-1表示不显示图例 * _XLChart_LineSet:删除$ xlSheetVeryHidden因为这是行不通的。 使用_XLChart_RGB正确的RGB值 * _XLChart_PageSet:添加$ iXLC_TopMargin,$ iXLC_BottomMargin,$ iXLC_LeftMargin,$ iXLC_RightMargin和$ iXLC_BlackAndWhite参数 * _XLChart_TicksSet:添加$ iXLC_LabelPosition和$ vXLC_LabelSpacing参数 * _XLChart_TitleSet:删除不必要的参数并重新排序,其余参数 新功能 ============= * _XLChart_DatalabelSet:对于一个数据系列的数据标签的属性设置 * _XLChart_SeriesSet:一个数据系列设置属性(虚拟函数) * _XLChart_RGB:(内部函数)转换RGB值的格式,Excel的需求 ------------------------------------------------------------------------------------------------------------------------------- 2011-12-03 - 版本0.0.4 - 内部版本(不公开) 更改的函数 ================= * _XLChart_LineSet:现在首先应用的颜色 ------------------------------------------------------------------------------------------------------------------------------- 2011-12-03 - 版本0.0.3 - 内部版本(不公开) 更改的函数 ================= * _XLChart_ScreenUpdateSet:参数1从布尔变为整数。现在,让3个值:禁用,启用,禁用强制 * _XLChart_TicksSet:网格线搬到_XLChart_GridSet。现在允许设置标签位置和标签间距 新功能 ============= * _XLChart_FillSet:设置填充为指定对象属性 * _XLChart_GridSet:设置图表的网格线 * _XLChart_PageSet:设置图表或图表工作表的页面设置属性(纸张大小,方向,页边距等) * _XLChart_Print:打印图表或图表工作表 重命名的函数 ================= * _XLChart_UpdateSet到_XLChart_ScreenUpdateSet ------------------------------------------------------------------------------------------------------------------------------- 2011-11-26 - 版本0.0.2 - 内部版本(不公开) 更改的函数 ================= *示例脚本:检查Excel版本,并显示一条消息,如果设置帧的传说 * _XLChart_LineSet:参数$ bXLC_Visible设置为True为默认 * _XLChart_Example:检查Excel版本,并返回一个错误,如果设置图形的三维位置 * _XLChart_ChartDelete:删除一个图表。因此改写图表工作表可以一并删除。现在只有一个参数 * _XLChart_UpdateSet:打开屏幕更新/关闭以提高性能 * _XLChart_Version:返回安装的Excel版本的版本号或文本

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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