Форум: "Основная";
Текущий архив: 2003.06.09;
Скачать: [xml.tar.bz2];
ВнизОтработка ARROW KEYS, мышиных сообщений в комп. от TScrollBox... Найти похожие ветки
← →
Mr.ElectroNick (2003-05-28 15:38) [0]Суть проблемы такая. Необходимо создать компонент обладающий горизонтальной и вертикальной прокруткой (идеальный вариант родителя по моему это TScrollBox).
Чтобы избежать перескакивания фокуса на другие контролы на форме я помещаю свой контрол в Panel.
Внутри компонента я перекрываю WndProc и обрабатываю ПЕРЕД inherited нужные мне сообщения - WM_KEYDOWN, WM_KEYUP, WM_CHAR.
1-я сложность я получаю все нужные нажатия от клавиатуры кроме arrow keys (VK_UP,VK_DOWN,VK_LEFT,VK_RIGHT)
2-я сложность. Я не могу внутри компонента получить сообщения от мышки.
Самое смешное в этом то что Spy++ и WinSight довольно убедительно утверждают что мой контрол получае все сообщения в неизменном виде.
Цель компоненты - простой редактор текста но с доп функциями которых нет в TSynEdit (synedit.sourceforge.net). Копался в исходниках самого TSynEdit, но в связи с тем что код расчитан на компиляцию в VCL, CLX и Kylix версиях приложений, то там довольно сложно найти чтолибо среди директив компилятора.
Вот. Надеюсь что предоставил более менее полную информацию о моей проблеме.
Мой вопрос но коротко: как отлавливать в НЕЗАВИСИМОМ КОМПОНЕНТЕ ВСЕ возможные сообщения которые посылает в него система. И в случае если TScrollBox не подходит - какой компонент брать за основу...
ЗАРАНЕЕ СПАСИБО МАСТЕРА...
← →
Skier (2003-05-28 15:45) [1]
> 1-я сложность я получаю все нужные нажатия от клавиатуры
> кроме arrow keys (VK_UP,VK_DOWN,VK_LEFT,VK_RIGHT)
WM_GETDLGCODE + DLGC_WANTARROWS;
← →
Mr.ElectroNick (2003-05-28 15:50) [2]Это отослать из формы контролу или из контрола системе...
Уже прочитал в MSDN что это за меседж... Можно чуть чуть подробнее... я к сожалению пока не селён в MAPI...
Спасибо...
← →
Skier (2003-05-28 15:55) [3]>Mr.ElectroNick
1) У своего компонента обработчик на сообщение WM_GETDLGCODE
2) в обработчике пропиши :
procedure TStretchHandle.WMGetDLGCode(var Message: TMessage);
begin
Message.Result := Message.Result or DLGC_WANTARROWS;
end;
Теперь твой компонент должен ловить "стрелки"...
← →
Mr.ElectroNick (2003-05-28 15:57) [4]Огромный THANX... Сегодня попробую... Если что ещё буду спрашивать...
← →
Mr.ElectroNick (2003-05-28 15:58) [5]Еще... А как быть с мышкой?... нажатия, движения и т.д. неужели придется перформить из формы?
← →
Skier (2003-05-28 16:01) [6]
> Чтобы избежать перескакивания фокуса на другие контролы
> на форме я помещаю свой контрол в Panel.
Вот отсюда по-подробнее...Зачем избегать ?
← →
Mr.ElectroNick (2003-05-28 16:28) [7]Да всё просто...
1. Когда TScrollBox находится не в группирующем объекте, то по нажатию тех же "стрелок" получается такая последовательность сообщений
1-е нажатие
- WM_KEYDOWN Code: VK_UP
- WM_KILLFOCUS
< тут блокируется вся обработка клавиш >
2-е нажатие
- WM_SETFOCUS
- WM_KEUPU Code: VK_UP
В итоге получается корявая работа... Если OWNER-ом и PARENT-ом сделать Panel то эта ситуация исключается...
2. По нажатию на TAB. Фокус (установленый мной в FormActivate) перескакивает к любому другому стандартному контролу типа TEdit и естественно назад уже не возвращается...
В качестве примера я исследовал как попадают меседжы в Borland-овский редактор кода и HomeSite 5 (аналог которого собственно и нужно создать)...
Вот такие вот WIN-бублики
← →
Skier (2003-05-28 16:37) [8]>Mr.ElectroNick (28.05.03 16:28)
1.
> < тут блокируется вся обработка клавиш >
Что значит "блокируется" ?
2.
> По нажатию на TAB. Фокус (установленый мной в FormActivate)
> перескакивает к любому другому стандартному контролу типа
> TEdit и естественно назад уже не возвращается...
см. TForm.KeyPreview и
обработчик сообщения TCustomForm.CM_DIALOGKEY
← →
Mr.ElectroNick (2003-05-28 16:41) [9]Под БЛОКИРУЕТСЯ я понимаю ситуацию когда я после WM_KILLFOCUS не получаю никаких клавишных сообщений... до тех пока не нажму какую либо из стрелок...
Что честно говоря довольно странно, или я чегото ещё недопонял в логике работы компонентов порожденных от TWinControl...
P.S. Лучший способ разобраться - спросить того кто знает, и поковыряться в чужом коде...
← →
Mr.ElectroNick (2003-05-28 16:42) [10]Небольшое примечание... свой контрол я инициализирую вручную, не через палитру компонент. Что в принцепе логично в процессе разработки.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.06.09;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.011 c