C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Отслеживание изменения положения формы
Шмель
Отправлено: 07.09.2006, 07:59


Ученик-кочегар

Группа: Участник
Сообщений: 2



Здравствуйте.
Описане задачи. Необходимо после закрытия приложения запоминать координаты основной формы и восстанавливать при запуске приложения. Можно запомнить координаты при событии OnDestroy, но есть маленькая деталь — а если мы закрывались в режиме "На весь экран"? Откуда вытянуть координаты окна, которые дожны быть использованы при попытке восстановить размер/положение окна из полноэкранного режима? Хочется, чтобы даже если мы выходили из приложения в полноэкранном режиме, а потом при запуске восстанавливали его, то чтобы была возможность восстановить и не полноэкранный режим?
PS: Событие OnResize похоже не подходит — оно происходит раньше, чем изменится состояние WindowsState (wsNormal/wsMaximalize) и мы запоминаем координаты полноэкранного режима. Да и перемещение окна это событие не отслеживает.
PPS: Или где хранятся координаты работающего приложения для восстановления окна из полноэкранного режима?
Спасибо.buyer@mail.ru

Отредактировано Шмель — 07/09/2006, 08:00
AVC
Отправлено: 07.09.2006, 08:47


Ветеран

Группа: Модератор
Сообщений: 1583



Где то видел в API как узнать нормальный размер максимизированного окна, но забыл где smile.gif (вспомню — напишу). А когда то давно сделал так — если окно максимизировано, то перед закрытием вернуть нормальный размер а, затем, сохранить. Работает много лет без нареканий.
Шмель
Отправлено: 07.09.2006, 10:42


Ученик-кочегар

Группа: Участник
Сообщений: 2



Попробовал, вроде должно работать. Но когда закрываешься из максимизированного режима, запоминаются "максимизированные" координаты. Да и вывод сообщения не замечен, хотя в ini- файл производится запись правильно. Почему так?
Следующий текст выдернут из события OnDestroy:
//Сохраняем состояние главной формы
if(Form1->WindowState == wsMaximized)
{
Ini->WriteString("Screen","maximimize_screen", "yes");
WindowState = wsNormal;
ShowMessage("Восстановили нормальный размер");
}
else
Ini->WriteString("Screen","maximimize_screen", "no");

RectForm1 = BoundsRect;
Ini->WriteInteger("Screen","top",RectForm1.Top);
Ini->WriteInteger("Screen","left",RectForm1.Left);
Ini->WriteInteger("Screen","width",RectForm1.Right-RectForm1.Left);
Ini->WriteInteger("Screen","height",RectForm1.Bottom-RectForm1.Top);
Guest
Отправлено: 07.09.2006, 11:49


Не зарегистрирован







CODE

FormClose: IniFormSave(this);

// Save Position, Size and State
PACKAGE void __fastcall IniFormSave (TForm *frm, const AnsiString &postfix)
{
bool b;
AnsiString sect, tmp;

sect = NativeFormName(frm) + postfix;
b = (frm->WindowState == wsMaximized)? true: false;
if (b) frm->WindowState = wsNormal;

tmp = AnsiString(frm->Top) + "," +
AnsiString(frm->Left) + "," +
AnsiString(frm->Height) + "," +
AnsiString(frm->Width) + "," +
AnsiString(b? 1: 0);

Windows_XY->WriteString("Forms", sect, tmp);
}

ShowMessage — не увидите если это главная форма ("процесс пошел" smile.gif ).

PS. Ммм.., типа, это я, avc, писал.

Отредактировано AVC — 07/09/2006, 10:53

Вернуться в Вопросы программирования в C++Builder