下面这样能显示,不过要是要显示控件被其他程序挡住的话就不行了怎么实现不管控件是否被挡住都能显示它的图像呢?! 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
下面这样能显示,不过要是要显示控件被其他程序挡住的话就不行了怎么实现不管控件是否被挡住都能显示它的图像呢?! 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
呵呵,回答问题的时候还是要具体的看下对方的问题吧,不然有时候会弄笑话的。用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
1、根据句柄取得该设备的DC,lhDc=GetDC(hWnd);
2、用BitBlt复制该设备位图到picturebox,picHDC上是其设备DC,w和h分别是其宽和高
BitBlt picHDC,0,0,w,h,lhDc,0,0,SRCCOPY
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
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
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
不过问题又来了,测试窗体:“显示 属性”的主题标题为“示例:”的“Static”类使用Call GetPictureFormHwnd(句柄, Picture1)无效
标题为“Preview”的“ThemePreview”类使用Call GetPictureFormHwnd(句柄, Picture1)则有效
我要获取的图像就和“Static”类一样使用大哥的方法获取不了。
Call BitBlt(Picture1.hdc, 0, 0, 130, 55, 句柄, 0, 0, SRCCOPY)
Picture1.Refresh使用Call GetPictureFormHwnd(句柄, Picture1)则无法显示要显示的图像。