Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перенос изображение с десктопа на форму 
:(
    Опции темы
djande
  Дата 18.4.2010, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 5.2.2010

Репутация: нет
Всего: нет



Доброго времени суток! Пытаюсь сделать программу, которая снимает изображение находящееся за нею. Получил дескриптор десктопа, перенёс изображение на форму. Изображение получилось вместе с самой формой. Как сделать так, чтобы форму было невидно, но в тоже время, чтобы она оставалась в развёрнутом виде. Мне нужно перенести на форму изображение, находящееся за моим окном, не сворачивая его. Так вообще возможно? Пробовал сворачивать, делать скриншот, разворачивать. Выходит некрасиво, мерцает, пробовал менять прозрачность до нуля, делать скриншот, прозрачность восстанавливать до 255, тоже мерцает. Есть какой-нибудь иной способ решения данной проблемы? Пример ниже.

Код

Option Explicit
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetWindowDC Lib "user32" (ByVal hWnd As Long) As Long
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 ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hDC As Long) As Long

Private Sub Command1_Click()
Dim DeskDc As Long
Me.Cls
DeskDc = GetWindowDC(GetDesktopWindow())'Получаем дескриптор десктопа
Call BitBlt(Me.hDC, 0, 0, Me.Width, Me.Height, DeskDc, 0, 0, vbSrcCopy)'Переносим изображение десктопа
Call ReleaseDC(GetDesktopWindow(), DeskDc)'Освобождаем контекст
End Sub


Это сообщение отредактировал(а) djande - 19.4.2010, 16:33
PM MAIL   Вверх
ProgramerForever
  Дата 1.6.2010, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 15.11.2006
Где: Новосибирск

Репутация: 2
Всего: 5



А для чего такая задача? Может проще использовать прозрачность?
Код

'Декларации API
Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
Private Declare Function UpdateLayeredWindow Lib "user32" (ByVal hwnd As Long, ByVal hdcDst As Long, pptDst As Any, psize As Any, ByVal hDCSrc As Long, pptSrc As Any, crKey As Long, ByVal pblend As Long, ByVal dwFlags As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Const GWL_EXSTYLE = (-20)
Private Const LWA_COLORKEY = &H1
Private Const LWA_ALPHA = &H2
Private Const ULW_COLORKEY = &H1
Private Const ULW_ALPHA = &H2
Private Const ULW_OPAQUE = &H4
Private Const WS_EX_LAYERED = &H80000

Public Function isTransparent(ByVal hwnd As Long) As Boolean
'Функция возврщает True, если окно хоть чуть прозрачно
' и False в противном случае. В результате ошибок также возвращается False
'
On Error Resume Next
    Dim Msg As Long
    
    Msg = GetWindowLong(hwnd, GWL_EXSTYLE)
    If (Msg And WS_EX_LAYERED) = WS_EX_LAYERED Then
      isTransparent = True
    Else
      isTransparent = False
    End If
    If Err Then
      isTransparent = False
    End If
End Function

Public Function MakeTransparent(ByVal hwnd As Long, intTLevel As Integer) As Long
'Устанавливает прозрачность для объекта
'Возможные возвращаемые значения:
'0 - Завершено успешно
'1 - intTLevel выходит за пределы [0..255]
'2 - Другие ошибки
'
Dim Msg As Long
On Error Resume Next
    If ((intTLevel < 0) Or (intTLevel > 255)) Then
      MakeTransparent = 1
    Else
      Msg = GetWindowLong(hwnd, GWL_EXSTYLE)
      Msg = Msg Or WS_EX_LAYERED
      SetWindowLong hwnd, GWL_EXSTYLE, Msg
      SetLayeredWindowAttributes hwnd, 0, intTLevel, LWA_ALPHA
      MakeTransparent = 0
    End If
    If Err Then
      MakeTransparent = 2
    End If
End Function

Public Function MakeOpaque(ByVal hwnd As Long) As Long
'Делает окно непрозрачным
'Возможные возвращаемые значения:
'0 - Завершено успешно
'
'2 - Завершено с ошибкой
'
    Dim Msg As Long
    On Error Resume Next
    Msg = GetWindowLong(hwnd, GWL_EXSTYLE)
    Msg = Msg And Not WS_EX_LAYERED
    SetWindowLong hwnd, GWL_EXSTYLE, Msg
    SetLayeredWindowAttributes hwnd, 0, 0, LWA_ALPHA
    MakeOpaque = 0
    If Err Then
      MakeOpaque = 2
    End If
End Function


Это сообщение отредактировал(а) ProgramerForever - 1.6.2010, 22:28
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0479 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.