![]() |
|
|
![]()
|
|
| Алексеу |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 130 Регистрация: 22.5.2008 Репутация: нет Всего: нет |
Здравствуйте, господа програмисты!
Хочу обратиться к вам за помощью - разбираю программу, которую написали на учебе никак не могу въехать. С использованием MFC. Задачу модифицировать, изменять могу - знаю как куда и что добавить, если, к примеру, нужно обработать двойной шелчем мыши и т.д, но вот глобальной сути порограммы не понимаю - КАК она работает. Недавно только вылез из консоли - там все просто как веник - сначала инклуды, затем int main, функции - т.е. все четко и логически разбито, а тут я не понимаю что и в какой последовательности выполняется. В WinAPI вроде бы тоже ясно - ф.я. WinMain, обработчик сообщений, но в MFC не могу понять. Ниже программка которая создает обычное диалоговоек окно и выводит на экран информацию по щелчку мыши Заголовочный файл:
Файл срр:
Поясните, пожалуйста, где какая часть кода, что за чем выполняется, что с чем связано. Не могу понять саму глобальную структуру... Пожалуйста не отправляйте читать MSDN - уже читал, не понимаю все равно.. |
||||
|
|||||
| east |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 22.5.2006 Репутация: 1 Всего: 1 |
Честно говоря сам в MSDN мало что понимаю. Для начала тебе нужно разобраться в обьектно ориентированном программировании. В Windows всё связано с сообщениями и событиями. Схема примерно такая, ты нажимаешь на кнопке в своём диалоговом окне. Виндус посылает сообщение о нажатии на кнопку мыши диалоговому. В диалоговом окне у тебя есть обработчик этого сообщения
в котором ты делаешь, что нужно, обрабатываешь сообщение. Примерно такая схема. В книгах почитай, более понятней описуется. |
|||
|
||||
| Алексеу |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 130 Регистрация: 22.5.2008 Репутация: нет Всего: нет |
east, да это все я понимаю. Понимаю суть ООП, да и подобную программу написать могу, но просто пишу я так - беру какую-то подобную вроде этой и начинаю оттуда выкидывать ненужное и вкидывать нужное, не понимаю толком самой структуры, а вот ясность хотелось бы иметь. То что ты сказал понятно, но вот хотелось бы глобального понимания...
|
|||
|
||||
| yurik_l |
|
|||
|
тарантиноман Профиль Группа: Участник Сообщений: 49 Регистрация: 17.9.2006 Репутация: нет Всего: 3 |
||||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Алексеу, MFC - это тонкая оболочка на WinAPI, не больше. Там есть тот же WinMain и главный цикл обработки сообщения: все в классе CWinApp.
Самое лучшее, что могу предложить - залезь в исходники MFC и посмотри. Можно поставить точку прерывания в InitInstance твоего класса- приложения и посмотреть, откуда вызывается и что там вокруг. -------------------- ... |
|||
|
||||
| dizzy1984 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 675 Регистрация: 15.2.2007 Репутация: 10 Всего: 25 |
ИМХО приблизительно так :
Выполняется цепочка вызова WinMainCRTStartup()->WinMain()->AfxWinMain() В AfxWinMain() из интересного происходит
Последняя строчка выполнется в контексте единственного объекта класса-потомка CWinApp - theApp. Похоже, что InitInstance() можно сравнить с функцией main для консоли, т.к ее начало - первое место(ну кроме разве что конструкторов глобальных переменных), которое позволено редактировать программисту и с ее концом, фактически программа завершается (только для диалоговых приложений). Если определить в нем объект класса-потомка CDialog, и вызвать метод DoModal(), то выполнение программы сосредоточится в цикле выборки сообщений CWnd::RunModalLoop(). Теперь если приложение получит какое-либо сообщения, то будет вызвана цепочка AfxWndProc()->AfxCallWndProc()->CWnd::WindowProc()->CWnd::OnWndMsg()->М етод_Окна_Созданного_в_InitInstance(). Причем вызов последней функции осуществится при наличии соответствующей записи в таблице откликов - коде между
MFC сохраняет все созданные CWnd и соответствующие им HWND, а также единственный CWinThread в определенной области памяти, поэтому у нее не возникает вопросов в плане определения с чем она работает. А вообще разбираться в принципах MFC дело неблагодарное, уж лучше запоминать факты... Это сообщение отредактировал(а) dizzy1984 - 4.6.2008, 10:22 |
||||
|
|||||
| Алексеу |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 130 Регистрация: 22.5.2008 Репутация: нет Всего: нет |
Интересно, а можно ли узнать где-то hwnd, которое назначается автоматически в оболочке?
Сегодня попробовал использовать мастер создания диалогового окна - создало около 10 файлов на обычное окно. Вообще глаза на лоб вылазят. Как можно в этом разобраться?.. |
|||
|
||||
| dizzy1984 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 675 Регистрация: 15.2.2007 Репутация: 10 Всего: 25 |
||||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Ну это ты лукавишь. Создавал ты, видимо, диалоговое приложение, а там не одно окно, а несколько классов. Вот по 2 файла на класс тебе и сгенерили. Спасибо скажи, что руками это делать не пришлось. Кстати, там обычно прилагается readme.txt, где вкратце описано что где. Вообще, установка - отдельные файл (пара h+cpp) на класс - очень полезная, даже если поначалу кажется, что удобнее все валить в один файл. Зато при поддерже сильно упорядочивает и облегчает жизнь... -------------------- ... |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |