Графика на форме через Handle

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
X-BOND
Реалист
Реалист
 
Сообщения: 944
Зарегистрирован: 19.08.2002 (Пн) 11:44
Откуда: Ukraine

Графика на форме через Handle

Сообщение X-BOND » 21.01.2004 (Ср) 20:42

Загружаю картинку с помощью LoadImage
Можно ли с помощью BitBlt нарисовать ее, зная Handle?

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 22.01.2004 (Чт) 0:22

Можно!

BitBlt Form.hDC, 0, 0, 100, 100, PictureBox.hDC, 0, 0, &HCC0020

X-BOND
Реалист
Реалист
 
Сообщения: 944
Зарегистрирован: 19.08.2002 (Пн) 11:44
Откуда: Ukraine

Сообщение X-BOND » 22.01.2004 (Чт) 12:36

Попровляюсь:
LoadImage
это функция Private Declare Function LoadImage Lib "user32" Alias "LoadImageA" (ByVal hInst As Long, ByVal lpsz As String, ByVal dwImageType As Long, ByVal dwDesiredWidth As Long, ByVal dwDesiredHeight As Long, ByVal dwFlags As Long) As Long которая возвращает, цетирую: ...the return value is the handle of the newly loaded image

Никаких пикчеров на форме у меня нет.
Надо, зная этот handle нарисовать на форме картинку.

Kostyan
Постоялец
Постоялец
 
Сообщения: 439
Зарегистрирован: 20.09.2002 (Пт) 4:14
Откуда: Россия, Уссурийск

Сообщение Kostyan » 22.01.2004 (Чт) 14:35

Конечно можно, только, как говорится, через ж...
Код: Выделить всё
hIm = LoadImage(0, "C:\bg.bmp", 0, 0, 0, 80)
CompDC = CreateCompatibleDC(Me.hdc)
OldIm = SelectObject(CompDC, hIm)
Call DeleteObject(hIm)
Call BitBlt(Me.hdc, 0, 0, Me.ScaleWidth, Me.ScaleHeight, CompDC, 0, 0, vbSrcCopy)
Call SelectObject(CompDC, OldIm)
Call DeleteDC(CompDC)
Me.Refresh

И поставь у формы ScaleMode=3, AutoRedraw=True

X-BOND
Реалист
Реалист
 
Сообщения: 944
Зарегистрирован: 19.08.2002 (Пн) 11:44
Откуда: Ukraine

Сообщение X-BOND » 22.01.2004 (Чт) 15:11

Спсибо, работает :wink:

Но *.gif я так понял, этим способом нарисовать не получится?

Kostyan
Постоялец
Постоялец
 
Сообщения: 439
Зарегистрирован: 20.09.2002 (Пт) 4:14
Откуда: Россия, Уссурийск

Сообщение Kostyan » 23.01.2004 (Пт) 1:18

Я тоже так понял, ни gif, ни jpg не загрузишь этой этой функцией.

X-BOND
Реалист
Реалист
 
Сообщения: 944
Зарегистрирован: 19.08.2002 (Пн) 11:44
Откуда: Ukraine

Сообщение X-BOND » 24.01.2004 (Сб) 1:50

Можно, в принципе, использовать TransparentBlt наверно...

А вообще, как по грамотному вывести графику на форме, не используя ни одного контрола?

Kostyan
Постоялец
Постоялец
 
Сообщения: 439
Зарегистрирован: 20.09.2002 (Пт) 4:14
Откуда: Россия, Уссурийск

Сообщение Kostyan » 24.01.2004 (Сб) 7:15

Ты наверное не понял, функция LoadImage может открывать ТОЛЬКО bmp, ico и cur файлы, больше ничего.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.01.2004 (Сб) 9:59

loadpicture открывает и jpg, и gif, и tiff, и ещё чёрт знает что ещё. А savepicture, действительно, в bmp.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Kostyan
Постоялец
Постоялец
 
Сообщения: 439
Зарегистрирован: 20.09.2002 (Пт) 4:14
Откуда: Россия, Уссурийск

Сообщение Kostyan » 24.01.2004 (Сб) 10:37

2 X-BOND:
Вот тебе и решение. Чтобы загружать любые форматы и не использовать контролов используй LoadPicture, она как раз возвращает дискриптор рисунка, который можо использовать в API-функциях. Вот пример, который я давал тебе выше, но уже переделаный под LoadPicture:
Код: Выделить всё
CompDC = CreateCompatibleDC(Me.hdc)
OldIm = SelectObject(CompDC, LoadPicture("C:\1.jpg"))
Call BitBlt(Me.hdc, 0, 0, Me.ScaleWidth, Me.ScaleHeight, CompDC, 0, 0, vbSrcCopy)
Call DeleteObject(SelectObject(CompDC, OldIm))
Call DeleteDC(CompDC)
Me.Refresh

X-BOND
Реалист
Реалист
 
Сообщения: 944
Зарегистрирован: 19.08.2002 (Пн) 11:44
Откуда: Ukraine

Сообщение X-BOND » 26.01.2004 (Пн) 11:51

Как говорится, век живи - век учись
Спасибо :wink:


P.S.
X-BOND писал(а):Можно, в принципе, использовать TransparentBlt наверно...

Я имел ввиду, что можно использовать BMP файл с ключевым цветом фона вместо GIF.

anian
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 116
Зарегистрирован: 02.10.2002 (Ср) 12:05
Откуда: /dev/null

Сообщение anian » 17.06.2004 (Чт) 16:10

Тогда такой вопрос:

имею объект picMem as Picture (или IPicture, или IPictureDisp...без разницы в данном случае)

загружаем в него иконку, потом пишем:
Код: Выделить всё
    lhDC = CreateCompatibleDC(Me.hdc)
       If lhDC <> 0 Then
          lhBmpOld = SelectObject(lhDC, picMem.Handle) ' *1
             If lhBmpOld <> 0 Then
                BitBlt Me.hdc, 50, 50, lpicWidth, lpicHeight, lhDC, 0, 0, SRCCOPY
                   SelectObject lhDC, lhBmpOld
       End If


Запускаю и вижу, шо lhBmpOld после (*1) равен 0, а lhDC не изменился...BitBlt, соответственно, ни фига не рисует...
Где косяк - не пойму..может у меня в генах? :)
Трез-вы-ми мы не сда-дим-сииии!!! Ураааааа!!!

Kostyan
Постоялец
Постоялец
 
Сообщения: 439
Зарегистрирован: 20.09.2002 (Пт) 4:14
Откуда: Россия, Уссурийск

Сообщение Kostyan » 18.06.2004 (Пт) 0:39

Так ты пиши не picMem.Handle а picMem.Picture.Handle ну вобщем, поэкспериментируй сам. Должно быть какое-то свойство у PictureBox, в котором содержится тот самый дескриптор рисунка.
Нет ничего невозможного для человека с интеллектом.

anian
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 116
Зарегистрирован: 02.10.2002 (Ср) 12:05
Откуда: /dev/null

Сообщение anian » 18.06.2004 (Пт) 9:30

picMem - это не PictureBox, а переменная типа Picture...
Имеет свойства: width, height, hPal, Handle, type и метод Render...все, больше ничего нет. Функции типа DrawIcon с удовольствием хавают Handle, а вот BitBlt не хочет.
Трез-вы-ми мы не сда-дим-сииии!!! Ураааааа!!!

anian
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 116
Зарегистрирован: 02.10.2002 (Ср) 12:05
Откуда: /dev/null

Сообщение anian » 21.06.2004 (Пн) 17:02

Хмм...вот ежели в Picture засунуть битмапу, то битблт хавает...ежели иконку, то нет..пробовал создавать объект Picture через OleCreateIndirectBitmap - на CurDC ругается...
Трез-вы-ми мы не сда-дим-сииии!!! Ураааааа!!!


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

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

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

    TopList