SetWindowPlacement, похоже, работает неправильно в отношении члена «rcNormalPosition».C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 SetWindowPlacement, похоже, работает неправильно в отношении члена «rcNormalPosition».

Сообщение Anonymous »


Я работаю над приложением Win32 C++. Я пытаюсь сохранить границы и максимальное/свернутое/нормальное состояние окна.

В обработчике WM_DESTROY моего окна я получаю структуру WINDOWPLACEMENT для окна и сохраняю ее в реестре.

В обработчике WM_CREATE моего окна я получаю ранее сохраненную структуру WINDOWPLACEMENT и вызываю с ее помощью SetWindowPlacement(). Если окно не было развернуто или свернуто при сохранении структуры, все работает как положено.

Однако, если окно было свернуто или развернуто, оно будет выглядеть свернутым или развернутым, как ожидалось, но не вернется в правильное положение. Если окно было развернуто, то при нажатии кнопки восстановления размер окна останется прежним.

Вот объявления функций, которые я создал для сохранения структуры:

[[nodiscard]] std::optional LoadMainWindowPlacement(); void SaveMainWindowPlacement (const WINDOWPLACEMENT& размещение); В этих двух функциях элемент length уже установлен. Для SaveMainWindowPlacement() он устанавливается вызывающим кодом. Для LoadMainWindowPlacement() он устанавливается внутри функции.

Обработчик WM_DESTROY:

случай WM_DESTROY: { WINDOWPLACEMENT размещение = {}; Placement.length = sizeof(WINDOWPLACEMENT); GetWindowPlacement(hwnd, &placement); SaveMainWindowPlacement (размещение); PostQuitMessage (0); вернуть 0; } Обработчик WM_CREATE:

кейс WM_CREATE: { автоматическое размещение = LoadMainWindowPlacement(); если (placement.has_value()) { SetWindowPlacement(hwnd, &placement.value()); } еще { const auto screenWidth = GetSystemMetrics (SM_CXMAXIMIZED); const auto screenHeight = GetSystemMetrics (SM_CYMAXIMIZED); Окно RECTRect; GetWindowRect(hwnd, &windowRect); const auto windowWidth = windowRect.right - windowRect.left; const auto windowHeight = windowRect.bottom - windowRect.top; const auto x = (screenWidth - windowWidth)/2; const auto y = (screenHeight - windowHeight)/2; SetWindowPos(hwnd, nullptr, x, y, 0, 0, SWP_NOZORDER | SWP_NOSIZE); ShowWindow(hwnd, SW_SHOWDEFAULT); } вернуть 0; } Что-то я упускаю или делаю неправильно?
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • SetWindowPlacement, похоже, работает неправильно в отношении члена «rcNormalPosition».
    Anonymous » » в форуме C++
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • SetWindowPlacement не исправляет размещение окон инструментов WPF
    Anonymous » » в форуме C#
    0 Ответы
    32 Просмотры
    Последнее сообщение Anonymous
  • Использование члена int в качестве параметра шаблона внутри функции-члена consteval
    Гость » » в форуме C++
    0 Ответы
    66 Просмотры
    Последнее сообщение Гость
  • Как захватить члена класса члена класса в лямбда-выражении
    Anonymous » » в форуме C++
    0 Ответы
    92 Просмотры
    Последнее сообщение Anonymous
  • Как захватить члена класса члена класса в лямбда-выражении
    Anonymous » » в форуме C++
    0 Ответы
    119 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»