Шмель |
Отправлено: 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 как узнать нормальный размер максимизированного окна, но забыл где (вспомню — напишу). А когда то давно сделал так — если окно максимизировано, то перед закрытием вернуть нормальный размер а, затем, сохранить. Работает много лет без нареканий. |
|
Шмель |
Отправлено: 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 — не увидите если это главная форма ("процесс пошел" ).
PS. Ммм.., типа, это я, avc, писал.
Отредактировано AVC — 07/09/2006, 10:53 |
|
|