CWnd :: ScreenToClient безопасно? - PullRequest
       0

CWnd :: ScreenToClient безопасно?

2 голосов
/ 23 февраля 2012

В настоящее время я часто использую такой код для определения местоположения элемента управления в клиентской области окна:

CRect rect;
GetDlgItem(IDC_CONTROL_ID)->GetWindowRect(&rect);
ScreenToClient(&rect);

Все работает нормально, но я беспокоюсь о безопасностиэтого кода.В частности, если пользователь перемещает окно между GetWindowRect и ScreenToClient из-за того, что поток, содержащий вышеуказанный код, был приостановлен Windows, будет ли он давать неправильные результаты?Если так, есть ли лучший способ сделать это?

1 Ответ

1 голос
/ 23 февраля 2012

Пользователь не сможет вообще перемещать окно, пока выполняется код внутри функции обработчика сообщений. Так что нет, это не будет проблемой.

Пользовательский интерфейс в основном временно заморожен или приостановлен во время работы вашего кода. Технически, это потому, что Windows не может обрабатывать другие сообщения, пока вы не вернетесь. Цикл сообщений снова запускается, когда вы возвращаетесь из функции обработчика сообщений, возвращая управление.

Именно поэтому вам не следует выполнять код, выполнение которого занимает много времени (например, сложные вычисления) внутри ваших обработчиков сообщений, поскольку пользовательский интерфейс будет заморожен до его завершения. Вместо этого вы должны выделить отдельный поток для запуска такого рода вещей. Поскольку вы здесь не многопоточны (и вам это не нужно, поскольку выполнение этого кода занимает незначительное количество времени), проблем с повторным входом не будет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...