powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не входит в OnKeyDown
7 сообщений из 7, страница 1 из 1
Не входит в OnKeyDown
    #33424872
Джек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день всем!
У меня есть диалог на котором стоит CTabCtrl.
Мне надо обрабатывать сообщения с диалогов страниц, я создал для диалога одной из страниц обработчик сообщения WM_KEYDOWN но когда в режиме отладки захожу на эту страницу нажимаю какую-нибудь клавишу программа туда не заходит.
Заранее большое спасибо!
...
Рейтинг: 0 / 0
Не входит в OnKeyDown
    #33425131
AlexSar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выложи код, так проше посмотреть будет.

Обработчик создавал Add Event Handler?
И еще. Сообщение будет приходить, только когда на Tab Control попал TabStop.
...
Рейтинг: 0 / 0
Не входит в OnKeyDown
    #33426355
Джек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый AlexSar спасибо что заинтересовались моим вопросом!
Вот мой класс дталога страницы:
class CPageOptions1 : public CDialog
{
DECLARE_DYNAMIC(CPageOptions1)

public:
CPageOptions1(CWnd* pParent = NULL); // standard constructor
virtual ~CPageOptions1();

// Dialog Data
enum { IDD = IDD_PAGEOPTIONS1 };

virtual BOOL OnInitDialog();
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
virtual void OnOK();
virtual void OnCancel();
// virtual BOOL OnCommand(WPARAM wParam, LPARAM IParam);
// virtual BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult);
virtual BOOL OnChildNotify( UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult );

DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedCheckjpg();
BOOL bSelJPG;
BOOL bSelMPG;
CString sDirJPG;
CString sDirMPG;
afx_msg void OnBnClickedCheckmpg();
afx_msg void OnEnChangeEditdirjpg();
afx_msg void OnEnChangeEditdirmpg();
afx_msg void OnBnClickedButtonseldirjpg();
afx_msg void OnBnClickedButtonseldirmpg();
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
};


Вот фрагмент его реализации:
void CPageOptions1::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default

CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}

Обработчик я не мог добавить через Add Event Handler, т.к. у эдита или чекбокса или баттона сообщения WM_KEYDOWN в списке этого мастера не было.
Вообщем мне надо когда фокус на каком-нибудь котроле странице по нажатию какой-нибудь клавиши установить фокус на CTabCtrl, т.е. чтобы выйти из страницы без помощи мыши. Я ещё попробовал тут функцию

BOOL CPageOptions1::OnChildNotify( UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult )
{
if(message==WM_KEYDOWN)
{
int x=10;
}
return CDialog::OnChildNotify(message, wParam, lParam, pLResult);
}

тоже внутрь if(message==WM_KEYDOWN) не входит.
...
Рейтинг: 0 / 0
Не входит в OnKeyDown
    #33428747
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И не должно входить, тк фокус ввода находится на одном из элементов диалога. Диалоговое окно получает WM_KEYDOWN, только если оно чистое и на нем нет элементов интерфеса.
Если стоит задача просто реагировать на нажатия горячих клавишь, то самый простой способ решения через акселераторы. В редакторе ресурсов создается таблица акселераторов, которая ставит в соответстие код клавиши или комбинации с Ctrl, Alt и тд сообщению.
Код: plaintext
1.
ID            KEY TYPE
IDC_MYCOMMAND H    VIRTKEY
в OnInitDialog() загружаем таблицу

Код: plaintext
m_hAccel = LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR1));

в PreTranslateMessage применяем акселератор:

Код: plaintext
1.
2.
3.
4.
5.
BOOL CTest::PreTranslateMessage(MSG* pMsg) 
	{
	if (WM_KEYFIRST <= pMsg->message && pMsg->message<= WM_KEYLAST)
	if (m_hAccel && ::TranslateAccelerator(m_hWnd, m_hAccel, pMsg))   return TRUE;
	return CDialog::PreTranslateMessage(pMsg);
	}


А вот и сам обработчик команд

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
BEGIN_MESSAGE_MAP(CTestonkeydownDlg, CDialog)
	//{{AFX_MSG_MAP(CTestonkeydownDlg)
	ON_COMMAND(IDC_MYCOMMAND, OnMycommand)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


void CTest::OnMycommand() 
	{
	MessageBox("TEST","TEST");
	}
...
Рейтинг: 0 / 0
Не входит в OnKeyDown
    #33428748
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
BEGIN_MESSAGE_MAP(CTest, CDialog)
	//{{AFX_MSG_MAP(CTestonkeydownDlg)
	ON_COMMAND(IDC_MYCOMMAND, OnMycommand)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
...
Рейтинг: 0 / 0
Не входит в OnKeyDown
    #33428980
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WM_KEYDOWN получает ТОЛЬКО окно, в котором находится фокус ввода !!
Это скорей всего какой-нибудь из контролов этого диалога. Сам диалог НИКОГДА не получает фокус ввода.

Если уж очень нужно, то в MFC есть механизм для этого -- PreProcessMessage.
Но им нужно очень осторожно пользоваться, а вообще лучше не пользоваться.
...
Рейтинг: 0 / 0
Не входит в OnKeyDown
    #33429083
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv Сам диалог НИКОГДА не получает фокус ввода.


Если на диалоговом окне нет никаких контролов, то получает и фокус ввода, и WM_KEYDOWN
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не входит в OnKeyDown
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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