КАК использовать сообщения
виндовые сообщения, тот же WM_SIZE например ?
----
обьявляю как константу....не пашет :(
Расскажите с начала и до конца :)
Можно ли вообще и КАК использовать в VB
виндовые сообщения, тот же WM_SIZE например ?
----
обьявляю как константу....не пашет :(
Расскажите с начала и до конца :)
виндовые сообщения в принципе использовать можно, если так конечно вообще можно выразится.
Для начала расскажи немного о себе, какой у тебя уровень знаний в этом вопросе: ты программировал на Си под Windows и теперь хочешь применить свои познания в VB? ты знаком с понятиями: winAPI, WindowProc, hWnd или же ты просто где-то услышал про винд. сообщения и не знаешь каким боком это относится к VB?
виндовые сообщения в принципе использовать можно, если так конечно вообще можно выразится.
Для начала расскажи немного о себе, какой у тебя уровень знаний в этом вопросе: ты программировал на Си под Windows и теперь хочешь применить свои познания в VB? ты знаком с понятиями: winAPI, WindowProc, hWnd или же ты просто где-то услышал про винд. сообщения и не знаешь каким боком это относится к VB?
иНТИРЕСНЫЙ ПОДХОД :)
пишу на С++, ради интиреса решил узнать что такое VB
-----
так что можешь обьснять как угодно , ТОЛЬКО ОБЬЯСНИ :) а не выпендривайся :)..юмор
Ну такс начнем отвечать ?
иНТИРЕСНЫЙ ПОДХОД :)
пишу на С++, ради интиреса решил узнать что такое VB
-----
так что можешь обьснять как угодно , ТОЛЬКО ОБЬЯСНИ :) а не выпендривайся :)..юмор
Ну такс начнем отвечать ?
Работа с win сообщениями, а точнее с winAPI мало зависит от языка программирования (и/или среды программирования). Поэтому нет особой разницы на чем ты программируешь, просто если ты учился программировать в современных визуальных средах программирования (типа: Delphi, Microsoft Visual Cи++, Borland Cи++ и т.д.), то ты был защищен от всех прелестей взаимодействия с winAPI, за тебя эту работу выполнял IDE среды программирования.
Меня в инстите в свое время пичкали Си под windows, где приходилось все делать ручками, а Delphi токо появился и я помню какое же это было удовольствие создавать интерфейс и код в Deplhi за 5 мин., на что в Си уходило часа 2. Ради Deplhi я даже паскаль выучил и перевел с Си свою курсовую программу.
Так что Си++ это конечно супер, но хорошо бы знать в какой среде ты программировал и имел дело с winAPI.
Просто если тебя интересуют особенности использования winAPI функций и структур в VB, тогда не имеет смысла тратить на объяснения сути работы windows и его API.
Работа с win сообщениями, а точнее с winAPI мало зависит от языка программирования (и/или среды программирования). Поэтому нет особой разницы на чем ты программируешь, просто если ты учился программировать в современных визуальных средах программирования (типа: Delphi, Microsoft Visual Cи++, Borland Cи++ и т.д.), то ты был защищен от всех прелестей взаимодействия с winAPI, за тебя эту работу выполнял IDE среды программирования.
Меня в инстите в свое время пичкали Си под windows, где приходилось все делать ручками, а Delphi токо появился и я помню какое же это было удовольствие создавать интерфейс и код в Deplhi за 5 мин., на что в Си уходило часа 2. Ради Deplhi я даже паскаль выучил и перевел с Си свою курсовую программу.
Так что Си++ это конечно супер, но хорошо бы знать в какой среде ты программировал и имел дело с winAPI.
Просто если тебя интересуют особенности использования winAPI функций и структур в VB, тогда не имеет смысла тратить на объяснения сути работы windows и его API.
что интересует - это как переопределять стандартные обработчики для сообщений. Т.е. есть стандартное сообщение - как объявить функцию, чтобы она вызывалась при приходе этого сообщения (как связать функцию с некоторым сообщением). Мне тоже интересна эта тема.
что интересует - это как переопределять стандартные обработчики для сообщений. Т.е. есть стандартное сообщение - как объявить функцию, чтобы она вызывалась при приходе этого сообщения (как связать функцию с некоторым сообщением). Мне тоже интересна эта тема.
Понимаешь, сообщение 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 это всего лишь один из типов взаимодействующих объектов в системе, причем вспомогательный. Чтобы что-то ваять под 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 - как связать определенную функцию с определенным сообщением? т.е. чтобы эта функция вызывалась программой при приходе конкретного сообщения (есс-но я знаю какое сообщение хочу обработать).
Вопрос конкретно по VB - как связать определенную функцию с определенным сообщением? т.е. чтобы эта функция вызывалась программой при приходе конкретного сообщения (есс-но я знаю какое сообщение хочу обработать).
Тогда вопрос ставится так - Как связать свою функцию с конкретным окном???
При такой постановке вопроса, я предполагаю что ты знаешь hWnd окна сообщения которого хочешь перехватить. Тогда:
В обычном модуле (НЕ модуль-классе) ты должен объявить функцию такого вида:
*[NameFunction] - любое имя функции
Теперь как эту функцию прикрепить к выбранному окну.
где-нибудь в коде:
lpPrevWndProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf [NameFunction])
Фишка как понимаешь в операторе AddressOf который указывает VB что передавать в функцию SetWindowLong надо именно адрес твоей функции [NameFunction], а не какую-то переменную...
Переменная lpPrevWndProc обычно используется для того, чтобы в конце своей функции [NameFunction] передать управление на предыдущую WndProc. Соответственно в конце кода функции [NameFunction] пишешь:
End Function
Перед закрытием окна, желательно отсоеднится от окна:
Объявления win API функций и констант которые понадобятся:
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)
Переменная lpPrevWndProc обычно используется для того, чтобы в конце своей функции [NameFunction] передать управление на предыдущую WndProc. Соответственно в конце кода функции [NameFunction] пишешь:
[NameFunction] = CallWindowProc(lpPrevWndProc, hWnd, uMsg, wParam, LParam)
End Function
Спасибо, все понятно. Функцию SetWindowLong я не знал... не знал что можно переназначать основную функцию окна, если оно уже зарегистрировано...
Спасибо, все понятно. Функцию SetWindowLong я не знал... не знал что можно переназначать основную функцию окна, если оно уже зарегистрировано...
Ну да, там все зависит от констант, поэтому с помощью SetWindowLong можно не только стили окна менять...