Запрет получения фокуса главной формы, алгоритм

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
LaboArt
незнакомец
Сообщения: 3
Зарегистрирован: 27.02.2012 22:41:03

Запрет получения фокуса главной формы, алгоритм

Сообщение LaboArt »

Привет народ!
Начальство попросило воскресить старую программу "как есть "написанную на fox pro. Знаю как все реализовать, кроме одного. В старой программе кнопки навигации были расположены на главной форме, и когда вызывались другие формы через меню, эти кнопки навигации позволяли листать данные на всех остальных формах и соответственно главная форма никогда не принимала на себя фокус, иначе она бы перекрывала остальные формы. "Модальность формы" начальству не понравилась, хотят открывать несколько справочников сразу. Вопрос, как же все таки сделать, чтобы главная форма не получала фокус, а кнопки навигации и меню нормально срабатывали. Пока сделал только через SetFocus, но мигание окон не красиво. Смотрю в сторону некого глобального хука на мышь и клавиатуру, но это будет притормаживать программу. WS_EX_NOACTIVATE почему-то не работает. Или же надо отлавливать KILLFOCUS, WM_MOUSEACTIVATE, WM_LBUTTONUP, WM_LBUTTONDOWN, и т.д.. Или перенаправлять фокус на что-то за формой. Есть пример, который поможет мне двигаться в нужном направлении?
alexey38
долгожитель
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Сообщение alexey38 »

Так как не знаю, как выглядела старая программы, то варианты следующие:

1. Можно работать через хуки. Если обработчик не кривой (не выполняет сложных вычислений в обработчике), и комп не сильно дохлый (тогда тормозить будет в любом варианте), то никакого торможения не происходит.
2. Можно ловить сообщения.
3. Можно в каждом окне иметь видимую и прозрачную часть. Фактически прозрачные кнопки будут накладываться на видимые кнопки главной формы
4. Можно работать через MDI формы (тулбары и меню главной формы не влияют на фокус подчиненных окон).

Вариант 4 ничего не требует - это работает само по себе, без каких-либо ухищрений.
Варианты 1-3 подразумевают полный перехват всех нажатий мышки, и требуют вручную перерисовывать кнопки главной формы, чтобы визуализировать факт нажатия на них. По сути кнопки главной формы - это просто статическая картинка, а не элементы управления, и передача фокуса не происходит.
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

2 LaboArt
ИМХО самый простой способ получить описанное поведение -
установить у справочников FormStyle = fsStayOnTop.
LaboArt
незнакомец
Сообщения: 3
Зарегистрирован: 27.02.2012 22:41:03

Сообщение LaboArt »

Спасибо за ответы, мне удалось частично вскрыть код старой программы, она написана под п.3 (сообщения от alexey38). Несколько таймеров, постоянная прорисовка кнопок, имитация нажатия, перехват Tab, Enter и т.д.. ЛКМ, ПКМ, СКМ при нажатии на стат. форму, геморрой конечно, но реализуемо. Только одно но, если делать прозрачную форму и накладывать ее на кнопки, при нажатии она будет принимать фокус на себя, и все остальные формы будут серые(LostFocus). А в старой программе, при открытии второй формы, как бы ты не нажимал на фон или по кнопкам на ней, фокус оставался на второй, третьей... форме. т.е. второе\третье... окно вообще не теряло фокуса(между второй\третьей и т.д. передача фокуса идет успешно), т.е. происходит каким-то образом перехват передачи фокуса или потери фокуса второй\третьей... формой по отношению к главной и возвращает Result:=Null
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Сообщение sign »

Работайте через 4-й вариант.
Самое простое и удобное.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

LaboArt
Судя по тому, что вы описали - этот велосипед самый - самый...
Оно того стоит? Может просто сделать нормальный интерфейс?
Можно MDI сделать, можно SDI - но с открытием главной формы ввиде панели навигации сверху десктопа, вторичных форм ограничить всем остальным пространством...
LaboArt
незнакомец
Сообщения: 3
Зарегистрирован: 27.02.2012 22:41:03

Сообщение LaboArt »

Пойду по пути SDI+масса различных ограничений. Спасибо всем!
Coriolis
незнакомец
Сообщения: 4
Зарегистрирован: 13.11.2010 11:47:22

Сообщение Coriolis »

Ну что, стоило оно того? В смысле делать массу ограничений.
Ответить