Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Где находиться функция WindowProc?


Автор: KaraKum 26.12.2007, 16:40
Где находится функция WindowProc в приложении, созданном на основе MFC?

Автор: baldina 26.12.2007, 17:04
AfxWndProc() - для любого CWnd
для переопределения функционала - virtual CWnd::WindowProc() и некоторые другие для обработки конкретных сообщений (например OnPaint())

Автор: KaraKum 26.12.2007, 17:15
Я имею в виду где её месторасположение в исполняемых файлах? Нужно найти её для редактирования и добавления обработки клавиш.

Автор: baldina 26.12.2007, 17:45
Она внутри MFC.
А тебе надо в классе окна добавить обработчик OnKeyDown и отредактировать MESSAGE_MAP
Код

BEGIN_MESSAGE_MAP()
   ON_WM_KEYDOWN()
END_MESSAGE_MAP()


Добавлено через 1 минуту и 23 секунды
Вообще студия это сама за тебя сделает, если поработаешь с окошком Properties

Автор: KaraKum 26.12.2007, 21:02
А что вот со всем этим делать?
Код

void CKibiDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    // TODO: Add your message handler code here and/or call default

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

Скучаю по привычному switch (messsage) оператору...

Автор: baldina 26.12.2007, 21:44
Цитата

А что вот со всем этим делать?

Курить доки по MFC  smile 

Цитата

Скучаю по привычному switch (messsage) оператору... 

а чего по нему скучать? он здесь - фактически мы внутри case WM_KEYDOWN
потомучто 
Код

#define ON_WM_KEYDOWN() \
    { WM_KEYDOWN, 0, 0, 0, AfxSig_vwww, \
        (AFX_PMSG)(AFX_PMSGW) \
        (static_cast< void (AFX_MSG_CALL CWnd::*)(UINT, UINT, UINT) > (OnKeyDown)) },

следовательно 
nChar - wParam
nRepCnt - LO(lParam)
nFlags - HI(lParam)

но имена nChar и nRepCnt как-то понятнее выглядят, не правда ли?

Автор: KaraKum 27.12.2007, 09:05
О, теперь работает!  smile 
Только вот не полностью... Я для проверки создал кнопку, которая отправляет сообщение о нажатии кнопки "F9" и функцию обработки сообщения нажатия этой кнопки - всё работает, но само нажатие клавиши "F9" не обрабатывается. Почему?. Вот код:
Код

void CWindow::OnBnClickedButtonDo() //кнопка отправки сообщения о нажатии кнопки "F9"
{
    // TODO: Add your control notification handler code here
    PostMessage(/*FindWindow(NULL, "Alpari"),*/ WM_KEYDOWN, 0x78, 0);
}

void CWindow::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    // TODO: Add your message handler code here and/or call default
    switch(nChar)
    {
    case 0x78:
        {
            CWindow::OnBnClickedButtonProgress();
        } break;
    }

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


И ещё вопрос: как вызвать функцию PostMessage() с четырьма параметрами, первый которой (дополнительный) - указатель на окно, которому отправляется сообщение. А то по умолчанию вызывается функция с тремя параметрами (без указателя).

Автор: Andrey44 27.12.2007, 09:20
::PostMessage(..............) smile   вызывается апишная функция

Автор: baldina 27.12.2007, 10:18
Цитата

само нажатие клавиши "F9" не обрабатывается

должно работать. для точного ответа надо знать базовый класс CWindow, еще лучше код глянуть.
пока могу только предположить, что у тебя от CDialog наследуется. Туда нажатия клавиш не шлются (и дело тут не в MFC, а апишной функции CreateDialog). В диалоге нажатия клавиш получает не сам диалог, а контролы, размещенные в нем.

Добавлено через 1 минуту и 33 секунды
кстати, а почему VK_F9 не используешь? Оно конечно 0х78, но все-таки...

Автор: KaraKum 27.12.2007, 10:50
Цитата(Andrey44 @ 27.12.2007,  09:20)
::PostMessage(..............) smile   вызывается апишная функция

Вот-вот. А как вызвать нужную функцию??  smile .
Цитата

должно работать. для точного ответа надо знать базовый класс CWindow, еще лучше код глянуть.
пока могу только предположить, что у тебя от CDialog наследуется. Туда нажатия клавиш не шлются (и дело тут не в MFC, а апишной функции CreateDialog). В диалоге нажатия клавиш получает не сам диалог, а контролы, размещенные в нем.

А как сделать так, чтобы сообщения отсылались окну?
Цитата

кстати, а почему VK_F9 не используешь? Оно конечно 0х78, но все-таки...

Учту, спасибо  smile .

Ещё проблема smile :
Код

void CWindow::OnBnClickedButtonDo()
{
    // TODO: Add your control notification handler code here
    LPARAM lParam = MAKELPARAM(185, 145);
    PostMessage(WM_LBUTTONDOWN, 0, lParam);
}

Координаты расчитаны так, что указатель должен указывать на кнопку, но сообщение не работает. Это, вероятно, потому что сообщения отправляются не окну? И если да, то подскажите как отправить их окну?

Автор: baldina 27.12.2007, 10:57
Цитата

А как сделать так, чтобы сообщения отсылались окну?

1. Не использовать CreateDialog. Т.е. наследовать от CWnd а не CDialog
2. Разместить в диалоге custom control размером в диалог, в нем и ловить.

А что вообще изобретается?

Добавлено через 4 минуты и 54 секунды
OnBnClickedButtonDo - аналогично.
ты бы почитал http://msdn2.microsoft.com/en-us/library/ms645469(VS.85).aspx, http://msdn2.microsoft.com/en-us/library/132s802t(VS.80).aspx и вокруг. 

Автор: Andrey44 27.12.2007, 11:14
Цитата

Цитата(Andrey44 @ 27.12.2007,  09:20)
::PostMessage(..............) smile   вызывается апишная функция

Вот-вот. А как вызвать нужную функцию??  smile .




KaraKum,  именно ::PostMessage(HWND, UINT, param, param).

::<-область разрешения видимости. 
Это значит ты используешь глобальную функцию API , а не из класса MFC

Автор: KaraKum 27.12.2007, 11:29
Цитата(baldina @ 27.12.2007,  10:57)
Цитата

А как сделать так, чтобы сообщения отсылались окну?

1. Не использовать CreateDialog. Т.е. наследовать от CWnd а не CDialog
2. Разместить в диалоге custom control размером в диалог, в нем и ловить.

А что вообще изобретается?

Добавлено @ 11:02
OnBnClickedButtonDo - аналогично.
ты бы почитал http://msdn2.microsoft.com/en-us/library/ms645469(VS.85).aspx, http://msdn2.microsoft.com/en-us/library/132s802t(VS.80).aspx и вокруг.

Про контрол размером с диалог - смешно  smile .
Нужно как-то отправить к уже созданной запущеной программе сообщение о клике мыши с определёнными координатами. Знаю с помощью какой функции это сделать, но вместо неё вызывается другая (PostMessage() с тремя параметрами, а надо с четырьмя).
Подскажите как вызвать нужную?

Добавлено @ 11:32
Цитата(Andrey44 @ 27.12.2007,  11:14)
KaraKum,  именно ::PostMessage(HWND, UINT, param, param).

::<-область разрешения видимости. 
Это значит ты используешь глобальную функцию API , а не из класса MFC

А как использовать из MFC?

Автор: Earnest 27.12.2007, 11:34
Цитата(baldina @  27.12.2007,  11:57 Найти цитируемый пост)
Не использовать CreateDialog. Т.е. наследовать от CWnd а не CDialog

Диалог, конечно, имеет свою спец. обработку сообщений - в PreTranslateMessage его она, кстати - но суть не в этом.
Важно, что ки-дауны всегда посылаются окну, которое имеет фокус, а это, обычно какая-то кнопка или другое поле. Не-дочернее окно может иметь фокус, только если в нем нет ни одного поля - и нафиг оно тогда нужно.
Горячие клавиши нужно обрабатывать в PreTranslateMessage. 

Автор: baldina 27.12.2007, 12:05
Earnest как всегда права, а я туплю  smile 

Автор: KaraKum 27.12.2007, 17:01
Как вызвать MFC PostMessage() функцию я узнал. Всем спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)