Я в настоящее время делаю много использования кода, как это для того, чтобы определить местоположение элемента управления в клиентской области окна:Безопасен ли CWnd :: ScreenToClient?
CRect rect;
GetDlgItem(IDC_CONTROL_ID)->GetWindowRect(&rect);
ScreenToClient(&rect);
Все работает нормально, но я обеспокоен по поводу безопасности этого кода , В частности, если пользователь перемещает окно между GetWindowRect
и ScreenToClient
из-за того, что поток, содержащий вышеуказанный код, приостановлен Windows, приведет ли он к неправильным результатам? Если да, есть ли лучший способ сделать это?
Более техническое объяснение: все потоки, отображающие окна, имеют связанную с ними очередь сообщений и при необходимости создаются операционной системой. Очередь сообщений принимает все сообщения, включая сообщения, созданные для событий перемещения. Очередь сообщений по существу сериализует сообщения, так что окно не перемещается, пока вы (или MFC) не обработаете сообщения перемещения. Таким образом, результаты 'GetWindowRect()' все равно будут действительны, если только он не вызывается в окне, которое нить не принадлежит. –
Вы не согласны с моим ответом, @Insilico? Или просто добавить дополнительную информацию? Да, сообщения будут эффективно сериализованы, но это не повлияет на выполнение функций GetWindowRect и ScreenToClient. –
Я просто добавляю немного больше информации. Я согласен с вашим ответом 100%. –