Vb6, Win32api и прочие Dll

Тема в разделе "Visual Basic", создана пользователем AndreyMihailov, 19 дек 2010.

Статус темы:
Закрыта.
  1. AndreyMihailov

    AndreyMihailov Гость

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

    Код Win32API.bas
    Код (Text):
    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
    Код (Text):
    'Масти карт
    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
    Код (Text):
    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
    При компиляции ошибок не выдаётся, но вместо исполнения программы среда просто выгружается...
    Подскажите, в чём ошибка?
     
  2. AndreyMihailov

    AndreyMihailov Гость

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

    Private Sub Form_Paint()
    cdtDraw Me.hDC, 100, 100, 49, 0, vbWhite
    End Sub
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей