Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Win API


Новое направление Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / WinAPI

Выпуск № 536
от 04.09.2008, 20:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 315, Экспертов: 29
В номере:Вопросов: 1, Ответов: 1

Нам важно Ваше мнение об этой рассылке.
Оценить этот выпуск рассылки >>


Вопрос № 142687: Здравствуйте уважаемые эксперты. Я только начинаю изучать WINAPI по книге Ю. Щупака WIN 32 API Разработка приложений для виндоус. У меня возникло несколько вопросов. В книге написано так sh.lpfnWndProc содержит адрес оконной процедуры, в ...

Вопрос № 142.687
Здравствуйте уважаемые эксперты. Я только начинаю изучать WINAPI по книге Ю. Щупака WIN 32 API Разработка приложений для виндоус. У меня возникло несколько вопросов.

В книге написано так sh.lpfnWndProc содержит адрес оконной процедуры, в нашем примере это WndProc;
Прошу объяснить простым языком данную фразу.

И еще меня интересуют назначения и возможные варианты следующих полей: sh.cbClsExtra = 0;sh.cbWndExtra = 0; sh.hInstance = hInstance;

Так же прошу объяснить назначение строки HWND hMainWnd char szClassName[] = "MyClass"; (начало WinMain)

Приложение:

Отправлен: 30.08.2008, 20:01
Вопрос задал: Горбунов Алексей Николаевич (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: estiGi
Здравствуйте, Горбунов Алексей Николаевич!

1. у каждого окна есть обработчик его событий, которые система посылает. Этот обработчик - обычная callback-функция со специальной сигнатурой, в вашем случае под именем WndProc. И ее адрес нужно сохранить в параметр sh.lpfnWndProc, чтобы система знала, какую функцию нужно вызывать для обработки сообщений. В вашем случае адрес функции - это просто ее имя.

2. параметры sh.cbClsExtra и sh.cbWndExtra я, честно говоря, никогда не использовал, но, как говорит МСДН, это количество байт, которые она может выделить дополнительно в памяти, в определенном месте, для ваших нужд.

3. sh.hInstance - функция просит указать HINSTANCE модуля, в котором определена функция-обработчик сообщений из первого пункта.

4. szClassName. У каждого окна, буть то кнопка, список или любое другое окно есть класс, который определяет в системе поведение окна. В данном случае вы создаете свое собственное окно, и вам нужно придумать название к ласса для этого окна. И поведение этого окна вы также будете определять сами, в данном сучае в функции-обработчике sh.lpfnWndProc. Например, если ваш код создает просто пустое окно, то при желании вы можете "слепить" из него любой другой элемент управления, но всю логику его поведения вам придется писать самому.

Не знаю, получилось ли толково описать, но хотел бы обратить внимание, что пример из книги немного некорректный в некоторых местах.
Во-первых, строка sh.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); всегда создает пустое белое окно, что не есть хорошо. Нехорошо потому, что если у пользователя стоит нестандартная тема, у него окна могут быть совсем не белые - ну, таковы его настройки. А тут он запускает программу, которая показывает белое окно - т.е. несовпадение с его темой. Для решения этой неприятности пишется, к примеру, так:
sh.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
т.е. специальная константа, в которой содержится цвет окна, заданный текущей темой пользователя.
И, во-вторых, у вас проверяется возврат RegisterClassEx. С виду все правильно, но, если функция вернет FALSE, это не есть ошибка во всех случаях. Попробуйте запустить одновременно два экземпляра программы, и во втором вызове RegisterClassEx вернет "ошибку", которая говорит о том, что класс с таким именем (szClassName) уже зарегестрирован в системе - вы ведь это уже сделали, запустив первый экземпляр программы. Соответственно, не нужно проверят код возврата из функции RegisterClassEx. А успешность создания окна проверяйте, сравнивая с нулем полученный handle нового окна - hMainWnd.
Возможно, вам покажется, что таким образом можно заставлять пользователя запускать только одну копию программы. Но корректным способом для этого и самым надежным является использование объектов синхронизации, например - мьютексов.
Ответ отправил: estiGi (статус: Студент)
Ответ отправлен: 31.08.2008, 13:11
Оценка за ответ: 5
Комментарий оценки:
Достойный ответ, настоящего профессионала. Хотя и под маской Студента


Вы имеете возможность оценить этот выпуск рассылки.
Нам очень важно Ваше мнение!
Оценить этот выпуск рассылки >>

Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2008, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале

∙ Версия системы: 5.2 RC 1 от 03.09.2008

Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное