Скептическое поведение функции MoveWindow

#c #winapi

#c #winapi

Вопрос:

MoveWindow(int x, int y, int nWidth, int nHeight,false) даже использовал SetWindowPos(amp;wndTopMost, m_iLeft, m_iTop, m_iWidth, m_iHeight, false);

поскольку я не хочу перерисовывать свое окно, я передаю параметр перерисовки MoveWindow с false . но оно перерисовывает окно. Это поведение отлично работает, если я использую LeadTool версии 16, но в версии 16.5 функция MoveWindow теряет свою функциональность. не знаю, как это связано с LeadTool.

С нетерпением ждем любой помощи по этому вопросу

Комментарии:

1. Вы могли бы, по крайней мере, добавить некоторые теги, объясняющие, к какому API принадлежат «MoveWindow», «SetWindowPos» и т. Д. Win32? Что-то еще? Кто знает?

2. Было бы неплохо получить более подробную информацию и код, чтобы лучше понять вашу проблему. Скорее всего, окно перерисовывается другим сообщением / событием. Попробуйте использовать Spy для регистрации и диагностики сообщений в окне, чтобы точно увидеть, что происходит.

Ответ №1:

Это не (единственный) ваш вызов, когда окно должно быть перекрашено. Когда вы получаете WM_PAINT , windows сообщает вам, что окно должно быть нарисовано. «Я не хочу» — недостаточная причина.

Комментарии:

1. Сообщение WM_PAINT отправляется при вызове функции UpdateWindow или RedrawWindow. Не уверен, что это произойдет в случае MoveWindow. Я просто хочу установить координаты окна, масштабировать изображение и перерисовать окно, вызвав ReDraw() . но MoveWindow рисует изображение, которое не масштабируется. и не может вызвать его после удаления изображения.

2. @Akmal khan : Что более важно, WM_PAINT отправляется после InvalidateRect, который вызывается довольно многими операциями. На самом деле не имеет значения, какие операции вызывают это. MoveWindow ничего не рисует; это не могло.

Ответ №2:

Вы меняете ширину или высоту окна? Если это так, и если в целевом окне установлены биты стиля класса CS_HREDRAW или CS_VREDRAW, то изменение размера приведет к полной перерисовке. (Простое перемещение, вероятно, не приведет к перерисовке, если его перемещение не откроет часть окна, которая ранее была скрыта каким-либо другим окном.)

Кстати, последний параметр для SetWindowPos представляет собой набор битов, а не true / false , а первый параметр выглядит странно, это должен быть простой HWND, а не адрес переменной. Подробности см. в MSDN на SetWindowPos.