知道另外的一个程序控件的句柄 怎么在程序中显示这个句柄中的图像呢?!

解决方案 »

  1.   

    知道它的句柄这样办: 
    1、根据句柄取得该设备的DC,lhDc=GetDC(hWnd);
    2、用BitBlt复制该设备位图到picturebox,picHDC上是其设备DC,w和h分别是其宽和高
       BitBlt picHDC,0,0,w,h,lhDc,0,0,SRCCOPY
      

  2.   

    下面这样能显示,不过要是要显示控件被其他程序挡住的话就不行了怎么实现不管控件是否被挡住都能显示它的图像呢?!
    Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As LongPrivate 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 Const SRCCOPY = &HCC0020Private Sub CMB_Command1_Click()Dim f_i As Longf_i = GetDC(&H3085A)Call BitBlt(Picture1.hdc, 0, 0, 130, 55, f_i, 0, 0, SRCCOPY)End Sub
      

  3.   

    下面这样能显示,不过要是要显示控件被其他程序挡住的话就不行了怎么实现不管控件是否被挡住都能显示它的图像呢?!
    Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As LongPrivate 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 Const SRCCOPY = &HCC0020Private Sub CMB_Command1_Click()Dim f_i As Longf_i = GetDC(&H3085A)Call BitBlt(Picture1.hdc, 0, 0, 130, 55, f_i, 0, 0, SRCCOPY)End Sub
      

  4.   

    呵呵,回答问题的时候还是要具体的看下对方的问题吧,不然有时候会弄笑话的。用bitblt被遮住的部分肯定得不到图像,要解决这个问题,可以考虑使用XP系统提供的API函数PrintWindow,对于XP以下 的系统,也许可以发送WM_PRINT,但是我在XP下这个句柄只能是本进程的。
    Private Declare Function PrintWindow Lib "user32" (ByVal Hwnd As Long, ByVal hdcBlt As Long, ByVal nFlags As Long) As Long
    Private Declare Function IsWindowVisible Lib "user32" (ByVal Hwnd As Long) As Long
    Private Declare Sub SetWindowPos Lib "user32" (ByVal Hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)
    Private Declare Function IsWindow Lib "user32" (ByVal Hwnd As Long) As LongPrivate Const SWP_HIDEWINDOW = &H80
    Private Const SWP_SHOWWINDOW = &H40
    Private Const SWP_NOSIZE = &H1
    Private Const SWP_NOMOVE = &H2
    Private Const SWP_NOACTIVATE = &H10Private Function GetPictureFormHwnd(Hwnd As Long, Pic As PictureBox)
        Dim Visible     As Boolean
        If IsWindow(Hwnd) = False Then
            MsgBox "所提供的不是一个有效句柄.", vbCritical + vbOKOnly
            Exit Function
        Else
            Pic.ScaleMode = 3
            Pic.AutoRedraw = True
            Visible = IsWindowVisible(Hwnd)     '控件是否可见
            If Visible = False Then              '使控件暂时可见
                SetWindowPos mWnd, 0, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
            End If
            PrintWindow Hwnd, Pic.hDC, 0        'PrintWindow 需要控件可见
            If Visible = False Then             '恢复控件状态
                SetWindowPos mWnd, 0, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_HIDEWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
            End If
        End If
    End Function
      

  5.   

    ……我觉得在picture_paint()事件里执行getDc+Bitblt就可以了呀……
      

  6.   

    Call GetPictureFormHwnd(Me.Hwnd, Picture1)没有反应。这是怎么回事啊?!
      

  7.   

    加上Pic.Refresh就不错了呵呵
    不过问题又来了,测试窗体:“显示 属性”的主题标题为“示例:”的“Static”类使用Call GetPictureFormHwnd(句柄, Picture1)无效
    标题为“Preview”的“ThemePreview”类使用Call GetPictureFormHwnd(句柄, Picture1)则有效
    我要获取的图像就和“Static”类一样使用大哥的方法获取不了。
      

  8.   

    使用 下面代码能显示,不过如果控件被挡住了就无法显示了
    Call BitBlt(Picture1.hdc, 0, 0, 130, 55, 句柄, 0, 0, SRCCOPY)
    Picture1.Refresh使用Call GetPictureFormHwnd(句柄, Picture1)则无法显示要显示的图像。
      

  9.   

    好强,貌似hypesnape对控件截图也是这样弄的