Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > GetClientRect получает нулевые значения |
Автор: yngwie19 8.4.2009, 19:33 | ||||
Всем привет у меня вопрос вот какого характера. Вообщем в функции WinMain() создается окно у указанием нулевых значений ширины и высоты. Далее это окно разворачивается на весь экран с помощью
далее обрабатываю сообщение WM_CREATE, хочу получить коордитаны рабочей области окна:
но в структуре r, значения right и bottom нулевые. Если при создании окна указать его размеры, то функция их получит, но мне нужно чтобы в функции CreateWindow() было установлено ноль а после разворачивания определить координаты его рабочей области. |
Автор: GremlinProg 8.4.2009, 19:41 | ||
WM_CREATE нужно сначала передать процедуре окна по-умолчанию, после этого, окно, действительно считается созданным и координаты будут соответствовать выставленным Добавлено через 1 минуту и 30 секунд
|
Автор: yngwie19 8.4.2009, 20:23 | ||
а почему так работает? |
Автор: GremlinProg 8.4.2009, 20:56 | ||
ну так, в основном, все компоненты инициализируются на WM_CREATE закон инкапсуляции кто старше, тому и карты в руки В данном случае имеет место вызов двух процедур окна: 1. DefWindowProc - системная 2. WndProc - твоя представь, вместо этого, существуют два класса:
вызов init(rc) не был бы произведен, т.е. операция myrect = rc была бы не корректной поэтому, WM_CREATE - конструктор, который нужно пропустить старшему, после чего, делать что-то свое |
Автор: yngwie19 8.4.2009, 21:22 |
GremlinProg, Ясно Я впринципе решил проблему обработав сообщение WM_SIZE, но мне хотелось разобраться почему нет значений. Хорошо а почему когда Я окну в CreateWinow() задаю значения он их поспроизводит в GetClientRect() ? окно из где-то хранит? |
Автор: yngwie19 8.4.2009, 22:15 |
когда Я в функции CreateWindow() задаю ширину и высоту, то в функции GetClientRect() во втором параметре именно эти значения. Добавлено через 35 секунд а что это за параметр? |
Автор: GremlinProg 8.4.2009, 22:31 |
http://www.firststeps.ru/mfc/winapi/win/r.php?56 |
Автор: maxim1000 8.4.2009, 23:30 | ||
дело в том, что WM_CREATE обрабатывается ДО ShowWindow оно минует очередь сообщений и сразу посылается в оконную процедуру |
Автор: GremlinProg 8.4.2009, 23:38 | ||
нет, не минует, но вызывается, конечно раньше, чем ShowWindow установит параметры видимости, поскольку вызывается еще до того, как CreateWindow вернет результат Добавлено через 2 минуты сообщение не вызывается, обрабатывается |
Автор: yngwie19 9.4.2009, 16:15 | ||
GremlinProg,
а если Я использую макрос HANDLE_MSG, то куда это написать. |
Автор: GremlinProg 9.4.2009, 16:57 | ||
макрос - куда обычно - в свитч:
а в OnCreate - основной код кейса |
Автор: yngwie19 9.4.2009, 18:01 |
GremlinProg, да нет не макрос куда писать, а все то что ты написал как это записать в OnCreate() |
Автор: GremlinProg 9.4.2009, 18:15 | ||||
yngwie19, вопрос к API не относится, это вопрос эрудированности в Си основы основ - понятие функции, оператор return, работа с макросами и т.п. я уже просил, не задавать их тут |
Автор: yngwie19 9.4.2009, 19:09 |
GremlinProg, Я конкретно спрашиваю про функцию ::DefWindowProc(....). Что писать в аргументах этой функции. Ведь OnCreate() передает только HWND и LPCREATESTRUCT |
Автор: GremlinProg 9.4.2009, 20:17 | ||
а MSDN на что? по-русски - http://www.firststeps.ru/mfc/winapi/win/r.php?127 по-нерусски - http://msdn.microsoft.com/en-us/library/ms632619(VS.85).aspx
|
Автор: yngwie19 9.4.2009, 20:22 |
GremlinProg, спасибо! |