本人用vb的过程中,发现,vb中的很多控件都有一个属性hDC
经过分析,有些象GDI中的hdc
也看过很多资料,发现,控件的hDC可以直接用在API的TextOUt等函数中!
仔细一想,也许hDC属性本生就是一个设备上下文,于是,可以用于其中也不奇怪于是本人就突发奇想,是不是可以把控件保存成图片文件或用hdc直接打印出来?
有查考了打印原理,不过发现,很多用createdc等来做,一时看不是很明白
我想如果是能把控件的HDC直接赋值给打印机的HDC的话,是不是也是可以的
实际,却是行不通有人能正确表达出控件hdc究竟是什么一回事,具体使用在什么地方
经过分析,有些象GDI中的hdc
也看过很多资料,发现,控件的hDC可以直接用在API的TextOUt等函数中!
仔细一想,也许hDC属性本生就是一个设备上下文,于是,可以用于其中也不奇怪于是本人就突发奇想,是不是可以把控件保存成图片文件或用hdc直接打印出来?
有查考了打印原理,不过发现,很多用createdc等来做,一时看不是很明白
我想如果是能把控件的HDC直接赋值给打印机的HDC的话,是不是也是可以的
实际,却是行不通有人能正确表达出控件hdc究竟是什么一回事,具体使用在什么地方
在VB控件里 有HDC的可以直接进行图形的输出。但是有HDC的占用了一顶的系统资源,所以如果窗口FORM不做图形输出的话最好把 HASDC 属性设置为FALSE,这样可以优化程序。
至于楼主的问题,是否就是要将窗体上的东西直接打印出来呢?如果是的话只要直接使用ME.PRINTFORM就可以了。
你好,我并不是这么简单的要求
我具体的要求就是,能获取某个控件的HDC,并通过他,传给API函数FaxStartPrintJob
进行直接的传真功能,但一时又搞不懂hdc这东西的具体涵义
GDI的句柄是统一的.
该场景是不能赋值的.
在VB中,如果操作系统安装有打印机,那么Printer对象被指向系统缺省打印机,它始终是可用的,并不需要任何声明和创建对象的语句。我们的程序先向Printer对象输出一些内容,然后再调用条形码控件的打印方法在指定位置打印条形码。如果在控件中直接使用VB的Printer对象,那么结果是调用者和控件的打印输出被分别打印到两个页面,而我们的原意是将条形码作为调用者打印输出的一部分。由于控件被视为一个单独的线程,调用者程序和控件中的Printer对象也就处在两个线程中,被VB处理为两个单独的毫无关联的对象。要使二者的打印输出到同一页面,控件就不能直接使用Printer对象,而必须由调用者程序将Printer.hDc传给它,在控件中调用那些需要指定 HDC 的Windows API函数,使打印操作在同一个打印设备场景中进行。在我们的控件中,主要使用画线和输出字符串函数,在控件中至少要申明以下三个Windows API函数:' 移动画笔的位置
Private Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal x As Long,
ByVal y As Long, lpPoint As POINTAPI) As Long
' MoveToEx() 函数需要的结构
Private Type POINTAPI
x As Long
y As Long
End Type ' 从画笔的当前位置到(x,y)画一条线
Private Declare Function LineTo Lib "gdi32" (ByVal hdc As Long, ByVal x As Long,
ByVal y As Long) As Long
' 在(x,y)处输出一个字符串
Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long,
ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long 如原来的画线操作是调用Printer.Line过程:
Printer.Line (x, y)-Step(0, 100)
使用Windows API后就应改为:
Dim papi As POINTAPI
MoveToEx PrintDC, x , y, papi ' PrintDC 是调用者传来的Printer.hDC
LineTo PrintDC, x , y + 100
原来的打印字符是调用Printer.Print过程:
Printer.CurrentX = 100
Printer.CurrentY = 50
Printer.Print "*CODE39*"
使用Windows API后就应改为:
TextOut PrintDC, 100, 50, "*CODE39*, 8
如果是保存成图片,怎么处理?
当然,我的意思不是整个保存,我是想保存哪个控件,就保存哪个控件
VERSION 5.00
Begin VB.Form Form1
Caption = "Form1"
ClientHeight = 3195
ClientLeft = 60
ClientTop = 345
ClientWidth = 4680
LinkTopic = "Form1"
ScaleHeight = 3195
ScaleWidth = 4680
StartUpPosition = 3 '窗口缺省
Begin VB.CommandButton Command1
Caption = "Command1"
Height = 375
Left = 3720
TabIndex = 2
Top = 240
Width = 855
End
Begin VB.PictureBox Picture1
AutoRedraw = -1 'True
Height = 2175
Left = 360
ScaleHeight = 2115
ScaleWidth = 4155
TabIndex = 1
Top = 960
Width = 4215
End
Begin VB.TextBox Text1
Height = 855
Left = 600
TabIndex = 0
Text = "Text1"
Top = 0
Width = 3015
End
Begin VB.Timer Timer1
Interval = 100
Left = 2040
Top = 1800
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Dim hdc1 As Long
Private Sub Command1_Click()
savecontroltopic Me.Text1
End SubSub savecontroltopic(c As Control)
hdc1 = GetDC(c.hwnd)
Picture1.Width = c.Width
Picture1.Height = c.Height
BitBlt Picture1.hDC, 0, 0, Text1.Width / 15, Text1.Height / 15, hdc1, 0, 0, vbSrcCopy
SavePicture Picture1.Image, "c:\myw.bmp"
End Sub
测试过,保存下来的只是picture的底色
if you set picturebox 's autoredraw to true;
and you must let picturebox visible : you can see it;
hdc就是设备场景句柄,有了这个句柄就可以用BitBlt复制到picturebox里,然后想怎么保存或是打印就随你了
还有就是没有hdc属性的控件,可以用GetDC取得其设备场景的句柄
具体怎么玩就随你了,对这个课题不感兴趣
///BlueBeer(1win)
和
/// wfhlxl()
让我对vb编程有个新的体会
不过有个问题,就是如果我的控件有滚动条,
保存下来的就只是可见的一部分
其他看不到的内容,就不能保存了
不知道是不是一样的作用,楼主可以试一下
picture并没有handle熟悉,hdc和hwnd倒是有
就算有handle,都没什么用
http://search.csdn.net/Expert/topic/1538/1538596.xml?temp=.9497797
这个帖子中的方法应该可以吧
你好
上面贴子上的代码能运行吗?
我试过好象运行不了