Проблема с использованием API в VBA

Программирование на Visual Basic for Applications
lacelho
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 05.02.2007 (Пн) 14:00

Проблема с использованием API в VBA

Сообщение lacelho » 05.02.2007 (Пн) 14:08

Нород, у меня такая проблема: не могу заставить работать процедуру LineTo из стандартной библиотеки gdi32.dll, причём один и тот же код с обычным VB работает на ура, а вот в VBA не хочет, и ошибку никакую не выдает, только нолик при вызове результата отработки процедуры, сообщая тем самым об ошибке внутри библиотеки. Вобщем, не знаю даже что и делать теперь, может кто уже сталкивался с такой проблемой и знает как ее можно решить? Подскажите пожалуйста.

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

Сообщение GSerg » 05.02.2007 (Пн) 14:15

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

lacelho
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 05.02.2007 (Пн) 14:00

Сообщение lacelho » 05.02.2007 (Пн) 14:20

код я брал из примера, находящегося по этой ссылке: http://www.vb.kiev.ua/ref/w32api/showdoc.php?f=lineto
и еще по этой: http://mech.math.msu.su/~vfnik/WinApi/l/lineto.html, тут по-проще

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

Сообщение Viper » 05.02.2007 (Пн) 14:23

И что же не работает? Вернее как не работает? Как у тебя применен код из ссылки?
Весь мир матрица, а мы в нем потоки байтов!

lacelho
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 05.02.2007 (Пн) 14:00

Сообщение lacelho » 05.02.2007 (Пн) 14:33

Из первого примера код я вставил как есть, без изменений, сначала VB6, там все работало как нужно, потом вставил в VBA Excell, там сразу начались проблемы, пришлось убрать самые последние функции, связанные с движением мышки на картинках и кликом на кнопке(код с lineto находится выше и исполняется при загрузке формы), и сам редактор код пропустил, но результата не было...
А во втором случае код выглядел таким образом:

Declare Function LineTo Lib "gdi32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Dim retval As Long
Form1.ForeColor = RGB(255, 0, 0)
retval = LineTo(0, 100, 50)

результат тот-же, и если запросить состояние переменной retval, то получится нолик

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

Сообщение GSerg » 05.02.2007 (Пн) 14:58

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

lacelho
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 05.02.2007 (Пн) 14:00

Сообщение lacelho » 05.02.2007 (Пн) 15:58

А сколько нужно?

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

Сообщение tyomitch » 05.02.2007 (Пн) 16:18

lacelho писал(а):А сколько нужно?

Лол, в цитаты года! :-D


Где линию-то рисуешь? на форме? значит, её hDC и нужно передавать.
Изображение

lacelho
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 05.02.2007 (Пн) 14:00

Сообщение lacelho » 05.02.2007 (Пн) 16:57

а как узнать её hDC

lacelho
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 05.02.2007 (Пн) 14:00

Сообщение lacelho » 05.02.2007 (Пн) 17:18

Нашел я в справке про этот hDC и как его вызвать, вроде бы теперь работает и линия появляется, но сразу же исчезает, как-будто ее сразу стирают. Что можно сделать?
Код:

Private Declare Function FindWindow Lib "user32" _
Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long

Private Declare Function LineTo Lib "gdi32" _
(ByVal hdc As Long, _
ByVal X As Long, _
ByVal Y As Long) As Long


Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long

Public Sub CommandButton1_Click()
Dim retval As Long
Dim hwnd As Long
Dim hdc As Long
hwnd = FindWindow("ThunderDFrame", UserForm1.Caption)
hdc = GetDC(hwnd)
UserForm1.ForeColor = RGB(255, 0, 0)
retval = LineTo(hdc, 100, 50)
MsgBox retval
End Sub

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 05.02.2007 (Пн) 17:30

lacelho, твое настойчивое желание ходить по граблям конечно нужно уважать, но посмотри все-таки свойства hDC и AutoRedraw.
Lasciate ogni speranza, voi ch'entrate.

lacelho
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 05.02.2007 (Пн) 14:00

Сообщение lacelho » 06.02.2007 (Вт) 10:38

Народ, ну ладно прикалываться: да, чего-то не знаю пока, но ведь для того и существуют форумы, чтобы помогать новичкам, разве не так?
Вобщем, не нашел я как для форм VBA устанавливать параметр autoredraw, может подскажите?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 06.02.2007 (Вт) 11:00

Сорри, не заметил, что это VBA.
Lasciate ogni speranza, voi ch'entrate.

lacelho
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 05.02.2007 (Пн) 14:00

Сообщение lacelho » 06.02.2007 (Вт) 11:46

Что-же мне теперь делать? Как справиться с проблемой?

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

Сообщение tyomitch » 06.02.2007 (Вт) 11:54

Ну не иначе, придётся сабклассить форму и ловить WM_PAINT...
Изображение

lacelho
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 05.02.2007 (Пн) 14:00

Сообщение lacelho » 06.02.2007 (Вт) 12:01

А как это? Кодом или ссылочкой не поделитесь?

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

Сообщение tyomitch » 06.02.2007 (Вт) 13:00

Поиск по WM_PAINT, как ни странно, помогает.
Изображение


Вернуться в VBA

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

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

    TopList  
cron