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 Гц.
Я бы убил
|
|
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
|
Спасибо!
Попробую применить. |
|