WinAPI & VBA или WinAPI & VB - в чем разница

Программирование на Visual Basic for Applications
alex-lev9
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 13.07.2005 (Ср) 15:31

WinAPI & VBA или WinAPI & VB - в чем разница

Сообщение alex-lev9 » 09.09.2005 (Пт) 9:38

По мере углубления в изучение WinAPI у меня невольно возникает подозрение, что взаимодействие WinAPI с VBA происходит несколько иначе, чем взаимодействие WinAPI с VB.
Основано мое подозрение на том, что я не могу ни один пример из API-guide применить к VBA :shock: .

В чем разница?

Как применить в VBA функцию WinAPI, например, TextOut?

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

Сообщение alibek » 09.09.2005 (Пт) 9:40

Функции везде одинаковые, хоть в VB, хоть в VBA, хоть в VC.
Просто формы VBA совсем не такие, как формы VB. В частности, до hWnd и hDC добраться можно только нестандартными способами.
Lasciate ogni speranza, voi ch'entrate.

alex-lev9
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 13.07.2005 (Ср) 15:31

Сообщение alex-lev9 » 09.09.2005 (Пт) 10:25

до hWnd и hDC добраться можно только нестандартными способами.

Если это не военная тайна, то каким образом?
Я попытаюсь поискать инфу в сети, но если есть готовая ссылка на описание этих проблем, то прошу выложить ее на обозрение

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

Сообщение alibek » 09.09.2005 (Пт) 10:37

FindWindowEx, например.
А что ты хочешь сделать?
Lasciate ogni speranza, voi ch'entrate.

alex-lev9
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 13.07.2005 (Ср) 15:31

Сообщение alex-lev9 » 09.09.2005 (Пт) 10:56

История моя длинная.
У меня есть документ Excel, содержащий порядка десяти столбцов и под сотню строк. По первым пяти столбцам производится фильтрация таблицы с применением ComboBox-ов. Эти самые ComboBox-ы расположены (в настоящее время) на странице в ячейках первой строки. Все работает прекрасно. Но мне не очень нравится, что при определенных параметрах фильтра, когда общая щирина строк, не скрытых от глаз, превышает ширину экрана, после просмотра последней строки нужно прокручивать страницу в начало, чтобы выбрать новый параметр фильтрации. Было бы гораздо удобнее, если бы ComboBox всегда находился над прокручиваемой страницей.
Для этого я планировал сделать форму с ComboBox-ами. Участки формы не под ComboBox сделать невидимыми.
Но тут выяснилось, что это можно сделать только средствами WinAPI. А, поскольку я не волшебник, а только учусь, приходится втыкать все самому методом проб и ошибок. Поэтому и задаю глупые вопросы. Более того, я их буду задавать и в дальнейшем, за что прошу снисходительного ко мне отношения.

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

Сообщение alibek » 09.09.2005 (Пт) 11:02

А ты знаешь, что можно сделать первые три (например) строки непрокручиваемым? Для этого надо стать курсором на четвертую строку и выполнить команду "Закрепить области".
Lasciate ogni speranza, voi ch'entrate.

alex-lev9
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 13.07.2005 (Ср) 15:31

Сообщение alex-lev9 » 09.09.2005 (Пт) 11:50

Нет, этого я не знал. Спасибо, получилось интересно. Но... :oops:

Но мои ComboBox находятся в ячейках вместе с названиями столбцов.
Соответственно, прокручиваются вместе с заголовком таблицы. А я забыл сказать, что на странице две таблицы - одна под другой - и не очень здорово, когда заголовок верхней попадает на территорию нижней таблицы. Поэтому мне все-таки удобнее организовать все это мероприятие так, как я описал.
Во всяком случае, альтернативных методов я пока еще не знаю.
Да и с WinAPI все равно разбираться надо рано или поздно. Так почему не сейчас?

alex-lev9
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 13.07.2005 (Ср) 15:31

Сообщение alex-lev9 » 09.09.2005 (Пт) 13:51

Разобрался:

Private Declare Function TextOut Lib "gdi32" _
Alias "TextOutA" _
(ByVal hdc As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal lpString As String, _
ByVal nCount As Long) As Long

Private Declare Function FindWindow Lib "user32" _
Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) 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)
retval = TextOut(hdc, 0, 0, "Проба пера", 10)
End Sub

Функционирует

Димитрий
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 194
Зарегистрирован: 26.01.2005 (Ср) 22:47
Откуда: Волгоград

Сообщение Димитрий » 09.09.2005 (Пт) 18:31

Есть ещё неплохое решение - комбобоксы на командной панели. Не подойдёт?


Вернуться в VBA

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 84

    TopList