====求一个打印方案,愿以1000元现金答谢,一定报酬!!!====

alj 2004-08-30 11:32:58
需求如下,使用VB6新建一个工程,在默认的Form1上:
1)放置一个CommandButton控件
2)放置一个PictureBox控件,默认名称为Picture1,在Picture1里面在放置一个PictureBox控件,默认名称为Picture2控件,在Picture2里面放置一个RichTextBox和一个OLE控件,默认名称分别为RichTextBox1和Ole1
3)在窗体上放置一个水平滚动条和一个垂直滚动条,默认名称为VScroll1和HScroll1
4)进入代码视图,插入如下代码:

Private Sub Command1_Click()
Dim str As String
str = "这里需要实现打印PictureBox2上面所有元素的程序..."
str = str & vbCrLf & vbCrLf & "请你帮忙!!"
MsgBox str, vbInformation, "谢谢你"
End Sub

Private Sub Form_Load()
InitSize

Dim strRTF As String
strRTF = "{\rtf1\ansi\ansicpg936\deff0{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}"
strRTF = strRTF & "{\f1\fswiss\fprq2\fcharset0 Arial Black;}{\f2\fnil\fcharset134 \'cb\'ce\'cc\'e5;}}"
strRTF = strRTF & "{\colortbl ;\red255\green0\blue0;\red128\green0\blue0;\red0\green0\blue255;}"
strRTF = strRTF & "{\stylesheet{ Normal;}{\s1 heading 1;}{\s2 heading 2;}{\s3 heading 3;}"
strRTF = strRTF & "{\s4 heading 4;}{\s5 heading 5;}{\s6 heading 6;}{\s7 heading 7;}{\s8 heading 8;}{\s9 heading 9;}}"
strRTF = strRTF & "\viewkind4\uc1\pard\cf1\lang1033\b\f0\fs32 Test word\cf0\b0"
strRTF = strRTF & "\par \pard\keepn\s8\cf2\i\f1 Test word Test word Test word Test word"
strRTF = strRTF & "\par \pard\keepn\s9\cf3\ul\b\i0\f0\fs28 This is test content\'85\'85"
strRTF = strRTF & "\par \pard\cf0\lang2052\ulnone\b0\f2\fs18 \par }"
RichTextBox1.TextRTF = strRTF

OLE1.CreateEmbed App.Path & "\mydoc.doc"
End Sub

Private Sub InitSize()
'初始化页面所有控件的大小及位置
'On Error Resume Next

Command1.Move 120, 120, 1800, 375
Command1.Caption = "打印Picture2控件"

Picture1.Move 120, 600, Me.ScaleWidth - 555, Me.ScaleHeight - 1050
Picture1.BackColor = vbApplicationWorkspace
Picture1.ScaleMode = 3 'Pixel

Picture2.Move 20, 20, 794, 1123 'Picture2刚好为一张A4纸的大小
HScroll1.Move 120, Picture1.Top + Picture1.Height, Picture1.Width, 315
VScroll1.Move Picture1.Left + Picture1.Width, 600, 315, Picture1.Height

VScroll1.min = 0
VScroll1.max = IIf((Picture2.Height + 40 - Picture1.Height / 15) < 0, 0, Picture2.Height + 40 - Picture1.Height / 15)
VScroll1.SmallChange = Picture1.Height / 60
VScroll1.LargeChange = Picture1.Height / 15

HScroll1.min = 0
HScroll1.max = IIf((Picture2.Width + 40 - Picture1.Width / 15) < 0, 0, Picture2.Width + 40 - Picture1.Width / 15)
HScroll1.SmallChange = Picture1.Width / 60
HScroll1.LargeChange = Picture1.Width / 15

Picture2.ScaleMode = 3
RichTextBox1.Move 60, 60, 674, 150
OLE1.Move 60, 215, 674, 848
End Sub

Private Sub Form_Resize()
InitSize
End Sub

Private Sub VScroll1_Change()
Picture2.Top = 20 - VScroll1.value
End Sub

Private Sub VScroll1_GotFocus()
Picture2.SetFocus
End Sub

Private Sub VScroll1_Scroll()
Picture2.Top = 20 - VScroll1.value
End Sub

Private Sub HScroll1_Change()
Picture2.Left = 20 - HScroll1.value
End Sub

Private Sub HScroll1_GotFocus()
Picture2.SetFocus
End Sub

Private Sub HScroll1_Scroll()
Picture2.Left = 20 - HScroll1.value
End Sub


5)最后,在应用程序的目录新建一个名为“mydoc.doc”的WORD文档,随便在文档里面插入一些表格和文字,保存并关闭

6)运行应用程序。

现在的问题:我的目的是想单击Command1按钮打印Picture2上的所有内容,保存RichtextBox里面的格式文本以及嵌入在OLE里面的WORD文档。我尝试了很多种方法,都没有办法成功,这几种方法都是围绕如何将Picture2转换成一个BMP位图,然后再打印该位图。但是所有方法都最多转换Picture2的可见部分,不可见部分无法保存。

这只是解决我问题的一个示例程序,实际我的方案中,每个需要打印的PictureBox都可能包含每个RichTextBox控件,并且RichTextBox控件是放置再OLE上方的。

如果使用位图打印整个Picture2的,这样虽然虽然可以解决,但不是狠完美,因为使用BMP格式打印出来文字清晰度不够,有锯齿。如果能够清晰的打印出Picture2,我愿意出1000元感谢,我在广州,银行划帐、汇款都可以。当然这只是我的一个手段,因为最近很多问题都无人做答,对于真正的高手,1000真不算什么。无论怎样,我一定会重重酬谢!!!!
...全文
478 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
wumylove1234 2004-09-11
  • 打赏
  • 举报
回复
mark!!!!!!!!!!!!!!!!!!!!
chchw2001 2004-09-10
  • 打赏
  • 举报
回复
其实 板柱的类似问题完全可以导入到WORD后解决,没有格式无法控制的问题,可能是不太熟悉而已,可以详细讲你的需求说说,编辑 打印要比你的方法好用的多!QQ 64383002
还想懒够 2004-09-10
  • 打赏
  • 举报
回复
jjkk168@hotmail.com

具体仔细实现的代码没有怎么去深入研究了。我觉得应当可以实现的。

试想,如果这些控件是放在DHTML中,在IE中打开,也可以打印及打印预览,它们是怎么实现的?

肯定咱们的想法有点问题。
alj 2004-09-02
  • 打赏
  • 举报
回复

这个方法我知道,我现在也可以先将整个Picture画出来(不含RichtextBox),然后可以再一个一个将Richtextbox画出来,但不知道怎么样将Richtextbox的图像放过去。

有没有MSN,方便一下交流!!
还想懒够 2004-09-02
  • 打赏
  • 举报
回复
具体方法请参阅
mk:@MSITStore:C:\Program%20Files\Microsoft%20Visual%20Studio\MSDN98\98VS\2052\kb.chm::/Source/vbwin/q178076.htm

中的部分代码
还想懒够 2004-09-02
  • 打赏
  • 举报
回复
//1)如果用户改变了窗口大小,比如不是全部,每一次Picture的可见范围很小,那么就需要多次抓图,速度比较慢。
//2)如果在程序处理的过程中,用户单击了其他窗口,那么就乱抓一通,全乱套了
//3)打印出来效果很差,由于采用图片,锯齿比较厉害

1、不需要多次抓图,可通过API函数解决
2、由于是对窗口的hwnd控制,因此不会乱抓一通
3、优化打印代码。
alj 2004-09-02
  • 打赏
  • 举报
回复
To:jjkk168(老加班的人)

我现在通过多次抓图的方法可以解决,不过这样的效果不是很理想,思路就是首先滚动要打印的Picture,然后读取其在屏幕上的可见范围,并绘制到另一个Picture2上,通过滚动条不断滚动,知道Picture全部被读取到Picture2上,然后打印Picture2上。

这样有几个弱点:
1)如果用户改变了窗口大小,比如不是全部,每一次Picture的可见范围很小,那么就需要多次抓图,速度比较慢。
2)如果在程序处理的过程中,用户单击了其他窗口,那么就乱抓一通,全乱套了
3)打印出来效果很差,由于采用图片,锯齿比较厉害

所以,从根本上说,问题还是没有解决。


yonghengdizhen 2004-09-01
  • 打赏
  • 举报
回复
有兴趣,今天下班回去研究一下
sunmoonrock 2004-09-01
  • 打赏
  • 举报
回复
期待,观注!!!!!!!!
jiang8360 2004-09-01
  • 打赏
  • 举报
回复
up
代码真多呀
alj 2004-09-01
  • 打赏
  • 举报
回复
To:jjkk168(老加班的人)

是不是RichTextBox只有个边框?我之前试过绘制整个Picture1的图像到第二个Picture,但是这样就会导致RichTextBox智能显示边框,里面内容显示不出。
还想懒够 2004-09-01
  • 打赏
  • 举报
回复
狂晕,打印倒是出来了,但只出来下面那个OLE控件,上面的RICHTEXTBOX不见了
langziwujia007 2004-09-01
  • 打赏
  • 举报
回复
up一下吧,我是个最菜的鸟了。只能望着1000元——我三个月的工资,望而兴叹了。
还想懒够 2004-09-01
  • 打赏
  • 举报
回复
单个的RICHTEXTBOX已经能够显示出来了,但没有设定其位置,再想想
online 2004-08-31
  • 打赏
  • 举报
回复
使用IViewObject接口技术应该可以做到
可以直接得到不可见区域的内容

IViewObject接口可以创建和管理与通知接收器的连接,让调用程序获取控件改变的通知,提供了Draw方法

这两天我一直在捣鼓这个问题,只是不知道如何得到这个接口
你先看一下MSDN的资料
rainstormmaster 2004-08-31
  • 打赏
  • 举报
回复
//自己Up一下。还在郁闷中。。。

不是告诉你了,多次抓图(就是先将picturebox的内容分成若干份,每次抓取一份,最后根据bmp的文件格式,将小图片拼接成大图片)
alj 2004-08-31
  • 打赏
  • 举报
回复
自己Up一下。还在郁闷中。。。
alj 2004-08-31
  • 打赏
  • 举报
回复
To:wwqna(york)
导出到WORD后,文档格式无法控制,所以不行。我当然有考虑过。
alj 2004-08-31
  • 打赏
  • 举报
回复
感谢:jjkk168(老加班的人)

谢谢你的方法,我还没有来得及详细测试这个方法,不过从说明来看,应该还不能解决我的问题,就是对于Picture的不可见部分,如何CapturePicture?
rainstormmaster 2004-08-31
  • 打赏
  • 举报
回复
没什么好办法,多次抓图,最后图象合并后,打印
加载更多回复(11)

7,763

社区成员

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

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