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

 
Изменение масштаба приложения, при смене разрешения экрана
iosia
Отправлено: 31.05.2006, 08:27


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

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



Здравствуйте!
Подскажите, как сделать чтобы приложение корректно отображалось на экране при смене разрешения?
Создано при 1024х768; при уменьшении не помещается на экране, при увеличении остается свободное место (приложение полноэкранное).
Schumi
Отправлено: 31.05.2006, 09:16


Машинист паровоза

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



не совсем понятно, что тебе требуется.
Но как я понял...
Стоит все же разрабатывать под 800х600. У меня главная форма содержит кучу элементов, причем их много.
Я просто делаю в Constraints миним. длину и ширину в 800 и 600. Вероятность того, что человек будет работать с меньшим разрешением мала.

Потом использую для элементов Align. Для каких — нибудь toolbar alTop, для статусбаров alBottom. Остальные элементы распихивай по бокам (alLeft, alRight). А что — то основное (если есть) — мемо, грид, паинтбокс в alClient.

Учитывая еще один факт — если на форме используются компоненты из сторонних разработчиков — задай для формы Scaled = false. Иначе, если товарищ поменяет размер шрифта, станет не супер. Сам проверял. Оставлял Scaled в true только небольших форм — какой-нибудь изменение имени.
Правда если пишешь в 6 билдере, то там по умолчанию уже свойство установлено в false. В 5 придется поставить.
Guest
Отправлено: 31.05.2006, 13:04


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







QUOTE (iosia @ 31/05/2006, 08:27)
Здравствуйте!
Подскажите, как сделать чтобы приложение корректно отображалось на экране при смене разрешения?
Создано при 1024х768; при уменьшении не помещается на экране, при увеличении остается свободное место (приложение полноэкранное).

Настройка расположения контролов на форме
Что значит полноэкранное — форма максимизирована или это "досовский" экран?
iosia
Отправлено: 31.05.2006, 13:33


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

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



Да, форма максимизирована и пользователь не может управлять размером формы. Может лучше будет сделать чтобы при запуске программы разрешение изменялось на заданное. Опять же не знаю, как это реализовать.
Gal
Отправлено: 31.05.2006, 13:56


Станционный диспетчер

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



почитай про класс TScreen...
Gedeon
Отправлено: 31.05.2006, 14:43


Ветеран

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



QUOTE (iosia @ 31/05/2006, 13:33)
Может лучше будет сделать чтобы при запуске программы разрешение изменялось на заданное.

Я бы не стал.
Один из примеров: допустим юзер всегда работает на 800*600
тут ему твоя прога ляп 1024*768 и нате вам 60 Гц.
Я бы убил smile.gif
iosia
Отправлено: 31.05.2006, 16:13


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

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



Согласен. Это просто размышления, перебираю варианты. Ведь практически любая программа корректно отображается при любых разрешениях экрана (специально проверял). Как то же это реализовано. Вот и хочу спросить. Как?
Grigoriy
Отправлено: 31.05.2006, 17:14


Мастер участка

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



QUOTE (iosia @ 31/05/2006, 13:33)
Да, форма максимизирована и пользователь не может управлять размером формы. Может лучше будет сделать чтобы при запуске программы разрешение изменялось на заданное. Опять же не знаю, как это реализовать.

Всегда стремлюсь помочь новеньким.

структура DEVMODE
CODE

typedef struct _devicemode { // dvmd
BCHAR dmDeviceName[CCHDEVICENAME];
WORD dmSpecVersion;
WORD dmDriverVersion;
WORD dmSize;
WORD dmDriverExtra;
DWORD dmFields;
short dmOrientation;
short dmPaperSize;
short dmPaperLength;
short dmPaperWidth;
short dmScale;
short dmCopies;
short dmDefaultSource;
short dmPrintQuality;
short dmColor;
short dmDuplex;
short dmYResolution;
short dmTTOption;
short dmCollate;
BCHAR dmFormName[CCHFORMNAME];
WORD dmLogPixels;
DWORD dmBitsPerPel;
DWORD dmPelsWidth;
DWORD dmPelsHeight;
DWORD dmDisplayFlags;
DWORD dmDisplayFrequency;
} DEVMODE;


Для монитора важны только параметры
dmBitsPerPel
dmPelsWidth
dmPelsHeight
dmDisplayFlags
dmDisplayFrequency

При создании формы
CODE

void __fastcall TForm1::FormCreate(TObject *Sender)
{
DEVMODE dmScreenSettings;

memset(&dmScreenSettings, 0, sizeof(DEVMODE));
dmScreenSettings.dmSize = sizeof(DEVMODE);
dmScreenSettings.dmPelsWidth = 800;//ширина изображения экрана в пикселах
dmScreenSettings.dmPelsHeight = 600;//высота изображения экрана в пикселах
dmScreenSettings.dmBitsPerPel = 32;//режим кодирования цвета (число бит на пиксел)
dmScreenSettings.dmFields=DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY | DM_BITSPERPEL;/*при изменении графического режима системой будут учитываться изменение разрешения по высоте, ширине, частота мерцания и число бит на пиксел*/
dmScreenSettings.dmDisplayFrequency=100;//частота мигания экрана

ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN);//вызов API функции установки графического режима
}


Как узнать параметры всех поддерживаемых графических режимов ?

CODE

DEVMODE dmSS;
int i,j;
AnsiString dd;
dmSS.dmFields=DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY | DM_BITSPERPEL;
Memo1->Lines->Clear();
i=0;
do{
/*
Эта функция возвращает параметры видеорежима с номером i в третий параметр.
Если i > (количество видеорежимов), то возвращает 0.
Первый параметр — номер монитора, может быть 0.
*/
j=EnumDisplaySettings(0,i,&dmSS);
if (j)
Memo1->Lines->Add(IntToStr(dmSS.dmPelsWidth)+"*"+IntToStr(dmSS.dmPelsHeight)+
" "+IntToStr(dmSS.dmBitsPerPel)+" bits "+IntToStr(dmSS.dmDisplayFrequency)+" Гц");
i++;
}while (j>0);


Отредактировано Grigoriy — 31/05/2006, 17:22
iosia
Отправлено: 31.05.2006, 20:00


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

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



Спасибо!
Попробую применить.

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