MFC CWnd высота и ширина

Как вы получаете высоту и ширину CWnd *? CWnd это окно правильно? Почему не команда:

CWnd* parent = this->GetParent(); // C++ command
parent->GetSize(); // what I think the method should be OR ...
parent->GetWindowRect(); // what i think it should be (no arguments)

что это за LPRECT? У меня уже есть объект … почему и какой аргумент входит в GetWindowRect? На что я указываю? У меня уже есть объект, который я хочу найти размер … просто дайте мне размер.

2

Решение

LPRECT параметр является указателем на RECT состав (префикс «LP» фактически означает «длинный указатель» по историческим причинам).

GetWindowRect функция собирается получить прямоугольник окна для вашего CWnd объект, но он собирается сделать это, заполнив RECT структура с этими координатами. Поэтому вам нужно создать RECT структурировать и передать указатель на него GetWindowRect функция.

Стоит отметить, что API принимает указатель на RECT структура для полной совместимости с Win32. CRect Класс MFC на самом деле наследуется от RECT структура определяется SDK, так что вы можете использовать CRect здесь взаимозаменяемо Что приятно, потому что CRect предоставляет функции-члены, которые облегчают манипулирование прямоугольниками.

Образец кода:

CWnd* pwndParent = this->GetParent();

CRect rc;
pwndParent->GetWindowRect(&rc);

// rc now contains the rectangle of your window!

Обратите внимание, что GetWindowRect функция вернет экран координаты вашего окна. Обычно это не то, что вы хотите, если только вы не пытаетесь изменить положение окна на экране. С координатами экрана сложно работать, потому что они относятся ко всему виртуальному экрану, который может иметь отрицательные координаты в конфигурации с несколькими мониторами. Кроме того, если вы попытаетесь определить размер окна, используя его экранные координаты, вы получите полный размер окна на экране, включая не связанные с клиентом области (например, строку заголовка, кнопки min / max / close). , так далее.).

Вместо этого вы обычно хотите клиент координаты окна, которые можно получить, вызвав GetClientRect функция идентичным образом. На этот раз мы будем использовать RECT структура, только потому, что мы можем:

CWnd* pwndParent = this->GetParent();

RECT rcClient;
pwndParent->GetClientRect(&rcClient);
5

Другие решения

Ответ вы используете GetWindowRect,

CWnd* parent = this->GetParent();
CRect size;
parent->GetWindowRect(&size);

Если вы спрашиваете Зачем это сделано так, я могу придумать два ответа:

  1. МФЦ является очень старый (старше, чем некоторые люди, читающие это, я подозреваю). В те дни компиляторы не могли обрабатывать возвращаемые структуры по значению. С тех пор «обратная совместимость».
  2. МФЦ является (или, по крайней мере, изначально) очень тонкая оболочка над функциями Windows API.
6

хорошо, я понял свой ответ, я верю. Здесь для тех, кто хочет знать …

CRect rc_total_window;
this->GetWindowRect(rc_total_window);

где this это объект CWnd *. Еще раз спасибо за всю историю и объяснения. Это помогает узнать, почему все так, как есть, поэтому вы можете быть уверены, что не делаете что-то не так; особенно помогает, когда методология отличается от того, что изучалось на современных языковых курсах.

-1
По вопросам рекламы [email protected]