Использование GDI+ в VB6

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
VictorVM
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 03.03.2006 (Пт) 6:37

Использование GDI+ в VB6

Сообщение VictorVM » 03.03.2006 (Пт) 7:17

Существует ли в природе описание API функций GDI+ для VB6 типа WIN32API.txt? Буду очень признателен за помощь.

Виктор

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 03.03.2006 (Пт) 9:38

Существует, но моя обёртка лучше.
Изображение

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 03.03.2006 (Пт) 13:17

Держи :)
Вложения
GDIPlus API.rar
(25.75 Кб) Скачиваний: 668
Если всё делать своими ручками, они скоро отвалятся !

VictorVM
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 03.03.2006 (Пт) 6:37

Использование GDI+ в VB6

Сообщение VictorVM » 04.03.2006 (Сб) 6:48

Я не понял, что значит "держи"?

VictorVM
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 03.03.2006 (Пт) 6:37

Использование GDI+ в VB6

Сообщение VictorVM » 04.03.2006 (Сб) 6:59

Прошу прощения аттачмент не увидел.
Спасибо за пример и декларации.
Буду копать.
Сразу вопрос: Объявления "ByVal graphics As Long" имеют что нить общее с HDC?

С уважением Виктор.

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

Сообщение GSerg » 04.03.2006 (Сб) 7:39

VictorVM
Сказанное Тёмычем существенно лучше сказанного Kovu.

И нет, ByVal graphics As Long не имеет ничего общего с HDC.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 04.03.2006 (Сб) 10:49

GSerg
Если ради пары функций из GDI+ надо таскать обертку.....кароче легче самому сделать
VictorVM
graphics делается из hDc с помощью GdipCreateFromHDC
Где первый параметр хэндл DC из которой мы делаем graphics, а второй собственно возвращаемый graphics :)
Если всё делать своими ручками, они скоро отвалятся !

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Сообщение pronto » 05.03.2006 (Вс) 8:57

Обертка tyomitch'а па VB6pro под Win98SE выдает:

Run-time error '429'
ActiveX component can't create object

Что ему треба в таком разе?
O, sancta simplicitas!

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

Сообщение GSerg » 05.03.2006 (Вс) 9:45

Не ему, а тебе. Зарегистрировать её. И установить GDI+.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

VictorVM
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 03.03.2006 (Пт) 6:37

Сообщение VictorVM » 10.03.2006 (Пт) 6:41

Не получается запустить библиотеку GDI+. При попытке выполнить функцию GdiplusStartup:

Dim tok as Long
Dim ibuf As GdiplusStartupInput
gps = GdiplusStartup (tok, ibuf)

возвращает код ошибки №17(UnsupportedGdiplusVersion). Крутил по всякому. Ничего не получается. Может нужно инициализировать структуру GdiplusStartupInput? Если не трудно покажи какой нибудь пример. Самый крохотный.

С уважением Виктор

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

Сообщение GSerg » 10.03.2006 (Пт) 7:45

Вообще-то надо документацию читать.

Dim p As GdiplusStartupInput
p.GdiplusVersion = 1
GdiplusStartup Token, p, ByVal 0&

Пользуйся обёрткой...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

VictorVM
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 03.03.2006 (Пт) 6:37

Сообщение VictorVM » 10.03.2006 (Пт) 10:51

Нифига не идёт. Вроде всё работает, но ничего не рисует. Подскажите в чём проблема? Примерчик простенький. В коде формы пишу:


Dim graph As Long
Dim tok As Long
Dim hPenRed As Long

Private Sub Form_Load()
Dim p As GdiplusStartupInput
p.GdiplusVersion = 1
ret = GdiplusStartup(tok, p, ByVal 0&)
ret = GdipCreateFromHDC(hdc, graph)
ret = GdipCreatePen1(vbRed, 5, UnitPixel, hPenRed)
End Sub

Private Sub Form_Paint()
ret = GdipDrawEllipseI(graph, hPenRed, 50, 50, 100, 100)
End Sub

Private Sub Form_Unload(Cancel As Integer)
ret = GdipDeletePen(hPenRed)
GdiplusShutdown tok
End Sub

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

Сообщение GSerg » 10.03.2006 (Пт) 11:45

Graphics каждый раз надо заново создавать. И autoredraw учти. И начни читать документацию, наконец.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.03.2006 (Пт) 12:17

VictorVM, ты всерьёз, что ли, собрался освоить GDI+ методом тыка? :-?
Изображение

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 10.03.2006 (Пт) 13:47

GSerg писал(а):Graphics каждый раз надо заново создавать.

Обоснуй
Если всё делать своими ручками, они скоро отвалятся !

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

Сообщение GSerg » 10.03.2006 (Пт) 14:13

Иначе будешь рисовать по старому рисунку.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 10.03.2006 (Пт) 14:21

Извини за назойливость, но каким образом создание новой graphics уберет то что рисуется на DC ? :)
Если всё делать своими ручками, они скоро отвалятся !

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

Сообщение GSerg » 10.03.2006 (Пт) 14:28

Наоборот. Несоздание нового graphics не позволит увидеть изменения.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 10.03.2006 (Пт) 14:32

:) Не угадал, используя один graphics можно рисовать хоть всю программу и видеть изменения . Попробуй скажем в формлоад создать графикс из формы, и порисовать в маусмув скажем линии. Все изменения прекрасно видны :roll:
Если всё делать своими ручками, они скоро отвалятся !

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

Сообщение GSerg » 10.03.2006 (Пт) 14:39

Kovu
Некоторое время назад я писал на заказ контрол на GDI+, который отображал фоновую png-картинку и позволял перемещать по ней произвольное количество других картинок поменьше, задавая этим картинкам любой tint.
Да, это были зубы. Это был контрол для дантиста. Он отображал зубы и позволял рисовать на них разноцветные перемещаемые символы "кариес". Со стрелочками а-ля "См. сюда, студент".

Так вот, если в процедуре Redraw() данного контрола использовать один и тот же graphics, то не были видны перемещения кариеса по зубам, равно как его добавление и удаление, не говоря уже о изменении tint отдельных image. Как только в процедуре Redraw() стал использоваться новый graphics, всё стало отображаться правильно.

Я сделал определённые выводы из написания этого контрола и придерживаюсь их с тех пор.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 10.03.2006 (Пт) 14:52

GSerg
Видимо я делаю что-то не так что у меня норм обновляется, а может просто ситуация другая :roll:
Если всё делать своими ручками, они скоро отвалятся !

VictorVM
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 03.03.2006 (Пт) 6:37

Сообщение VictorVM » 11.03.2006 (Сб) 10:33

Парни может всё-таки с примером поможете? Или подскажите где можно почитать.

Виктор

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

Сообщение GSerg » 11.03.2006 (Сб) 10:37

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

VictorVM
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 03.03.2006 (Пт) 6:37

Сообщение VictorVM » 11.03.2006 (Сб) 11:12

Тут я уже смотрел. В MSDN есть такой сишный пример:

Неиспользование форматирования кода есть неуважение к участникам форума.
Код: Выделить всё
#define UNICODE
#include <windows.h>
#include <gdiplus.h>
using namespace Gdiplus;

VOID OnPaint(HDC hdc)
{
   Graphics graphics(hdc);
   Pen      pen(Color(255, 0, 0, 255));
   graphics.DrawLine(&pen, 0, 0, 200, 100);
}

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT iCmdShow)
{
   HWND                hWnd;
   MSG                 msg;
   WNDCLASS            wndClass;
   GdiplusStartupInput gdiplusStartupInput;
   ULONG_PTR           gdiplusToken;
   
   // Initialize GDI+.
   GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
   
   wndClass.style          = CS_HREDRAW | CS_VREDRAW;
   wndClass.lpfnWndProc    = WndProc;
   wndClass.cbClsExtra     = 0;
   wndClass.cbWndExtra     = 0;
   wndClass.hInstance      = hInstance;
   wndClass.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
   wndClass.hCursor        = LoadCursor(NULL, IDC_ARROW);
   wndClass.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH);
   wndClass.lpszMenuName   = NULL;
   wndClass.lpszClassName  = TEXT("GettingStarted");
   
   RegisterClass(&wndClass);
   
   hWnd = CreateWindow(
      TEXT("GettingStarted"),   // window class name
      TEXT("Getting Started"),  // window caption
      WS_OVERLAPPEDWINDOW,      // window style
      CW_USEDEFAULT,            // initial x position
      CW_USEDEFAULT,            // initial y position
      CW_USEDEFAULT,            // initial x size
      CW_USEDEFAULT,            // initial y size
      NULL,                     // parent window handle
      NULL,                     // window menu handle
      hInstance,                // program instance handle
      NULL);                    // creation parameters
    
   ShowWindow(hWnd, iCmdShow);
   UpdateWindow(hWnd);
   
   while(GetMessage(&msg, NULL, 0, 0))
   {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }
   
   GdiplusShutdown(gdiplusToken);
   return msg.wParam;
}  // WinMain

LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
   WPARAM wParam, LPARAM lParam)
{
   HDC          hdc;
   PAINTSTRUCT  ps;
   
   switch(message)
   {
   case WM_PAINT:
      hdc = BeginPaint(hWnd, &ps);
      OnPaint(hdc);
      EndPaint(hWnd, &ps);
      return 0;
   case WM_DESTROY:
      PostQuitMessage(0);
      return 0;
   default:
      return DefWindowProc(hWnd, message, wParam, lParam);
   }
} // WndProc


По сути он аналогичен следующему коду на VB:
Код: Выделить всё
Dim graph As Long
Dim tok As Long
Dim hPenRed As Long
Dim p As GdiplusStartupInput

Private Sub Form_Load()
    p.GdiplusVersion = 1
    ret = GdiplusStartup(tok, p, ByVal 0&)
End Sub

Private Sub Form_Paint()
    ret = GdipCreateFromHDC(hdc, graph)
    ret = GdipCreatePen1(vbRed, 5, UnitPixel, hPenRed)
    ret = GdipDrawLine(graph, hPenRed, 0, 0, 200, 100)
End Sub

Private Sub Form_Unload(Cancel As Integer)
    ret = GdipDeleteGraphics(graph)
    ret = GdipDeletePen(hPenRed)
    GdiplusShutdown tok
End Sub


Но только нифигаааааааааааааа не работает!

Виктор

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.03.2006 (Сб) 11:32

VictorVM, не проще ли будет разобраться с моей обёрткой?

С ней весь код будет состоять из одной строчки:
Код: Выделить всё
Private Sub Form_Paint()
CreateGraphics(hDC).DrawLine CreatePen(ARGB(vbRed), 5), 0, 0, 200, 100
End Sub

Причём он -- что весьма приятно -- ещё и будет работать ;-)
Изображение

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

Сообщение GSerg » 11.03.2006 (Сб) 11:34

Хочу повторить вопрос Тёмыча - ты правда хочешь изучить GDI+ методом тыка?

Во-первых, у тебя жуткая утечка ресурсов, поскольку при каждом paint создаются новые graphics и pen, а уничтожается только последняя пара. В сишном коде этого нет, там классы, которые сами дохнут при выходе из области видимости.
Во-вторых, цвет в заявлен формате ARGB, если передать vbRed, получишь vbBlue.
И наконец, всё рисуется, просто цвет заявлен в формате ARGB, где A - альфа-канал, который у тебя равен 0, т.е. 100% прозрачность. Смотрим сишный код. Color(255, 0, 0, 255); Делаем выводы и пробуем &hFF000000& Or vbRed.

И убери утечку ресурсов эту жуткую.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 11.03.2006 (Сб) 11:42

а нефига - эт сколько? что-то же должно работать? Да и с идентичностью кода мягко говоря не все здорово
Весь мир матрица, а мы в нем потоки байтов!

VictorVM
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 03.03.2006 (Пт) 6:37

Сообщение VictorVM » 11.03.2006 (Сб) 13:26

Всё! Разобрался! Действительно "&hFF000000& Or vbRed" в создании пера сняло все проблемы.
Насчёт прямотаки "жуткой утечки ресурсов" полностью согласен. Просто когда эксперементировал, попробовал совет GSerg:
"Graphics каждый раз надо заново создавать".
Короче всё теперь выглядит чудно:

Код: Выделить всё

Dim graph As Long, tok As Long, hPenRed As Long
Dim p As GdiplusStartupInput

Private Sub Form_Load()
    p.GdiplusVersion = 1
    ret = GdiplusStartup(tok, p, ByVal 0&)
    ret = GdipCreatePen1(&HFF000000 Or vbRed, 5, UnitPixel, hPenRed)
    ret = GdipCreateFromHDC(hdc, graph)
End Sub

Private Sub Form_Paint()
    ret = GdipDrawLine(graph, hPenRed, 0, 0, 200, 100)
End Sub

Private Sub Form_Unload(Cancel As Integer)
    ret = GdipDeleteGraphics(graph)
    ret = GdipDeletePen(hPenRed)
    GdiplusShutdown tok
End Sub

st@s
Начинающий
Начинающий
 
Сообщения: 1
Зарегистрирован: 15.01.2007 (Пн) 21:14

Re:

Сообщение st@s » 20.09.2008 (Сб) 16:29

tyomitch писал(а):не проще ли будет разобраться с моей обёрткой?



Да нет её там.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Re:

Сообщение tyomitch » 21.09.2008 (Вс) 17:27

st@s писал(а):
tyomitch писал(а):не проще ли будет разобраться с моей обёрткой?



Да нет её там.

Хостеры озверели. Воспользовались моим продолжительным отсутствием.
Последняя версия библиотеки приаттачена; пример использования придётся поискать.
Вложения
gdi+.zip
(73.39 Кб) Скачиваний: 352
Изображение

След.

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

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

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

    TopList