CTRL-ENTER

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

CTRL-ENTER

Сообщение Ruslan Demidow » 06.10.2004 (Ср) 12:27

Имеется форма. Кнопок на ней нет. Т.е. по умолчанию никакая кнопка не установлена.
В обработке события Form_KeyDown хочу обработать нажатие CTRL-ENTER. У формы свойство KeyPreview=True.
Но не схватывает. :(
Что я делаю неверно?
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 06.10.2004 (Ср) 12:31

А вообще контролы есть? Хотя вряд ли от этого зависит, не припомню такого...
Если только ошибка в обработчике, должно быть так:
If Shift = vbCtrlMask and (KeyCode = vbKeyExecute or KeyCode = vbKeyReturn) then
...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 06.10.2004 (Ср) 13:02

А не проще ловить _KeyAscii (KeyAscii = 10)?
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.10.2004 (Ср) 13:33

10 - это что-то странное... Может, всё же 13?
И ещё не _KeyAscii, а _KeyPress.

А Ctrl-Enter обычно перехватывается многострочным текстбоксом, если у него фокус. У Ruslan-а, наверное, именно так?
Изображение

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 06.10.2004 (Ср) 14:02

Ennor писал(а):А вообще контролы есть? Хотя вряд ли от этого зависит, не припомню такого...
Если только ошибка в обработчике, должно быть так:
If Shift = vbCtrlMask and (KeyCode = vbKeyExecute or KeyCode = vbKeyReturn) then
...

Контролы: тулбар, RichEditBox, vbaColumnTreeView (дерево с колонками), statusbar, три optionbox'а в массиве, лист бокс, два текстбокса и (наврал), одна кнопка (но у неё свойство Default=False.
Твой код не сработал - KeyDown у меня возникает уже сразу после нажатия на CTRL, до кнопки уже не доходит. Если же обрабатывать другое сочетание CTRL с любой другой клавишей - нормально.
Код: Выделить всё
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    Select Case KeyCode
        Case vbKeyEscape 'остановить поиск
            blnStopQSerach = True
        Case vbKeyF10 'Выход
            Unload Me
     End Select
    Select Case Shift
        Case vbCtrlMask 'просто CTRL
            Select Case KeyCode
                Case vbKeyReturn  'открыть в FIPS
                        StartFips MSGIDinText, "C:\FIPS"
                Case vbKeyA 'выбрать весь текст сообщения
                        mnuSelectAllText_Click
                Case vbKeyC 'копировать в буфер
                        mnuCopy_Click
                Case vbKeyTab 'Выбор конференции
                    If frmAreaSelect.CanSelect Then
                        SetEventsText ("Выбор конференции...")
                        frmAreaSelect.Show
                        frmAreaSelect.Refresh
                    End If
                Case vbKeyT 'Отображение атрибутов
                    chkOptShowAttrib(0).Value = 1 - chkOptShowAttrib(0).Value
                    chkOptShowAttrib_Click (0)
                Case vbKeyH 'Отображение скрытых строк
                    chkOptShowAttrib(1).Value = 1 - chkOptShowAttrib(1).Value
                    chkOptShowAttrib_Click (1)
                Case vbKeyD 'Отображение удаленных писем
                    chkOptShowAttrib(2).Value = 1 - chkOptShowAttrib(2).Value
                    chkOptShowAttrib_Click (2)
                Case vbKeyO 'Открыть базу
                    OpenBase
                Case vbKeyR 'пометить все как прочитанные
                    MarkAllAsRead
                Case vbKeyS 'сохранить письмо в файл
                    mnuSaveMessageToFile_Click
                Case vbKeyF 'Поиск в тексте письма
                    If frmAreaSelect.CanSelect Then frmSearch.Show
            End Select
    Case vbShiftMask 'SHIFT
            Select Case KeyCode
                Case vbKeyAdd 'развернуть тред
                       mnuExpandTreeView_Click
                Case vbKeySubtract ' свернуть тред
                       mnuNonExpandTreeView_Click
            End Select
    Case vbCtrlMask + vbShiftMask 'CTRL с SHIFT'ом
        Select Case KeyCode
            Case vbKeyR 'пометить тред как прочитаный
                mnuMarkAllInTreadAsRead_Click
            Case vbKeyDelete 'пометить весь тред как удалённый
                mnuMarkTreadAsDeleted_Click
            Case vbKeyM 'пометить все сообщения в треде
                mnuMarkAllMessInTread_Click
            Case vbKeyS 'сохранить тред
                mnuSaveTreadToFile_Click
            Case vbKeyInsert 'уменьшить высоту списка писем
                SendMessage MsgTextBox.hwnd, WM_SETREDRAW, 0, &O0
                SabjList.Height = SabjList.Height - 50
                SendMessage MsgTextBox.hwnd, WM_SETREDRAW, 1, &O0
                Form_Resize
              Case vbKeyDelete 'увеличить высоту списка писем
                SendMessage MsgTextBox.hwnd, WM_SETREDRAW, 0, &O0
                SabjList.Height = SabjList.Height + 50
                SendMessage MsgTextBox.hwnd, WM_SETREDRAW, 1, &O0
                Form_Resize
        End Select
    Case vbAltMask 'ALT
        Select Case KeyCode
            Case vbKeyP 'настройки
                cmdShowOptionsForm_Click
        End Select
    End Select
End Sub

Из этого кода не отрабатывает только
Код: Выделить всё
Case vbKeyReturn  'открыть в FIPS
            StartFips MSGIDinText, "C:\FIPS"

Остальные - нормально.
Кроме кнопок - есть ли ещё контролы, которые могут иметь свойство Default?

P.S. Большой пардон!!!! :oops:
Не тот кусок кода сначала выложил. Сейчас исправлен на тот который нужен...
Последний раз редактировалось Ruslan Demidow 06.10.2004 (Ср) 14:22, всего редактировалось 1 раз.
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 06.10.2004 (Ср) 14:06

alibek писал(а):А не проще ловить _KeyAscii (KeyAscii = 10)?

А Shift через переменную модуля отлавливать?
Т.е. сначала KeyDown - запоминаем Shift
Потом KeyPress - кнопка + запомненый Shift.
Запутаться с Shift'ами и кнопками при KeyUP запутаться можно.
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 06.10.2004 (Ср) 14:12

tyomitch писал(а):10 - это что-то странное... Может, всё же 13?
И ещё не _KeyAscii, а _KeyPress.

А Ctrl-Enter обычно перехватывается многострочным текстбоксом, если у него фокус. У Ruslan-а, наверное, именно так?

У меня во время нажатия фокус на TreeView. В это время на форме отображается ещё и RichEditBox. При нажатии комбинации фокус остаётся на месте, и вообще никакой реакции.
Если поставить BreackPoint на обработку нажатия - видно что перехватывает CTRL.
Если поставить BreackPoint на именно это сокращение (CTRL+ENTER) - никакой реакции, пролетаем точку останова, как будто бы ничего и не нажимали.
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 06.10.2004 (Ср) 14:18

Внутри keydown:

shift = 2 and keycode =13 - это ctrl+enter

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 06.10.2004 (Ср) 15:00

Vitaly1 писал(а):Внутри keydown:

shift = 2 and keycode =13 - это ctrl+enter

Не отрабатывает.
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 06.10.2004 (Ср) 15:04

Нашёл в чём причина - vbaColumnTreeView перехватывает сообщения (через свою библиотеку) и если это CTRL-Enter - то проглатывает его и молчок.
Отображение в нём колонок реализовано через сабклассинг стандартного TreeView и прорисовку всяких вкусностей. Всё это сделано на уровне скомпилированного OCX и DLL. Исходников нет.
Как добиться от него нормальной обработки CTRL+ENTER? Или никак?
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.10.2004 (Ср) 15:09

Как-как, субклассить ;-)
На самом деле, там всё должно быть довольно легко.

Подожди, как исходников нет? А это не они - http://www.vbaccelerator.com/home/VB/Co ... Source.asp ?
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 06.10.2004 (Ср) 15:29

tyomitch писал(а):10 - это что-то странное... Может, всё же 13?
И ещё не _KeyAscii, а _KeyPress.

Нет, именно 10. Ctrl+Enter генерирует именно такой ASCII-код.
Lasciate ogni speranza, voi ch'entrate.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 06.10.2004 (Ср) 15:53

tyomitch писал(а):Как-как, субклассить ;-)
На самом деле, там всё должно быть довольно легко.

Я пробовал в самом начале работы с ним субклассит - зараза валится на всякой ерунде - хоть не дыши на него.
Любой другой treeview - нормально тем же кодом субклассится.
Подожди, как исходников нет? А это не они - http://www.vbaccelerator.com/home/VB/Co ... Source.asp ?

О! А я ссылку потерял и уже не надеялся найти... :)
Хотя сомневаюсь, что получится что-то стоящее... :roll:
Это Ж-ж-ж-ж неспроста (с) Винни-Пух


Вернуться в Visual Basic 1–6

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

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

    TopList