Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Где находиться функция WindowProc? 
V
    Опции темы
KaraKum
  Дата 26.12.2007, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: нет
Всего: 1



Где находится функция WindowProc в приложении, созданном на основе MFC?
PM MAIL WWW   Вверх
baldina
Дата 26.12.2007, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



AfxWndProc() - для любого CWnd
для переопределения функционала - virtual CWnd::WindowProc() и некоторые другие для обработки конкретных сообщений (например OnPaint())
PM MAIL   Вверх
KaraKum
  Дата 26.12.2007, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: нет
Всего: 1



Я имею в виду где её месторасположение в исполняемых файлах? Нужно найти её для редактирования и добавления обработки клавиш.
PM MAIL WWW   Вверх
baldina
Дата 26.12.2007, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



Она внутри MFC.
А тебе надо в классе окна добавить обработчик OnKeyDown и отредактировать MESSAGE_MAP
Код

BEGIN_MESSAGE_MAP()
   ON_WM_KEYDOWN()
END_MESSAGE_MAP()


Добавлено через 1 минуту и 23 секунды
Вообще студия это сама за тебя сделает, если поработаешь с окошком Properties
PM MAIL   Вверх
KaraKum
  Дата 26.12.2007, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: нет
Всего: 1



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

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) оператору...
PM MAIL WWW   Вверх
baldina
Дата 26.12.2007, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



Цитата

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

Курить доки по 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 как-то понятнее выглядят, не правда ли?
PM MAIL   Вверх
KaraKum
  Дата 27.12.2007, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: нет
Всего: 1



О, теперь работает!  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() с четырьма параметрами, первый которой (дополнительный) - указатель на окно, которому отправляется сообщение. А то по умолчанию вызывается функция с тремя параметрами (без указателя).

Это сообщение отредактировал(а) KaraKum - 27.12.2007, 09:06
PM MAIL WWW   Вверх
Andrey44
Дата 27.12.2007, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 12
Всего: 26



::PostMessage(..............) smile   вызывается апишная функция


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
baldina
Дата 27.12.2007, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



Цитата

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

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

Добавлено через 1 минуту и 33 секунды
кстати, а почему VK_F9 не используешь? Оно конечно 0х78, но все-таки...
PM MAIL   Вверх
KaraKum
  Дата 27.12.2007, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: нет
Всего: 1



Цитата(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);
}

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

Это сообщение отредактировал(а) KaraKum - 27.12.2007, 10:51
PM MAIL WWW   Вверх
baldina
Дата 27.12.2007, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



Цитата

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

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

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

Добавлено через 4 минуты и 54 секунды
OnBnClickedButtonDo - аналогично.
ты бы почитал туттут и вокруг. 
PM MAIL   Вверх
Andrey44
Дата 27.12.2007, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 12
Всего: 26



Цитата

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

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




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

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


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
KaraKum
  Дата 27.12.2007, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: нет
Всего: 1



Цитата(baldina @ 27.12.2007,  10:57)
Цитата

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

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

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

Добавлено @ 11:02
OnBnClickedButtonDo - аналогично.
ты бы почитал туттут и вокруг.

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

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

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

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

Это сообщение отредактировал(а) KaraKum - 27.12.2007, 19:19
PM MAIL WWW   Вверх
Earnest
Дата 27.12.2007, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



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

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



--------------------
...
PM   Вверх
baldina
Дата 27.12.2007, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



Earnest как всегда права, а я туплю  smile 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.1605 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.