СообЧа > База Знаний > Программирование > Visual Basic

Вопрос

Собираюсь использовать динамическое меню. Для этого нужен субклассинг. Что это такое?

Ответ

Собственно, расскажу все с самого начала.
Каждое окно (а PictureBox, CommandButton — тоже окна) имеет такое свойство, как адрес оконной процедуры. Эта процедура получает все сообщения этого окна. Эти сообщения сообщают об создании сообщения (WM_CREATE), получении и потере фокуса (WM_SETFOCUS и WM_KILLFOCUS соответственно). Вообщем, этих сообщений немерено. Если пишешь на VB, сообщения получает процедура VB, которая делает, что нужно, иногда вызывает события. Но ничто тебе не мешает сделать так, чтоб окно посылало сообщения любой твоей процедуре. На www.vbnet.ru есть статья (по-моему, Ивана Шатрыкина). Там этот процес рассмотрен более детально.

Как «засубклассить» окно? Используй функцию SetWindowLong:

lngOldProc = SetWindowLong (hwnd, GWL_WNDPROC, AddressOf YourProc)

где hwnd — hwnd твоего окна.
YourProc — процедура, которая с этого момента будет получать все сообщения. Эта процедура может находится ТОЛЬКО в Стандартном модуле (функция AddressOf работает только с процедурами стандартного модуля).
В переменную lngOldProc помещается адрес процедуру, которая получала до этого сообщения окна.

Субклассинг — очень опасное занятие. Если в коде процедуры произойдет ошибка, без вариантов — вылетит веся Среда. Если ты нажмешь на кнопку Стоп на панели инструментов — вылетит вся Среда. Я вообще убрал эту кнопку с панели инструментов. Есть одно средство — писать без ошибок. Если так писать не получается, для запуска используй Ctrl+F5 (Run — Start with full compile). Во всяком случае ошибки компиляции (Например, неправильно написал имя переменной) будут исключены.

Об отладке таких проектов. Делать это трудно. А вообще лучше использовать 2(два) монитора (начиная с 98-й это можно делать): на одном — Среда, на другом — окно.

Артем Кривокрисенко



Copyright © 2000-2004 Сообщество Чайников
Контактная информация