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

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

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

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

Сообщение LaboArt » 27.02.2012 23:06:48

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

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

Сообщение alexey38 » 28.02.2012 04:43:43

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

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

Вариант 4 ничего не требует - это работает само по себе, без каких-либо ухищрений.
Варианты 1-3 подразумевают полный перехват всех нажатий мышки, и требуют вручную перерисовывать кнопки главной формы, чтобы визуализировать факт нажатия на них. По сути кнопки главной формы - это просто статическая картинка, а не элементы управления, и передача фокуса не происходит.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

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

Сообщение iskander » 28.02.2012 11:34:35

2 LaboArt
ИМХО самый простой способ получить описанное поведение -
установить у справочников FormStyle = fsStayOnTop.
iskander
энтузиаст
 
Сообщения: 622
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение LaboArt » 28.02.2012 13:04:53

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

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

Сообщение sign » 28.02.2012 16:20:36

Работайте через 4-й вариант.
Самое простое и удобное.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

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

Сообщение alexs » 28.02.2012 19:56:13

LaboArt
Судя по тому, что вы описали - этот велосипед самый - самый...
Оно того стоит? Может просто сделать нормальный интерфейс?
Можно MDI сделать, можно SDI - но с открытием главной формы ввиде панели навигации сверху десктопа, вторичных форм ограничить всем остальным пространством...
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

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

Сообщение LaboArt » 01.03.2012 11:01:04

Пойду по пути SDI+масса различных ограничений. Спасибо всем!
LaboArt
незнакомец
 
Сообщения: 3
Зарегистрирован: 27.02.2012 22:41:03

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

Сообщение Coriolis » 21.10.2013 10:52:59

Ну что, стоило оно того? В смысле делать массу ограничений.
Coriolis
незнакомец
 
Сообщения: 4
Зарегистрирован: 13.11.2010 12:47:22


Вернуться в Free Pascal Compiler

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

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

Рейтинг@Mail.ru