SetWindowPlacement, похоже, работает неправильно в отношении члена «rcNormalPosition». ⇐ C++
SetWindowPlacement, похоже, работает неправильно в отношении члена «rcNormalPosition».
Я работаю над приложением 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; } Код, сохраняющий структуру windowPlacement:
HKEY hkSettings; if (RegCreateKeyEx(HKEY_CURRENT_USER, REG_SUB_PATH, 0, nullptr, 0, KEY_WRITE, nullptr, &hkSettings, nullptr) == ERROR_SUCCESS) { RegSetValueEx(hkSettings, L"MainWindowPlacement", 0, REG_BINARY, reinterpret_cast(&placement), sizeof(placement)); RegCloseKey(hkSettings); } Код, извлекающий структуру windowPlacement из хранилища:
WINDOWPLACEMENT Placement = {}; HKEY hkSettings; if (RegOpenKeyEx(HKEY_CURRENT_USER, REG_SUB_PATH, 0, KEY_READ, &hkSettings) == ERROR_SUCCESS) { DWORD тип_dw; DWORD dwSize = sizeof(размещение); if (RegQueryValueEx(hkSettings, L"MainWindowPlacement", 0, &dwType, reinterpret_cast(&placement), &dwSize) == ERROR_SUCCESS) { if (dwType == REG_BINARY && dwSize == sizeof(placement)) { RegCloseKey(hkSettings); возвратное размещение; } } RegCloseKey(hkSettings); } Что-то я упускаю или делаю неправильно?
Я работаю над приложением 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; } Код, сохраняющий структуру windowPlacement:
HKEY hkSettings; if (RegCreateKeyEx(HKEY_CURRENT_USER, REG_SUB_PATH, 0, nullptr, 0, KEY_WRITE, nullptr, &hkSettings, nullptr) == ERROR_SUCCESS) { RegSetValueEx(hkSettings, L"MainWindowPlacement", 0, REG_BINARY, reinterpret_cast(&placement), sizeof(placement)); RegCloseKey(hkSettings); } Код, извлекающий структуру windowPlacement из хранилища:
WINDOWPLACEMENT Placement = {}; HKEY hkSettings; if (RegOpenKeyEx(HKEY_CURRENT_USER, REG_SUB_PATH, 0, KEY_READ, &hkSettings) == ERROR_SUCCESS) { DWORD тип_dw; DWORD dwSize = sizeof(размещение); if (RegQueryValueEx(hkSettings, L"MainWindowPlacement", 0, &dwType, reinterpret_cast(&placement), &dwSize) == ERROR_SUCCESS) { if (dwType == REG_BINARY && dwSize == sizeof(placement)) { RegCloseKey(hkSettings); возвратное размещение; } } RegCloseKey(hkSettings); } Что-то я упускаю или делаю неправильно?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
SetWindowPlacement, похоже, работает неправильно в отношении члена «rcNormalPosition».
Anonymous » » в форуме C++ - 0 Ответы
- 30 Просмотры
-
Последнее сообщение Anonymous
-