Как сохранить картинку(PrintScrn) в *.bmp или *.jpg ?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
KeePer
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 09.08.2003 (Сб) 11:40

Как сохранить картинку(PrintScrn) в *.bmp или *.jpg ?

Сообщение KeePer » 18.08.2003 (Пн) 14:32

Собственно нужно, что б после нажатия клавишы PrintScrn программа сама сохраняла изображение в bmp или jpg. Как перехватить нажатие этой клавиши я знаю, а вот как сделать так, что бы она сама сохраняла то, что в данный момент находится на экране я не знаю. Нашел код по данной тематике на "vbrussian", но он оказался не рабочим или у меня руки кривые :).
Помогите пожалуйста.
MUD FOREVER!

Aleksej
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 191
Зарегистрирован: 03.06.2003 (Вт) 9:58

Сообщение Aleksej » 18.08.2003 (Пн) 15:57

В модуль:
Код: Выделить всё
Public Function CaptureWindow(ByVal hWndSrc As Long, ByVal Client As Boolean, ByVal LeftSrc As Long, ByVal TopSrc As Long, ByVal WidthSrc As Long, ByVal HeightSrc As Long) As Picture
On Error Resume Next
 
  Dim hDCMemory As Long
  Dim hBmp As Long
  Dim hBmpPrev As Long
  Dim hDCSrc As Long
  Dim hPal As Long
  Dim hPalPrev As Long
  Dim RasterCapsScrn As Long
  Dim HasPaletteScrn As Long
  Dim PaletteSizeScrn As Long
  Dim LogPal As LOGPALETTE
 
  If Client Then
    hDCSrc = GetDC(hWndSrc)
  Else
    hDCSrc = GetWindowDC(hWndSrc)
  End If
 
  hDCMemory = CreateCompatibleDC(hDCSrc)
 
  hBmp = CreateCompatibleBitmap(hDCSrc, WidthSrc, HeightSrc)
  hBmpPrev = SelectObject(hDCMemory, hBmp)
  RasterCapsScrn = GetDeviceCaps(hDCSrc, RASTERCAPS)
  HasPaletteScrn = RasterCapsScrn And RC_PALETTE       
  PaletteSizeScrn = GetDeviceCaps(hDCSrc, SIZEPALETTE)
 
If HasPaletteScrn And (PaletteSizeScrn = 256) Then
    LogPal.palVersion = &H300
    LogPal.palNumEntries = 256
    GetSystemPaletteEntries hDCSrc, 0, 256, LogPal.palPalEntry(0)
    hPal = CreatePalette(LogPal)
    hPalPrev = SelectPalette(hDCMemory, hPal, 0)
    RealizePalette hDCMemory
  End If
  BitBlt hDCMemory, 0, 0, WidthSrc, HeightSrc, hDCSrc, LeftSrc, TopSrc, vbSrcCopy
  hBmp = SelectObject(hDCMemory, hBmpPrev)
 
  If HasPaletteScrn And (PaletteSizeScrn = 256) Then
    hPal = SelectPalette(hDCMemory, hPalPrev, 0)
  End If
  DeleteDC hDCMemory
  ReleaseDC hWndSrc, hDCSrc
  Set CaptureWindow = CreateBitmapPicture(hBmp, hPal)
End Function

Public Function CreateBitmapPicture(ByVal hBmp As Long, ByVal hPal As Long) As Picture
On Error Resume Next
 
  Dim Pic As PicBmp
  Dim IPic As IPicture
  Dim IID_IDispatch As GUID

With IID_IDispatch
    .Data1 = &H20400
    .Data4(0) = &HC0
    .Data4(7) = &H46
  End With

With Pic
    .Size = Len(Pic
    .Type = vbPicTypeBitmap   
    .hBmp = hBmp             
    .hPal = hPal             
End With

OleCreatePictureIndirect Pic, IID_IDispatch, 1, IPic
Set CreateBitmapPicture = IPic
End Function

в обработку Print Scrn:
Код: Выделить всё
Dim hWndScreen As Long
  Dim CaptureScreen As Picture
  hWndScreen = GetDesktopWindow()
 
  Set CaptureScreen = CaptureWindow(hWndScreen, False, 0, 0, Screen.Width \ Screen.TwipsPerPixelX, Screen.Height \ Screen.TwipsPerPixelY)
  Picture1.Picture = CaptureScreen
  SavePicture Picture1, "c:\test.bmp"

KeePer
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 09.08.2003 (Сб) 11:40

Сообщение KeePer » 18.08.2003 (Пн) 19:06

Код у меня почему-то не работает. Вроде говорит, что функция не определена и еще ругается на Dim LogPal As LOGPALETTE Наверное должен быть какой-нибудь class.

hWndScreen = GetDesktopWindow() - функция не определна(VB)


Set CaptureScreen = CaptureWindow(hWndScreen, False, 0, 0, Screen.Width \
[/u]
MUD FOREVER!

Aleksej
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 191
Зарегистрирован: 03.06.2003 (Вт) 9:58

Сообщение Aleksej » 19.08.2003 (Вт) 8:21

Вот тебе объявления в модуль:
Код: Выделить всё
Public Type PALETTEENTRY
  peRed As Byte
  peGreen As Byte
  peBlue As Byte
  peFlags As Byte
End Type

Public Type LOGPALETTE
  palVersion As Integer
  palNumEntries As Integer
  palPalEntry(255) As PALETTEENTRY 
End Type

Public Declare Function GetDesktopWindow Lib "USER32.DLL" () As Long

А так всё должно работать, проверял. :)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

    TopList