powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Предотвратить срабатывание по Enter для диалога OpenFile
4 сообщений из 4, страница 1 из 1
Предотвратить срабатывание по Enter для диалога OpenFile
    #38923233
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть кастомизированный стандартный диалог OpenFile.
Одним из custom-элементов является System,Windows.Forms.Toolbar (на самом деле находится на .Net форме, на диалог попадает через SetParent(hwndDialog, Toolbar.Handle) ). Выделил на картинке.

Как я писал для .Net -Toolbar характерно понятие "фокус" (почему бы нет).

Т.е. мы пришли на Toolbar по TAB (в общей последовательности стандартных и Custom(.Net) элементов диалога), выбрали стрелочками Prev/Next (это все работает).

И дальше хотим нажать кнопку. Клавиатурой (!!!), а не мышью.
Код: vbnet
1.
2.
  Private Sub ToolBarPrevNext_ButtonClick(sender As Object, e As ToolBarButtonClickEventArgs) _
   Handles ToolBarPrevNext.ButtonClick



Надо думать клавишей ENTER.

Но проюлема в том что диалог (hwndDialog) имеет свое назначение для ENTER. Т.е. вместо перемещения на другую страницу картинки (код нажатия кнопки тулбара) срабатывает Enter диалога, т.е. выполняется команда Открыть с закрытием диалога.

Как лечить?

P.S. в моем распоряжении есть OFNHookProc_Open диалога(где он ловит WM_INITDIALOG, CDN_INITDONE и т.п.), ну и без проблем могу добавить ф-цию в которой реализован сабклассинг собственно окна диалога(hwndDialog).

PPS. По идее можно и забить, с учетом того что для верхнего (штатного) тулбара тоже нет способа нажать на кнопку с клавиатуры (только мышью). А фокус он тоже ловит.
...
Рейтинг: 0 / 0
Предотвратить срабатывание по Enter для диалога OpenFile
    #38923270
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dialog Box Programming Considerations

При нажатии ENTER диалог получает WM_COMMAND c ID_OPEN.
Надо проверить, не находится ли Toolbar в "Net-фокусе",
если ДА (наш случай), то отменить дефолтную обработку
вычислить нажимаемую, т.е. "горячую" кнопку тулбара, вызвать событие ее нажатия в ручном режиме.
Задача чем-то похожая на эту: 17288098


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
  Private Sub s_DialogOpen_CallBackWndProc(ByRef m As Message, ByRef Cancel As Boolean) _
   Handles s_DialogOpen.CallBackWndProc
    'Debug.WriteLine(m.ToString)
    Select Case m.Msg
      Case WM_COMMAND
        'ENTER Sends a WM_COMMAND message to the dialog box procedure.
        'The wParam parameter is set to IDOK or control identifier of the default push button. 
        If m.WParam = ID_OPEN Then
          If gOpenToolbarPrevNext.Focused Then 'проверяем, в "фокусе" ли тулбар (по .Net понятиям)
            'выясняем, какую кнопку нажимали (а нажимается та которая highlited)
            Dim idHitTest As Integer = SendMessage(gOpenToolbarPrevNext.Handle, TB_GETHOTITEM, 0, 0)
            If idHitTest <> -1 Then
              'вызываем обработку нажатия кнопки вручную, т.к. мы отменяем все обработки
              FormOpen.ToolBarPrevNext_ButtonClick(FormOpen, _
               New ToolBarButtonClickEventArgs(gOpenToolbarPrevNext.Buttons(idHitTest)))
            End If
            Cancel = True 'не обрабатывать <ENTER> стандартным образом
          End If
        End If
      Case Else
    End Select
  End Sub
...
Рейтинг: 0 / 0
Предотвратить срабатывание по Enter для диалога OpenFile
    #38924031
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Надо думать клавишей ENTER.
1.всем известно, что кнопка на кот. находится фокус нажимается пробелом.
2.а энтером нажимается AcceptButton диалога
...
Рейтинг: 0 / 0
Предотвратить срабатывание по Enter для диалога OpenFile
    #38924087
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pation1.всем известно, что кнопка на кот. находится фокус нажимается пробелом.
Ты прав, всем известно, а я как-то привык энтером (если уж совсем честно то мышью).
Но энтером она тоже должна нажиматься.

pation2.а энтером нажимается AcceptButton диалога
Не тогда когда фокус находится на другой Button.
Проверь на простейшем Yes/No.

Гиморы связаны с тем, что понятие фокуса в System.Windows.Forms. Toolbar искуственное (глянь в исходники, код типа "детский сад", который дает мелкие сбои-глюки в каких-то частных случаях типа рассматриваемого, хотя сделано неплохо), в Win32 тулбар не имеет фокуса.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Предотвратить срабатывание по Enter для диалога OpenFile
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]