VBA: поиск Hdc в листе Excel или пользовательской форме
Вот два небольших примера того, как найти Hdc в рабочем листе:
- При нажатии на Sheet1 отображается пользовательская форма.
- Поместите указатель на UF, удерживайте левую кнопку мыши и перетащите мышь.
- При закрытии UF саб продолжается и нарисует дугу на листе.
Начиная
- Новая рабочая тетрадь
- Добавить имя пользовательской формы = UserForm1
Вставьте следующий код в sheet1:
Private Объявление функции Arc Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long,ByVal X3 как долго, ByVal Y3 как долго, ByVal X4 как долго, ByVal Y4 как долго) как долго
Закрытое Объявление функции ArcTo Lib "gdi32" (ByVal hdc As Long, ByVal X1 Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long,
ByVal X3 как долго, ByVal Y3 как долго, ByVal X4 как долго, ByVal Y4 как долго) как долго
Private Sub Worksheet_SelectionChange (цель ByVal в качестве диапазона)
Dim B As Long
'активировать UC и рисовать на нем (найти свой HDC)
UserForm1.Show
«Поиск вашего HDC в Excel»
monhdc = 0
Делай пока myhdc = 0
myhdc = GetForegroundWindow ()
B = myhdc
myhdc = GetDC (myhdc)
петля
«Нарисуйте прямо на рабочем листе
B = дуга (myhdc, 120, 500, 320, 400, 320, 400, 780, 500)
End Sub
В модуле userform
Вставьте следующий код:
Частный тип POINTAPIX как долго
Y как долго
Тип конца
Закрытое Объявление функции DeleteObject Lib "gdi32" (ByVal hObject As Long) Как долго
Закрытое Объявление функции SelectObject Lib "gdi32" (ByVal hDc As Long, ByVal hObject As Long) Как долго
Закрытое Объявление функции GetForegroundWindow Lib "user32" () As Long
Закрытое Объявление функции CreatePen Lib "gdi32" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) Как долго
Закрытое Объявление функции LineTo Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) Как Long
Закрытое Объявление функции MoveToEx Lib "gdi32" (ByVal hdc As Long, _
ByVal X As Long, ByVal Y As Long, lpPoint As Any) As Long
Закрытая функция объявления GetDC Lib "user32" (ByVal hwnd As Long) As Long
Закрытое Объявление функции SetPixelV Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) как байт
Частный monhdc As Long
Dim Buff As Boolean
Private Sub UserForm_MouseDown (кнопка ByVal как целое число, смещение ByVal как целое число, ByVal X как единое целое, ByVal Y как единое целое)
Buff = True
End Sub
Private Sub UserForm_MouseMove (кнопка ByVal как целое число, смещение ByVal как целое число, ByVal X как единое целое, ByVal Y как единое целое)
Делай пока myhdc = 0
myhdc = GetForegroundWindow ()
myhdc = GetDC (monhdc)
петля
Если кнопка 1, то выход из Sub
hRPen = CreatePen (PS_SOLID, 10, RGB (0, 255, 0))
DeleteObject SelectObject (myhdc, hRPen)
Если бафф то
MoveToEx myhdc, X * 1, 32, Y * 1, 32, & H0
Buff = False
End If
LineTo myhdc, X * 1, 32, Y * 1, 32
DoEvents
End Sub