Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > GetClientRect получает нулевые значения


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

ShowWindow(hwnd,SW_MAXIMAZE);

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

RECT r;
GetClientRect(hwnd,&r);

но в структуре r, значения right и bottom нулевые. Если при создании окна указать его размеры, то функция их получит, но мне нужно чтобы в функции CreateWindow() было установлено ноль а после разворачивания определить координаты его рабочей области.  
 

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

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

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

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

а почему так работает?

Автор: GremlinProg 8.4.2009, 20:56
Цитата(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 - конструктор, который нужно пропустить старшему, после чего, делать что-то свое

Автор: yngwie19 8.4.2009, 21:22
GremlinProg, Ясно Я впринципе решил проблему обработав сообщение WM_SIZE, но мне хотелось разобраться почему нет значений. Хорошо а почему когда Я окну в CreateWinow() задаю значения он их поспроизводит в GetClientRect() ? окно из где-то хранит?

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

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

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

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

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

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

а что это за параметр?

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

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

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

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


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

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

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

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

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

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

а если Я использую макрос HANDLE_MSG, то куда это написать.

Автор: GremlinProg 9.4.2009, 16:57
макрос - куда обычно - в свитч:
Код

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

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

Автор: yngwie19 9.4.2009, 18:01
GremlinProg, да нет не макрос куда писать, а все то что ты написал как это записать в OnCreate() 

Автор: GremlinProg 9.4.2009, 18:15
Цитата(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, работа с макросами и т.п.
я уже просил, не задавать их тут

Автор: 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
Код

::DefWindowProc(hwnd,message,0,(LPARAM)lpCreateStrust);

Автор: yngwie19 9.4.2009, 20:22
GremlinProg, спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)