Получить структуру BITMAP из hDC

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Получить структуру BITMAP из hDC

Сообщение The trick » 27.07.2012 (Пт) 20:59

Здравствуйте уважаемые форумчане! У меня проблемка - не могу получить из картинки, выбранной в DC, структуру BITMAP через GetObject. Вобщем задача узнать размеры изображения выбранного в DC. Делаю вот так:
Код: Выделить всё
Private Function GetSize(DC As Long, ByRef W As Long, ByRef H As Long) As Boolean
     Dim hBmp As Long, BT As BITMAP
     If DC = 0 Then Exit Function
     hBmp = GetCurrentObject(DC, OBJ_BITMAP)
     If hBmp = 0 Then Exit Function
     GetObject hBmp, Len(BT), BT
     W = BT.bmWidth: H = BT.bmHeight
End Function
GetCurrentObject возвращает хэндл, а вот GetObject почему то не заполняет структуру BITMAP. В качестве hDC передаю hDC PictureBox'а . Возможно я неправильно использую ф-цию GetCurrentObject , потому что она возвращает какой-то другой хендл, не соответствующий свойству Image.Handle, не Picture.Handle. GetLastError показывает что все ок, хотя структура BT не заполняется (если перед вызовом функции GetCurrentObject заполнить ее какими-либо значениями, они не изменяются). Если же напрямую передавать в функцию GetObject хендл, т.е. так:
Код: Выделить всё
GetObject PictureBox.Image.Handle,Len(BT),BT
, то все заполняется нормально. Из этого я делаю вывод что ф-ция GetCurrentObject возвращает что-то другое, но не хэндл картинки. Помогите пожалуйста разобратся с этим вопросом, либо же подскажите другой способ узнать размеры изображения, выбранного в DC. Заранее спасибо! :?:
Последний раз редактировалось The trick 28.07.2012 (Сб) 14:41, всего редактировалось 2 раз(а).
UA6527P

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получить структуру BITMAP из hDC

Сообщение Хакер » 28.07.2012 (Сб) 13:59

Ты чё-то всё неправильно говоришь.

Кривоус Анатолий писал(а):выбранной в hDC

Кривоус Анатолий писал(а): выбранного в hDC.

Выбранного в DC, а не в hDC.

Кривоус Анатолий писал(а):В качестве DC передаю DC PictureBox'а .

В качестве hDC, а не DC, передаёшь hDC PictureBox'а, а не DC PictureBox'а.

Декларации API-функций и констант — в студию.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Получить структуру BITMAP из hDC

Сообщение The trick » 28.07.2012 (Сб) 14:39

Спасибо за поправку, исправил :oops: .
Объявления вместе с кодом:
Код: Выделить всё
Private Enum enObjectType
    OBJ_BITMAP = 7
    OBJ_BRUSH = 2
    OBJ_DC = 3
    OBJ_ENHMETADC = 12
    OBJ_ENHMETAFILE = 13
    OBJ_EXTPEN = 11
    OBJ_FONT = 6
    OBJ_MEMDC = 10
    OBJ_METADC = 4
    OBJ_METAFILE = 9
    OBJ_PAL = 5
    OBJ_PEN = 1
    OBJ_REGION = 8
End Enum
Private Type BITMAP
    bmType As Long
    bmWidth As Long
    bmHeight As Long
    bmWidthBytes As Long
    bmPlanes As Integer
    bmBitsPixel As Integer
    bmBits As Long
End Type

Private Declare Function GetLastError Lib "kernel32" () As Long
Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Private Declare Function GetCurrentObject Lib "gdi32" (ByVal hdc As Long, ByVal uObjectType As enObjectType) As Long

Private Function GetSize(DC As Long, ByRef W As Long, ByRef H As Long) As Boolean
    Dim hBmp As Long, BT As BITMAP, pH As Long, iH As Long, lErr As Long
    If DC = 0 Then Exit Function
    iH = picTest.Image.Handle
    pH = picTest.Picture.Handle
    hBmp = GetCurrentObject(DC, OBJ_BITMAP)      ' hBmp-не соответствует ни iH, ни pH
    If hBmp = 0 Then Exit Function
    GetObject hBmp, Len(BT), BT
    lErr = GetLastError()
    W = BT.bmWidth: H = BT.bmHeight
End Function
Private Sub Form_Load()
    Dim W As Long, H As Long
    GetSize picTest.hdc, W, H
End Sub

Вот еще скриншот окна Locals:
Изображение
UA6527P

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: Получить структуру BITMAP из hDC

Сообщение ark » 02.08.2012 (Чт) 11:06

Установи AutoRedraw у PictureBox'а в True. А вообще-то у PictureBox'а два DC - один собственный, другой в памяти, потому для апишных вызовов лучше брать GetDC(PictureBox1.hwnd)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 68

    TopList