Идёт загрузка страницы...

htp://aptem.net.ru






На главную страничку учебника Visual Basic

Контексты устройств

Контекст устройства (Device Context или DC) - это структура данных, содержащая физические параметры устройства и используемая для доступа к устройству. На таких контекстах можно рисовать, выводить текст, закрашивать фигуры и т.д. и т.п. В API функциях Windows есть масса функций для работы с контекстами устройств. Здесь мы остановимся на наиболее часто используемых.

CreateDC - возвращает контекст устройства, заданного имени. Следующий пример создаёт контекст дисплея (экрана):

Dim hDisp As Long
Dim dM As DEVMODE
hDisp = CreateDC("DISPLAY", 0, 0, dM)

Здесь переменная dM - типа DEVMODE. Это очень большая структура, которую необходимо включить в код.

А теперь мы используя ф-цию BitBlt скопируем на этот контекст изображение из PictureBox. Итак, поместите на форму PictureBox и загрузите туда произвольную картинку. Затем создайте кнопку и вставьте вот такой код:

Dim hDisp As Long
Dim dM As DEVMODE
hDisp = CreateDC("DISPLAY", 0, 0, dM)
BitBlt hDisp, 300, 300, 100, 100, Picture1.hdc, 0, 0, vbSrcCopy

Запустите программу и посмотрите что произойдёт.

А теперь напишем более сложную программу, которая будет выводить в PictureBox содержимое экрана под курсором. Поместите на форму PictureBox и задайте ему размеры 80 на 80 пикселей. Создайте таймер с интервалом 100 миллисекунд. Далее создайте новый модуль и вставьте в него следующие определения:

Type DEVMODE
dmDeviceName As String * 32
dmSpecVersion As Integer
dmDriverVersion As Integer
dmSize As Integer
dmDriverExtra As Integer
dmFields As Long
dmOrientation As Integer
dmPaperSize As Integer
dmPaperLength As Integer
dmPaperWidth As Integer
dmScale As Integer
dmCopies As Integer
dmDefaultSource As Integer
dmPrintQuality As Integer
dmColor As Integer
dmDuplex As Integer
dmYResolution As Integer
dmTTOption As Integer
dmCollate As Integer
dmFormName As String * 32
dmUnusedPadding As Integer
dmBitsPerPel As Integer
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
End Type

Type POINTAPI
x As Long
y As Long
End Type

Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) _
As Long

Declare Function 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) As Long

Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" _
(ByVal lpDriverName As String, ByVal lpDeviceName As String, _
ByVal lpOutput As String, lpInitData As DEVMODE) As Long

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

Теперь поместите в код формы код:

Dim hDisp As Long
Dim dM As DEVMODE
Dim curPos As POINTAPI

Private Sub Form_Load()
hDisp = CreateDC("DISPLAY", 0, 0, dM)
SetWindowPos Form1.hwnd, -1, Form1.Left, Form1.Top, _
Form1.ScaleWidth, Form1.ScaleHeight, 3
End Sub

Private Sub Timer1_Timer()
GetCursorPos curPos
BitBlt Picture1.hdc, 0, 0, 80, 80, hDisp, curPos.x - 40, _
curPos.y - 40, vbSrcCopy
End Sub

Запустите программу. Вы должны наблюдать, как в PictureBox отображается содержимое экрана под курсором (как в программе Microsoft Magnifier, поставляемой с Windows, только там увеличенное изображение).

Вот и всё. Желаю приятного программирования на контекстах устройств.

На главную страничку учебника Visual Basic