Vb6, Win32api и прочие Dll

  • Автор темы AndreyMihailov
  • Дата начала
Статус
Закрыто для дальнейших ответов.
A

AndreyMihailov

#1
Впервые столкнулся с использованием Win32API и cards.dll из WinXP в вижуалбэйсике. Захотелось (просто тренировки ради) вывести на форму изображение пары карт... После беглого прочтения книги "Дэн Эпплман Win32API и VisualBASIC" родился проект, состоящий из двух модулей (Win32API.bas и CardsLibAPI.bas) и одной формы

Код Win32API.bas
Код:
Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Type PAINTSTRUCT
hDC As Long
fErase As Long
rcPaint As RECT
fRestore As Long
fIncUpdate As Long
rgbReserved(31) As Byte
End Type

Declare Function BeginPaint Lib "user32" (ByVal hwnd As Long, lpPaint As PAINTSTRUCT) As Long
Declare Function EndPaint Lib "user32" (ByVal hwnd As Long, lpPaint As PAINTSTRUCT) As Long
Declare Function DeleteDC Lib "gdi32" (ByVal hDC As Long) As Long
Код CardsLibAPI.bas
Код:
'Масти карт
Public Enum eSUIT
Clubs = 0	' трефы
Diamond = 1 ' бубны
Hearts = 2 ' черви
Spades = 3 ' пики
End Enum

'Номинал карты
Public Enum eFace
Ace = 0	' туз
Two = 1	' двойка
Three = 2 ' тройка
Four = 3	' четверка
Five = 4	' пятерка
Six = 5	' шестерка
Seven = 6 ' семерка
Eight = 7 ' восьмерка
Nine = 8  ' девятка
Ten = 9	 ' десятка
Jack = 10  ' валет
Queen = 11 ' дама
King = 12 ' король
End Enum

' Картинки для рубашки
Public Enum eBack
Crosshatch = 53 ' Сетка
Sky = 54		' Небо
Mineral = 55	' Минерал
Fish = 56	 ' Рыба
Frog = 57	 ' Лягушка
Flower = 58	' Цветок
Island = 59	' Остров с пальмами
Sqiares = 60	' Квадраты
Magenta = 61	' Фиолетовый узор
Sanddunes = 62 ' Песчаные дюны
Space = 63	 ' Астронавт
Lines = 64	 ' Линии
Cars = 65	 ' Машинки
unused = 66	' Неиспользуемая карта
TheX = 67	 ' Символ X
TheO = 68	 ' Символ 0
End Enum

Public hndlLib As Long

Declare Function cdtInit Lib "cards.dll" (ByRef Width As Integer, ByRef Height As Integer) As Integer
Declare Function cdtDrawExt Lib "cards.dll" (ByVal hDC As Long, ByVal X As Integer, ByVal Y As Integer, ByVal Width As Integer, ByVal Height As Integer, ByVal Card As Integer, ByVal Suit As Integer, ByVal Color As Integer) As Integer
Declare Sub cdtTerm Lib "cards.dll" ()
Код Form1
Код:
Dim result As Variant
Dim mintWidth As Integer
Dim mintHeight As Integer
Dim pnt As PAINTSTRUCT

Private Sub Form_Load()
mintWidth = 10
mintHeight = 100
result = cdtInit(ByVal mintWidth, ByVal mintHeight)
End Sub

Private Sub Form_Paint()
hDC = BeginPaint(ByVal hWin, pnt)
result = cdtDrawExt(ByVal hDC, 10, 10, ByVal mintWidth, ByVal mintHeight, 11, 0, 0) ' рисуем даму треф
result = EndPaint(ByVal hWin, pnt)
result = DeleteDC(ByVal hDC)
End Sub

Private Sub Form_Unload(Cancel As Integer)
Call cdtTerm
End
End Sub
При компиляции ошибок не выдаётся, но вместо исполнения программы среда просто выгружается...
Подскажите, в чём ошибка?
 
A

AndreyMihailov

#2
Не так заключалось в излишнем углублении в виндовые дебри - негативно сказался опыт работы в FreeBASIC ;)
Ошибка была в получении контекста устройства - не нужны для этого ни BeginPaint, ни даже GetDC. Контекст получаем с помощью Me.hDC. Соответственно, отпадает потребность и в получении хэндла окна. Итого результат выглядит так:
Код:
Private Sub Form_Load()
retval = cdtInit(100, 300)
End Sub

Private Sub Form_Paint()
cdtDraw Me.hDC, 100, 100, 49, 0, vbWhite
End Sub
 
Статус
Закрыто для дальнейших ответов.