Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GetClientRect получает нулевые значения 
V
    Опции темы
yngwie19
Дата 8.4.2009, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

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



Всем привет у меня вопрос вот какого характера. Вообщем в функции WinMain() создается окно у указанием нулевых значений ширины и высоты. Далее это окно разворачивается на весь экран с помощью
Код

ShowWindow(hwnd,SW_MAXIMAZE);

далее обрабатываю сообщение WM_CREATE, хочу получить коордитаны рабочей области окна:
Код

RECT r;
GetClientRect(hwnd,&r);

но в структуре r, значения right и bottom нулевые. Если при создании окна указать его размеры, то функция их получит, но мне нужно чтобы в функции CreateWindow() было установлено ноль а после разворачивания определить координаты его рабочей области.  
 
PM MAIL   Вверх
GremlinProg
Дата 8.4.2009, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



WM_CREATE нужно сначала передать процедуре окна по-умолчанию, после этого, окно, действительно считается созданным и координаты будут соответствовать выставленным

Добавлено через 1 минуту и 30 секунд
Код

...
case WM_CREATE:{
  LRESULT retval = ::DefWindowProc(...)
  ::GetClientRect(hwnd , &rc);
  return retval;
}
...



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
yngwie19
Дата 8.4.2009, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

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



Цитата(GremlinProg @  8.4.2009,  19:41 Найти цитируемый пост)
 сначала передать процедуре окна по-умолчанию, после этого, окно, действительно считается созданным 

а почему так работает?
PM MAIL   Вверх
GremlinProg
Дата 8.4.2009, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(yngwie19 @  8.4.2009,  22:23 Найти цитируемый пост)
а почему так работает?

ну так, в основном, все компоненты инициализируются на WM_CREATE
закон инкапсуляции
кто старше, тому и карты в руки
В данном случае имеет место вызов двух процедур окна:
1. DefWindowProc - системная
2. WndProc - твоя
представь, вместо этого, существуют два класса:
Код

class DefWindowProc{
  RECT rc;
  DefWindowProc(){
    init(rc);
  }
};
class WndProc:public DefWindowProc{
  RECT myrect;
  WndProc(){
    myrect = rc;
  }
};

если бы конструктор DefWindowProc не был бы вызван, при создании экземпляра класса WndProc,
вызов init(rc) не был бы произведен, т.е. операция myrect = rc была бы не корректной

поэтому, WM_CREATE - конструктор, который нужно пропустить старшему, после чего, делать что-то свое


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
yngwie19
Дата 8.4.2009, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

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



GremlinProg, Ясно Я впринципе решил проблему обработав сообщение WM_SIZE, но мне хотелось разобраться почему нет значений. Хорошо а почему когда Я окну в CreateWinow() задаю значения он их поспроизводит в GetClientRect() ? окно из где-то хранит?
PM MAIL   Вверх
GremlinProg
Дата 8.4.2009, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(yngwie19 @  8.4.2009,  23:22 Найти цитируемый пост)
Хорошо а почему когда Я окну в CreateWinow() задаю значения он их поспроизводит в GetClientRect()

не понял, что он воспроизводит?
ну поставь, к примеру координаты по-умолчанию(CW_USEDEFAULT), что в этом случае должен вернуть GetClientRect перед WM_CREATE?

пока окно официально не создано, не нужно принимать во внимание ни каких результатов его работы


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
yngwie19
Дата 8.4.2009, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

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



Цитата(GremlinProg @  8.4.2009,  21:46 Найти цитируемый пост)
не понял, что он воспроизводит?

когда Я в функции CreateWindow() задаю ширину и высоту, то в функции GetClientRect() во втором параметре именно эти значения.

Добавлено через 35 секунд
Цитата(GremlinProg @  8.4.2009,  21:46 Найти цитируемый пост)
CW_USEDEFAULT

а что это за параметр?
PM MAIL   Вверх
GremlinProg
Дата 8.4.2009, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(yngwie19 @  9.4.2009,  00:15 Найти цитируемый пост)
а что это за параметр?

http://www.firststeps.ru/mfc/winapi/win/r.php?56


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
maxim1000
Дата 8.4.2009, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 2
Всего: 110



Цитата(yngwie19 @  8.4.2009,  19:33 Найти цитируемый пост)
Всем привет у меня вопрос вот какого характера. Вообщем в функции WinMain() создается окно у указанием нулевых значений ширины и высоты. Далее это окно разворачивается на весь экран с помощью
Выделить всёкод C++
1:
    
ShowWindow(hwnd,SW_MAXIMAZE);

далее обрабатываю сообщение WM_CREATE


дело в том, что WM_CREATE обрабатывается ДО ShowWindow
оно минует очередь сообщений и сразу посылается в оконную процедуру


--------------------
qqq
PM WWW   Вверх
GremlinProg
Дата 8.4.2009, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(maxim1000 @  9.4.2009,  01:30 Найти цитируемый пост)
дело в том, что WM_CREATE обрабатывается ДО ShowWindowоно минует очередь сообщений и сразу посылается в оконную процедуру

нет, не минует, но вызывается, конечно раньше, чем ShowWindow установит параметры видимости,
поскольку вызывается еще до того, как CreateWindow вернет результат

Добавлено через 2 минуты
Цитата(GremlinProg @  9.4.2009,  01:38 Найти цитируемый пост)
поскольку вызывается еще до того...

сообщение не вызывается, обрабатывается


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
yngwie19
Дата 9.4.2009, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

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



GremlinProg
Цитата(GremlinProg @  8.4.2009,  19:41 Найти цитируемый пост)
case WM_CREATE:{
  LRESULT retval = ::DefWindowProc(...)
  ::GetClientRect(hwnd , &rc);
  return retval;
}
...

а если Я использую макрос HANDLE_MSG, то куда это написать.
PM MAIL   Вверх
GremlinProg
Дата 9.4.2009, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



макрос - куда обычно - в свитч:
Код

switch(...){
...
HANDLE_MSG(...OnCreate);
...
}

а в OnCreate - основной код кейса


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
yngwie19
Дата 9.4.2009, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

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



GremlinProg, да нет не макрос куда писать, а все то что ты написал как это записать в OnCreate() 
PM MAIL   Вверх
GremlinProg
Дата 9.4.2009, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(yngwie19 @  9.4.2009,  20:01 Найти цитируемый пост)
да нет не макрос куда писать, а все то что ты написал как это записать в OnCreate() 

Цитата(GremlinProg @  9.4.2009,  18:57 Найти цитируемый пост)
а в OnCreate - основной код кейса

Код

LRESULT OnCreate(...){
  RECT rc;
  LRESULT retval = ::DefWindowProc(...);
  ::GetClientRect(hwnd , &rc);
  return retval;
}


yngwie19, вопрос к API не относится,
это вопрос эрудированности в Си
основы основ - понятие функции, оператор return, работа с макросами и т.п.
я уже просил, не задавать их тут


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
yngwie19
Дата 9.4.2009, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

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



GremlinProg, Я конкретно спрашиваю про функцию ::DefWindowProc(....). Что писать в аргументах этой функции. Ведь OnCreate() передает только HWND и LPCREATESTRUCT
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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