本人用vb的过程中,发现,vb中的很多控件都有一个属性hDC
经过分析,有些象GDI中的hdc
也看过很多资料,发现,控件的hDC可以直接用在API的TextOUt等函数中!
仔细一想,也许hDC属性本生就是一个设备上下文,于是,可以用于其中也不奇怪于是本人就突发奇想,是不是可以把控件保存成图片文件或用hdc直接打印出来?
有查考了打印原理,不过发现,很多用createdc等来做,一时看不是很明白
我想如果是能把控件的HDC直接赋值给打印机的HDC的话,是不是也是可以的
实际,却是行不通有人能正确表达出控件hdc究竟是什么一回事,具体使用在什么地方

解决方案 »

  1.   

    http://search.csdn.net/Expert/topic/1538/1538596.xml?temp=.9497797
      

  2.   

    dc 是一个WIN32定义的图形接口。任何一个窗口的输出必须依赖DC来进行输出。
    在VB控件里 有HDC的可以直接进行图形的输出。但是有HDC的占用了一顶的系统资源,所以如果窗口FORM不做图形输出的话最好把 HASDC 属性设置为FALSE,这样可以优化程序。
      

  3.   

    控件的hDC属性应该和API结合来用吧。。
      

  4.   

    楼上limitworld(黑色幽灵) 说的没错,MSDN也是这么说的。不过楼主可以试一下,就算把窗体的HASDC 设为FALSE,还是一样有效的。
    至于楼主的问题,是否就是要将窗体上的东西直接打印出来呢?如果是的话只要直接使用ME.PRINTFORM就可以了。
      

  5.   

    //// WallesCai(我是老蔡,不是泡菜!) 
    你好,我并不是这么简单的要求
    我具体的要求就是,能获取某个控件的HDC,并通过他,传给API函数FaxStartPrintJob
    进行直接的传真功能,但一时又搞不懂hdc这东西的具体涵义
      

  6.   

    本来就是场景句柄啊.难道你认为vb的hdc专为vb使用吗?vc的又为vc使用吗?
    GDI的句柄是统一的.
    该场景是不能赋值的.
      

  7.   

    一则实例:打印条形码
    在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
      

  8.   

    你是想把某个vb control的表面保存为一个图片吗?如果是就很简单.
      

  9.   

    http://community.csdn.net/Expert/topic/3385/3385068.xml?temp=9.258449E-03
      

  10.   

    ///wfhlxl() 
    如果是保存成图片,怎么处理?
    当然,我的意思不是整个保存,我是想保存哪个控件,就保存哪个控件
      

  11.   

    我已年过半白,没有工作,没有钞票,今天还未吃饭,只吃了yesterday leave 面, 馒头和稀饭是我的main food.刚向别人借了100元上网,希望能通过网络,改变我的潦倒和颓废.今天,刚向用自己的血汗换来的成果,换的一点报酬.(完全是自己个人做出来的)却早来了他人的非议和不满,难道,出售knowledge 很可耻吗?
      

  12.   

    save blow code to .frm file
    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
      

  13.   

    //////wfhlxl() ( ) 
    测试过,保存下来的只是picture的底色
      

  14.   

    your cut me(涮我)
    if you set picturebox 's autoredraw to true; 
    and you must let picturebox visible : you can see it;
      

  15.   

    并没发现“很多控件有hdc属性”
    hdc就是设备场景句柄,有了这个句柄就可以用BitBlt复制到picturebox里,然后想怎么保存或是打印就随你了
    还有就是没有hdc属性的控件,可以用GetDC取得其设备场景的句柄
    具体怎么玩就随你了,对这个课题不感兴趣
      

  16.   

    //////谢谢
    ///BlueBeer(1win) 

    /// wfhlxl() 
    让我对vb编程有个新的体会
      

  17.   

    /////BlueBeer(1win)    
    不过有个问题,就是如果我的控件有滚动条,
    保存下来的就只是可见的一部分
    其他看不到的内容,就不能保存了
      

  18.   

    你可以用循环来控制,picturebox autoredaw must be autoredraw ,even it's left at -80000 ,it have effect yet. so you can bitblt a control rect, then set scrollbar to new rect continue bitblt, to the whole control was save final. as long as your picturebox is enough height.
      

  19.   

    picture对象有一个Handle属性
    不知道是不是一样的作用,楼主可以试一下
      

  20.   

    楼上
    picture并没有handle熟悉,hdc和hwnd倒是有
    就算有handle,都没什么用
      

  21.   

    回复人: rainstormmaster(暴风雨 v2.0) ( ) 信誉:228  2004-9-16 22:49:33  得分: 0  
     
     
       
    http://search.csdn.net/Expert/topic/1538/1538596.xml?temp=.9497797  
     
    这个帖子中的方法应该可以吧
      

  22.   

    ////// liuyan4794(青牛) 
    你好
    上面贴子上的代码能运行吗?
    我试过好象运行不了
      

  23.   

    其实简单点说,HDC就是图形控件的图形句柄.