Страница: 1 |
Страница: 1 |
Вопрос: Clipboard
Добавлено: 29.07.06 21:02
Автор вопроса: Vit | Web-сайт:
Вот код, который должен брать из буфера рисунок BMP.
Я знаю есть простой путь - средствами VB, но мне бы хотелось знать как это сделать при помощи API, для возможности использования кода в других языках.
picScreen.Width = nWidth
picScreen.Height = nHeight
'--------------------------------------------------
'Эта строка заменить все нижеследующие, заключённые в закоментарированные строки
' picScreen.Picture = Clipboard.GetData(2)
'--------------------------------------------------
OpenClipboard Me.hWnd
If IsClipboardFormatAvailable(CF_BITMAP) <> 0 Then
Dim hBitmap As Long
hBitmap = GetClipboardData(CF_BITMAP)
'I вариант
' BitBlt picScreen.hDC, 0, 0, nWidth / Screen.TwipsPerPixelX, nHeight / Screen.TwipsPerPixelY, hBitmap, 0, 0, vbSrcCopy
' picScreen.Picture = picScreen.Image
'II вариант
SelectObject hDC_Bit, hBitmap
BitBlt picScreen.hDC, 0, 0, nWidth / Screen.TwipsPerPixelX, nHeight / Screen.TwipsPerPixelY, hDC_Bit, 0, 0, vbSrcCopy
picScreen.Picture = picScreen.Image
End If
CloseClipboard
'--------------------------------------------------
SavePicture picScreen.Picture, save_path & txtFile.Text & Format$(PicCount, "000000") & ".bmp"
Почему я не могу перенести изображение в PicturebBox?
Ответы
Всего ответов: 11
Номер ответа: 1
Автор ответа:
avdey
ICQ: 219571279
Вопросов: 34
Ответов: 486
Профиль | | #1
Добавлено: 31.07.06 08:54
Номер ответа: 2
Автор ответа:
Vit
Вопросов: 68
Ответов: 62
Web-сайт:
Профиль | | #2
Добавлено: 31.07.06 12:47
Как загрузить рисунок в PictureBox из существующего файла я знаю. А, если файл не существует, т.е. находится в памяти (буфер обмена).
Можно VB средствами, но мне нужно через API.
Получаю Handle, но не могу созранить рисунок в файл.
Средствами VB это уже не пойдёт.
Здесь нужно сперва скинуть его в PictureBox, а потом уже сохранять.
Так вот, проблема в скидывании в PictureBox.
Номер ответа: 3
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #3
Добавлено: 31.07.06 17:56
VBшный PictureBox использует свои COM-интерфейсы для работы с изображениями (IPicture и т.п.), поэтому оно вряд ли пригодится тебе для работы в других языках.
Номер ответа: 4
Автор ответа:
Sacred Phoenix
ICQ: 304238252
Вопросов: 52
Ответов: 927
Профиль | | #4
Добавлено: 31.07.06 18:10
2 avdey: советую те немного вникать в суть вопроса... Да и вопрос называется "Clipboard". Тебе это ни о чём не говорит?
Номер ответа: 5
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #5
Добавлено: 31.07.06 18:42
Вроде всё правильно. Попроверяй хэндлы битмапа и контекста устройства. Например, в коде указан hDC_Bit, но как он создаётся я не вижу.
Номер ответа: 6
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #6
Добавлено: 01.08.06 11:20
Мля, в инете такого г полно. Набери в гугле GetClipboardData CF_BITMAP и скопируй код. Всем искать лень.
Номер ответа: 7
Автор ответа:
Vit
Вопросов: 68
Ответов: 62
Web-сайт:
Профиль | | #7
Добавлено: 01.08.06 21:56
LamerOnLine
Этот код, но не неашёл ничего особенного. Перепробовал все найденные варианты. Результат не изменился.
CyRax
Я создаю переменную hDC_Bmp, а потом связываю его с Bitmap Handle'ом (hDC_Bmp).
Да и там ошибки нет. Ошибка в строке вызова BitBlt, т.е., возможно, что я какие-либо параметры (Handle) не так передаю.
P.S. Только что заметил, что в SelectObject использую один Handle, а в BitBlt - другой. Но это тоже не критичная ошибка. Просто я несколько раз переделавал код и в итоге забыл исправить. Даже при использовании одного и того же Handle'ла ничего не происходит.
Sharp
Да забудь ты о PictureBox, во всех "визуальных" языках (кроме Visual Assembler, если не появилось) есть свои варианты элемента, позволяющего работать с графическими элементами.
Просто в VB можно быстро написать програмку и "отшлифовать", которую вдальнейшем можно будет перевести на другие языки (при необходимости).
Номер ответа: 8
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #8
Добавлено: 02.08.06 11:39
ээээээээ... надо понимать намеки феникса
Или тебе ОБЯЗАТЕЛЬНО на API?
Номер ответа: 9
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #9
Добавлено: 02.08.06 12:12
Option Explicit
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (PicDesc As PICTDESC, RefIID As GUID, _
ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
Private Declare Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Long) As Long
Private Type PICTDESC
cbSizeOfStruct As Long
picType As Long
hBitmap As Long
hpal As Long
End Type
Private Type GUID
 ata1 As Long
 ata2 As Integer
 ata3 As Integer
 ata4(7) As Byte
End Type
Private Const PICTYPE_BITMAP = 1
Private Const CF_BITMAP = 2
Private Sub Command1_Click()
OpenClipboard Me.hwnd
Dim hBitmap As Long
Dim IPic As IPicture
If IsClipboardFormatAvailable(CF_BITMAP) = 0 Then
CloseClipboard
MsgBox "No bitmap"
Exit Sub
End If
hBitmap = GetClipboardData(CF_BITMAP)
Dim IID_IDispatch As GUID
With IID_IDispatch
.Data1 = &H20400
.Data4(0) = &HC0
.Data4(7) = &H46
End With
Dim Pic As PICTDESC
Pic.cbSizeOfStruct = Len(Pic)
Pic.picType = PICTYPE_BITMAP
Pic.hBitmap = hBitmap
OleCreatePictureIndirect Pic, IID_IDispatch, PICTYPE_BITMAP, IPic
Picture1.Picture = IPic
CloseClipboard
End Sub
Номер ответа: 10
Автор ответа:
Sacred Phoenix
ICQ: 304238252
Вопросов: 52
Ответов: 927
Профиль | | #10
Добавлено: 02.08.06 18:24
а там я спрашивал, говорит ли ему [avdey] что-нибудь строчка Clipboard, имея в виду работу работу с буфером
Номер ответа: 11
Автор ответа:
Vit
Вопросов: 68
Ответов: 62
Web-сайт:
Профиль | | #11
Добавлено: 02.08.06 21:32
LamerOnLine
Спасибо, то, что надо.
Всем
Извинияюсь, есть текст вопроса не был понятен сразу.
Иногда (точнее очень часто) бывает трудно выразить мысли словами.