Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

КАК использовать сообщения

6.6K
28 марта 2004 года
stealZzz
3 / / 28.03.2004
Можно ли вообще и КАК использовать в VB
виндовые сообщения, тот же WM_SIZE например ?
----
обьявляю как константу....не пашет :(
Расскажите с начала и до конца :)
258
29 марта 2004 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by stealZzz
Можно ли вообще и КАК использовать в VB
виндовые сообщения, тот же WM_SIZE например ?
----
обьявляю как константу....не пашет :(
Расскажите с начала и до конца :)



виндовые сообщения в принципе использовать можно, если так конечно вообще можно выразится.
Для начала расскажи немного о себе, какой у тебя уровень знаний в этом вопросе: ты программировал на Си под Windows и теперь хочешь применить свои познания в VB? ты знаком с понятиями: winAPI, WindowProc, hWnd или же ты просто где-то услышал про винд. сообщения и не знаешь каким боком это относится к VB?

6.6K
29 марта 2004 года
stealZzz
3 / / 28.03.2004
Цитата:
Originally posted by SergeySV


виндовые сообщения в принципе использовать можно, если так конечно вообще можно выразится.
Для начала расскажи немного о себе, какой у тебя уровень знаний в этом вопросе: ты программировал на Си под Windows и теперь хочешь применить свои познания в VB? ты знаком с понятиями: winAPI, WindowProc, hWnd или же ты просто где-то услышал про винд. сообщения и не знаешь каким боком это относится к VB?



иНТИРЕСНЫЙ ПОДХОД :)
пишу на С++, ради интиреса решил узнать что такое VB
-----
так что можешь обьснять как угодно , ТОЛЬКО ОБЬЯСНИ :) а не выпендривайся :)..юмор
Ну такс начнем отвечать ?

258
30 марта 2004 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by stealZzz


иНТИРЕСНЫЙ ПОДХОД :)
пишу на С++, ради интиреса решил узнать что такое VB
-----
так что можешь обьснять как угодно , ТОЛЬКО ОБЬЯСНИ :) а не выпендривайся :)..юмор
Ну такс начнем отвечать ?



Работа с win сообщениями, а точнее с winAPI мало зависит от языка программирования (и/или среды программирования). Поэтому нет особой разницы на чем ты программируешь, просто если ты учился программировать в современных визуальных средах программирования (типа: Delphi, Microsoft Visual Cи++, Borland Cи++ и т.д.), то ты был защищен от всех прелестей взаимодействия с winAPI, за тебя эту работу выполнял IDE среды программирования.

Меня в инстите в свое время пичкали Си под windows, где приходилось все делать ручками, а Delphi токо появился и я помню какое же это было удовольствие создавать интерфейс и код в Deplhi за 5 мин., на что в Си уходило часа 2. Ради Deplhi я даже паскаль выучил и перевел с Си свою курсовую программу.

Так что Си++ это конечно супер, но хорошо бы знать в какой среде ты программировал и имел дело с winAPI.
Просто если тебя интересуют особенности использования winAPI функций и структур в VB, тогда не имеет смысла тратить на объяснения сути работы windows и его API.

319
30 марта 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by SergeySV


Работа с win сообщениями, а точнее с winAPI мало зависит от языка программирования (и/или среды программирования). Поэтому нет особой разницы на чем ты программируешь, просто если ты учился программировать в современных визуальных средах программирования (типа: Delphi, Microsoft Visual Cи++, Borland Cи++ и т.д.), то ты был защищен от всех прелестей взаимодействия с winAPI, за тебя эту работу выполнял IDE среды программирования.

Меня в инстите в свое время пичкали Си под windows, где приходилось все делать ручками, а Delphi токо появился и я помню какое же это было удовольствие создавать интерфейс и код в Deplhi за 5 мин., на что в Си уходило часа 2. Ради Deplhi я даже паскаль выучил и перевел с Си свою курсовую программу.

Так что Си++ это конечно супер, но хорошо бы знать в какой среде ты программировал и имел дело с winAPI.
Просто если тебя интересуют особенности использования winAPI функций и структур в VB, тогда не имеет смысла тратить на объяснения сути работы windows и его API.


что интересует - это как переопределять стандартные обработчики для сообщений. Т.е. есть стандартное сообщение - как объявить функцию, чтобы она вызывалась при приходе этого сообщения (как связать функцию с некоторым сообщением). Мне тоже интересна эта тема.

258
30 марта 2004 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by xelos

что интересует - это как переопределять стандартные обработчики для сообщений. Т.е. есть стандартное сообщение - как объявить функцию, чтобы она вызывалась при приходе этого сообщения (как связать функцию с некоторым сообщением). Мне тоже интересна эта тема.



Понимаешь, сообщение windows это всего лишь один из типов взаимодействующих объектов в системе, причем вспомогательный. Чтобы что-то ваять под windows вот так напрямую, через winAPI, надо хотя бы в общих чертах представлять себе работу windows программ, как именно они взаимодействуют с системой.

Очень хорошая книга по программирование под windows - Ч.Петзольд (http://anatolix.naumen.com/win32books.htm) - это классика. Подробно и в тоже время доступно, потому что написано для людей, которые знают язык программирования, но никогда не программировали под Windows, т.е. все с самого начала.
Он использует в примерах Си, но тебя это не должно смущать, разобраться не сложно, а для понимание сути обсуждаемых вопросов язык программирования вообще не главное.

В качестве путеводной нити по вышеуказанному вопросу могу сказать следующее:
сообщения винды направляют конкретному окну, поэтому для начала надо определится с каким окном мы собираемся работать. Или это будет уже созданное нами окно в МИ редакторе или мы в самом коде создаем окно через winAPI CreateWindow() и иже с ним.
За каждым окном закрепляется функция WndProc - функция обработки сообщений, которая и занимается обработкой сообщений.
Если ты хочешь во всем разобраться, то все это хорошо бы прочитать в Петзольд'е, он там в первых главах как раз очень хорошо все рассказывает о струтуре программы под винды.

От себя добавлю, что все программы/формы которые мы делаем в VB редакторе, также подчиняется этим правилам. Просто МИ редактор искусно скрывает от нас основную начинку кода, в том числе и функции WndProc.

Еще одно маленькое уточнение. У Петзольда пояти все программы создают окна сами, через CreateWindow(), в случае же когда мы программируем в VB и хотим использовать уже сварганенную нами форму обычно идут по такому пути. VB уже без нас создает окно (это наша форма) и прикрепляет к нему полностью написанную WndProc, но мы можем переопределить функцию WndProc на свою. В своей функции мы уже сами обрабатываем пришедшее окну сообщение ну а потом, обычно, сохранив ссылку на старую WndProc передаем управление в нее (просто если мы не будем это делать, то тогда придется самим обрабатывать все приходящие в окно сообщения, а это приличный кусок кода, тем более что он уже повторяет зачастую бывшую WndProc) - это технология получила название - САБКЛАССИНГ (subclassing)

Пример использования сабклассинга в Excel'е можно посмотреть в Исходниках/Офисные программы, там я подключался к окну формы, чтобы отловить событие поворот колесика мыши..... но прежде чем копаться в коде, я тебе очень советовал почитать первые главы Петзольда.

319
30 марта 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by SergeySV


Понимаешь, сообщение windows это всего лишь один из типов взаимодействующих объектов в системе, причем вспомогательный. Чтобы что-то ваять под windows вот так напрямую, через winAPI, надо хотя бы в общих чертах представлять себе работу windows программ, как именно они взаимодействуют с системой.

Очень хорошая книга по программирование под windows - Ч.Петзольд (http://anatolix.naumen.com/win32books.htm) - это классика. Подробно и в тоже время доступно, потому что написано для людей, которые знают язык программирования, но никогда не программировали под Windows, т.е. все с самого начала.
Он использует в примерах Си, но тебя это не должно смущать, разобраться не сложно, а для понимание сути обсуждаемых вопросов язык программирования вообще не главное.

В качестве путеводной нити по вышеуказанному вопросу могу сказать следующее:
сообщения винды направляют конкретному окну, поэтому для начала надо определится с каким окном мы собираемся работать. Или это будет уже созданное нами окно в МИ редакторе или мы в самом коде создаем окно через winAPI CreateWindow() и иже с ним.
За каждым окном закрепляется функция WndProc - функция обработки сообщений, которая и занимается обработкой сообщений.
Если ты хочешь во всем разобраться, то все это хорошо бы прочитать в Петзольд'е, он там в первых главах как раз очень хорошо все рассказывает о струтуре программы под винды.

От себя добавлю, что все программы/формы которые мы делаем в VB редакторе, также подчиняется этим правилам. Просто МИ редактор искусно скрывает от нас основную начинку кода, в том числе и функции WndProc.

Еще одно маленькое уточнение. У Петзольда пояти все программы создают окна сами, через CreateWindow(), в случае же когда мы программируем в VB и хотим использовать уже сварганенную нами форму обычно идут по такому пути. VB уже без нас создает окно (это наша форма) и прикрепляет к нему полностью написанную WndProc, но мы можем переопределить функцию WndProc на свою. В своей функции мы уже сами обрабатываем пришедшее окну сообщение ну а потом, обычно, сохранив ссылку на старую WndProc передаем управление в нее (просто если мы не будем это делать, то тогда придется самим обрабатывать все приходящие в окно сообщения, а это приличный кусок кода, тем более что он уже повторяет зачастую бывшую WndProc) - это технология получила название - САБКЛАССИНГ (subclassing)

Пример использования сабклассинга в Excel'е можно посмотреть в Исходниках/Офисные программы, там я подключался к окну формы, чтобы отловить событие поворот колесика мыши..... но прежде чем копаться в коде, я тебе очень советовал почитать первые главы Петзольда.


я довольно давно программирую под Windows на VC++ с использованием MFC или просто на API, так что я очень хорошо себе представляю работу системы. про сообщения - из очереди сообщений процесса, сообщения выбираются последовательно и перенаправляются окну. обработчик ищется по достаточно интересному алгоритму - сначала анализируется код основного окна, если обработчик не найден, спускаемся к окнам, которые на уровень ниже и т.д. пока не найдем обработчик или не удостоверимся что нет его. при программировании на VC++ есть специальная директива, указывающая, что обработчик сообщения идентифицируется с определенной функцией (это когда мы хотим перегрузить стандартный обработчик). Т.е. я могу написать совершенно произвольную функцию и асоциировать ее с определенным сообщением (причем сообщение может быть не только системное, но и пользовательское - т.е. определенное нами для наших нужд). Вопрос конкретно по VB - как связать определенную функцию с определенным сообщением? т.е. чтобы эта функция вызывалась программой при приходе конкретного сообщения (есс-но я знаю какое сообщение хочу обработать).

258
30 марта 2004 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by xelos
Вопрос конкретно по VB - как связать определенную функцию с определенным сообщением? т.е. чтобы эта функция вызывалась программой при приходе конкретного сообщения (есс-но я знаю какое сообщение хочу обработать).



Тогда вопрос ставится так - Как связать свою функцию с конкретным окном???

При такой постановке вопроса, я предполагаю что ты знаешь hWnd окна сообщения которого хочешь перехватить. Тогда:

В обычном модуле (НЕ модуль-классе) ты должен объявить функцию такого вида:

 
Код:
Public Function [NameFunction](ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal LParam As Long) As Long

*[NameFunction] - любое имя функции

Теперь как эту функцию прикрепить к выбранному окну.
где-нибудь в коде:
 
Код:
Dim lpPrevWndProc As Long
lpPrevWndProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf [NameFunction])


Фишка как понимаешь в операторе AddressOf который указывает VB что передавать в функцию SetWindowLong надо именно адрес твоей функции [NameFunction], а не какую-то переменную...

Переменная lpPrevWndProc обычно используется для того, чтобы в конце своей функции [NameFunction] передать управление на предыдущую WndProc. Соответственно в конце кода функции [NameFunction] пишешь:
 
Код:
[NameFunction] = CallWindowProc(lpPrevWndProc, hWnd, uMsg, wParam, LParam)
End Function


Перед закрытием окна, желательно отсоеднится от окна:
 
Код:
SetWindowLong hWnd, GWL_WNDPROC, lpPrevWndProc


Объявления win API функций и констант которые понадобятся:
 
Код:
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal LParam As Long) As Long

Private Const GWL_WNDPROC = (-4)
319
30 марта 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by SergeySV

Переменная lpPrevWndProc обычно используется для того, чтобы в конце своей функции [NameFunction] передать управление на предыдущую WndProc. Соответственно в конце кода функции [NameFunction] пишешь:
[NameFunction] = CallWindowProc(lpPrevWndProc, hWnd, uMsg, wParam, LParam)
End Function


Спасибо, все понятно. Функцию SetWindowLong я не знал... не знал что можно переназначать основную функцию окна, если оно уже зарегистрировано...

258
31 марта 2004 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by xelos

Спасибо, все понятно. Функцию SetWindowLong я не знал... не знал что можно переназначать основную функцию окна, если оно уже зарегистрировано...



Ну да, там все зависит от констант, поэтому с помощью SetWindowLong можно не только стили окна менять...

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог