Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Маштабирование при изменении разрешения экрана


Автор: Бегемот 24.3.2005, 20:51
Здравствуйте! smile
Такая вот у меня проблемма:
Приложение работает в полноэкранном режиме. Мне необходимо, чтобы визуальные размеры компонентов оставались неизменными при любом разрешении экрана.
Спасибо.

Автор: JAnty 24.3.2005, 21:19
Никак (кажись).
Или вычисляй разрешение(разширение) зкрана и меняй размеры компонентов по процйнтному соотнашению размеров по высоте и ширине(замучеешся), а лучше запускай прогу в определённом режиме экрана и не меняй его во время выполнения проги, так проще smile

Автор: Бегемот 24.3.2005, 22:27
Цитата
вычисляй разрешение(разширение) зкрана и меняй размеры компонентов по процйнтному соотнашению размеров по высоте и ширине

После двух километров кода таким способомsmile я и задумался! smile...
Цитата
а лучше запускай прогу в определённом режиме экрана и не меняй его во время выполнения проги

...именно эта мысль меня ударила первой...так только программно не могу реальзовать
При запуске приложения, для начала, получаем текущее разрешение экрана
Код

   const int my_width = 800;
   const int my_height = 600;
   int screen_width, screen_height;


   screen_width = Form1->Monitor->Width;
   screen_height = Form1->Monitor->Height; 

...далее проверяем соответствует ли разрешение экрана пользователя нашему разрешению, т.е тому под которое писали прогу.
Код

   if((screen_width!=my_width) || (screen_height!=my_height )) 
   {
      /*------> тут то чего делать ?????<---------*/
   }

...ну и при выходе из приложения востанавливаем чего мы там наменяли smile
...вероятно так же как и меняли
smile

Автор: JAnty 25.3.2005, 10:39
Изменение параметров экрана:

// Для изменения параметров экрана используйте следующий
// код:
DEVMODE DM;
DM.dmSize = sizeof(DEVMODE);
DM.dmBitsPerPel = 16; // глубина цвета, бит на пиксель
DM.dmPelsWidth = 1024; // разрешение по горизонтали
DM.dmPelsHeight = 768; // разрешение по вертикали
DM.dmFields = DM_BITSPERPEL +
DM_PELSWIDTH +
DM_PELSHEIGHT +
DM_DISPLAYFREQUENCY;
DM.dmDisplayFrequency = 75; // частота обновления экрана
ChangeDisplaySettings(&DM, 0);
// ЗАМЕЧАНИЕ: при изменении параметров смотрите чтобы
монитор поддерживал это режим


Как узнать частоту обновления экрана:

// Для получения частоты обновления экрана напишите следующий код:
HDC hDCScreen = GetDC(NULL);
int Refresh = GetDeviceCaps(hDCScreen, VREFRESH);
ReleaseDC(NULL, hDCScreen);
// в Refresh содержится частота обновления экрана по горизонтали


Как узнать разрешение экрана (VCL вариант):

// Разрешение экрана можно узнать, прочитав значения
// свойств Screen->Width и Screen->Height:
int HorzRes = Screen->Width;
int VertRes = Screen->Height;


Как узнать разрешение экрана (WinAPI вариант):

// Для получения разрешения экрана напишите следующий код:
HDC hDCScreen = GetDC(NULL);
int Horres = GetDeviceCaps(hDCScreen, HORZRES);
int Vertres = GetDeviceCaps(hDCScreen, VERTRES);
ReleaseDC(NULL, hDCScreen);
// в Horres содержится разрешение экрана по горизонтали,
// в Vertres содержится разрешение экрана по вертикали.


Как узнать разрешение экрана:

// Для получения разрешения экрана напишите следующий код:
int screenW=GetSystemMetrics(SM_CXSCREEN);//Получить ширину экрана
int screenH=GetSystemMetrics(SM_CYSCREEN);//Получить высоту экрана
// в screenW содержится разрешение экрана по горизонтали,
// в screenH содержится разрешение экрана по вертикали.

Автор: Бегемот 25.3.2005, 19:29
Я вот никак не могу найти на форуме инфу по поводу того КТО МОЖЕТ? и КАК? повысить репутацию собеседнику. Кто-нибудь подскажите.
Ну а если я, нисколь не отметившийся гражданин, могу это сделать, то прошу руководство наградить JAnty плюсом. smile

JAnty, СПАСИБО, за подробный ответ на вопрос! smile
Здорово помог!

Автор: JAnty 25.3.2005, 20:15
Пожалусто smile

Автор: Perun 21.2.2008, 17:20
ДОбрый день, не подскажите, а размеры компоннтов при этом изменятся пропорционально?

Автор: UniBomb 21.2.2008, 21:14
некрофил....  smile 

Автор: Perun 22.2.2008, 09:44
Вы на что намекаете?
С этого места поподробнее...и по уважительней пожайлуста
Цитата

некрофил....

Приложение написано для разрешения 1280x1024
На форме используется AdvColumnGrid(без scrollbar'ов)
У меня проблема заключается в том, что при уменьшении разрешения сам Grid не уменьшается,
некоторые записи не видно и перемещаться по нему приходится при помощи стрелок.
Необходимо, чтобы просто Grid целиком отображался на форме, без искажений.

Автор: jonie 22.2.2008, 22:45
эт он шутит про поднятие тем 2005 года) благо человек поискал прежде чем задать вопрос, что есть гуд.
Цитата

Необходимо, чтобы просто Grid целиком отображался на форме, без искажений.
а в чем проблема подогнать форму к размеру грида (так чтобы грид отображался полностью)? 

Автор: Perun 26.2.2008, 12:14
Понятно...шутит.
А может Grid к размеру формы. Т.е. изменить размеры шрифта, формы, всех компонентов...
А короче, через масштабирование путь есть?

Автор: UniBomb 27.2.2008, 12:43
Perun, 

Если обидел - извини...

В общем, чтобы твой грид менялся подстать форме, то в его свойствах Anchors поставь все значение в true. Тогда грид будет меняться в размерах настолько же, насколько меняется форма.

Если ты хочеш при этом менять размеры ячеек (я так понял это какая то таблица) и размеры шрифта, то в событии OnResize формы сделай проверку размеров формы. Ну скажем например - если размеры формы лежат в пределах 600-800 пикселей, то размер шрифта мы установим равным 10ппт, а размеры ячейки 25х25. А если размеры лежат в пределах 800-1024 пикселей, то размер шрифта - 12ппт, а ячейки - 30х30. И т.д.


Я надеюсь правильно понял проблему......

Автор: Perun 28.2.2008, 17:43
Ничего всё нормально!
Благодарю за помощь - разобрался, получилось. smile   smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)