Страница: 1 | 2 |
Вопрос: эквивалент устройства PictureBox1.hdc для памяти
Добавлено: 26.10.04 01:01
Автор вопроса: night-roll
перерыл весь архив, но так и не понял как правильно это сделать. везде как-то мельком об этом упоминается.
пожалуйста, если не трудно, набросайте!
и поясните вот этот пример из архива
[code]
' получение эквивалент устройства PictureBox1.hdc для памяти
memDC = CreateCompatibleDC(DeskTopDc)
' создание битовой карты
hBit = CreateCompatibleBitmap(PictureBox1.hdc, x, y)
' выбор hBit в memDC
SelectObject memDC, hBit
' С ним работаешь как с PictureBox1
'.... например
BitBlt memDC, 0, 0, 100, 100, PicBMP1, 0, 0, SRCCOPY
TransparentBlt memDC, 0, 0, 100, 100, PicBMP2, 0, 0, vbWhite
'.... и т.д.
' и когда все готово, полученную итоговую картинку копируешь в PictureBox1
BitBlt Picture1.hdc, 0, 0, px, py, memDC, 0, 0, SRCCOPY
[\code]
заранее всем спасибо!
p.s. пример взят из темы http://vbnet.ru/forum/show.aspx?id=6982, автор SergeySV.
Ответы
Всего ответов: 24
Номер ответа: 1
Автор ответа:
night-roll
Вопросов: 36
Ответов: 326
Профиль | | #1
Добавлено: 26.10.04 01:05
забыл упомянуть...
поясните пожалуйста вот это DeskTopDc
и объясните для чего используется (создаётся) битовая карта.
Номер ответа: 2
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #2
Добавлено: 26.10.04 03:24
Наверное по смыслу это верно, но вообще принято называть контекст устройства.
MSDN:
Structure that defines a set of graphic objects and their attributes, and the graphic modes that affect output. In addition, the device context (DC) refers to a physical output device—its name, device driver, and other attributes. GDI function call parameters contain a handle to a DC to include the attributes of the specified device. There are four types of DC: display (supports drawing operations on a video display terminal), printer (supports drawing operations on a printer or plotter), memory (supports drawing operations on a bitmap), and information (supports retrieval of device data.)
Как видно из этого описания, контекст может быть у дисплея, принтера, памяти и информационный.
Битовая карта - это не что иное как точечный рисунок. Используется для хранения цветов пикселов.
Номер ответа: 3
Автор ответа:
night-roll
Вопросов: 36
Ответов: 326
Профиль | | #3
Добавлено: 26.10.04 04:48
ясно, а где взять эту переменную DeskTopDc
и какого содержания она должна быть?
по самому определению понятно, что она типа
ByVal hdc As Long
буду премного признателен!
Номер ответа: 4
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #4
Добавлено: 26.10.04 05:12
Вроде так:
Private Const HWND_DESKTOP = 0
Private Declare Function GetDC Lib "user32.dll" ( _
ByVal hwnd As Long) As Long
Private Sub Form_Load()
 eskTopDc = GetDC(HWND_DESKTOP)
End Sub
Номер ответа: 5
Автор ответа:
night-roll
Вопросов: 36
Ответов: 326
Профиль | | #5
Добавлено: 27.10.04 00:46
спасибо! с этим разобрался.
теперь возникло одно НО
усложняем задачу:
- необходимо из PictureClip вырвать часть, то бишь ячейку и сделать её фон прозрачным!
вопрос: как это сделать?
в чем подвох: TransparentBlt работает только с hdc, а PictureClip этого не поддерживает.
в связи с выше сказанным, как быть?
Номер ответа: 6
Автор ответа:
night-roll
Вопросов: 36
Ответов: 326
Профиль | | #6
Добавлено: 27.10.04 03:18
может можно получить hDc PictureClip каким-нибудь способом?
Номер ответа: 7
Автор ответа:
night-roll
Вопросов: 36
Ответов: 326
Профиль | | #7
Добавлено: 27.10.04 03:46
может я не прав, но наверное так
GetDC(pc1.hwnd)
но опять не получается - какя-то хрень выходит
Номер ответа: 8
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #8
Добавлено: 27.10.04 03:50
Кстати, хендл рабочего стола можно ещё получить с помощью GetDesktopWindow. Возвращает кстати ненулевое значение. Что из них верно я не знаю. Но в твоём случае это не критично.
Номер ответа: 9
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #9
Добавлено: 27.10.04 03:52
Лично я с этим контролом в последний раз работал ещё в VB3.
Номер ответа: 10
Автор ответа:
night-roll
Вопросов: 36
Ответов: 326
Профиль | | #10
Добавлено: 27.10.04 03:53
GetDC(pc1.hwnd)
нет, не то
возвращает hDC окна приложения
Номер ответа: 11
Автор ответа:
night-roll
Вопросов: 36
Ответов: 326
Профиль | | #11
Добавлено: 27.10.04 03:56
мне не нужен хендл рабочего стола, мне нужен hdc PictureClip, чтобы можно применить к нему TransparentBlt
Номер ответа: 12
Автор ответа:
night-roll
Вопросов: 36
Ответов: 326
Профиль | | #12
Добавлено: 27.10.04 04:01
>GetDC(pc1.hwnd)
>нет, не то
>возвращает hDC окна приложения
ну здесь я погорячился, действительно рабочего стола
Номер ответа: 13
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #13
Добавлено: 27.10.04 04:53
Не, это приёдется делать через OLE.
Private Sub Form_Click()
Me.Cls
pic1 PictureClip1.Picture
End Sub
Sub pic1(pic As IPicture)
Dim memDC As Long
memDC = CreateCompatibleDC(DeskTopDc)
pic.SelectPicture memDC, pic.CurDC, pic.Handle
Me.Caption = BitBlt(Me.hdc, 0, 0, 40, 40, pic.CurDC, 0, 0, SRCCOPY)
End Sub
Контекст удалишь сам.
Номер ответа: 14
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #14
Добавлено: 27.10.04 04:55
>GetDC(pc1.hwnd)
>нет, не то
>возвращает hDC окна приложения
ну здесь я погорячился, действительно рабочего стола
Я вообще не понял с кем ты споришь
Вроде сам с собой.
Номер ответа: 15
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #15
Добавлено: 27.10.04 05:00
Всё понятно? Здесь используется технолгия COM. Только не думай что я смогу тебе её подробно объяснить. Я сам её плохо знаю.