Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Программное изменение частоты экрана


Автор: 12usver12 22.1.2007, 19:30
Всем привет!
Подскажите, пожалуйста, как программно менять частоту обновления экрана?
И возможно ли это?
Если есть какие-нибудь ссылки на эту тему - буду очень благодарна! smile 

Автор: Franc 22.1.2007, 19:49
Простите что обращаюсь, но подскажите пожалуйста как в db Access в таблице вставлять музыкальные файлы? Если знаете подскажите.

Автор: sgi1981 24.1.2007, 03:25
Код
DEVMODE dmScreenSettings;

memset(&dmScreenSettings, 0, sizeof(DEVMODE));
dmScreenSettings.dmSize   = sizeof(DEVMODE);
dmScreenSettings.dmPelsWidth    = 800;//к примеру
dmScreenSettings.dmPelsHeight   = 600;//к примеру
dmScreenSettings.dmBitsPerPel = 24;//к примеру
dmScreenSettings.dmFields=DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY;
dmScreenSettings.dmDisplayFrequency=100;//частота мигания экрана

ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN);


Автор: 12usver12 28.1.2007, 19:48
Большое спасибо за совет! Очень помог!
Но теперь появился другой вопрос: как узнать, какая  частота была у пользователя? Вдруг я поставлю
ему 85 Гц, в то же время как его монитор такую частоту не поддерживает,
только ниже. Вот с разрешением было проще - GetDeviceCaps получил и все дела - узнал разрешение экрана.
А для получения информации о частоте обновления какой-нибудь способ есть?

Автор: sgi1981 29.1.2007, 19:38
Да. Можно узнать все доступные видеорежимы с помощью API-функции
EnumDisplaySettings.
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1ChangeDisplaySettings.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
DEVMODE dmScreenSettings;
int i1;
memset(&dmScreenSettings, 0, sizeof(DEVMODE));
dmScreenSettings.dmSize   = sizeof(DEVMODE);
dmScreenSettings.dmPelsWidth    = Edit1->Text.ToIntDef(800);//ширина
dmScreenSettings.dmPelsHeight   = Edit2->Text.ToIntDef(600);//высота
dmScreenSettings.dmBitsPerPel = Edit4->Text.ToIntDef(32);//число бит на пиксел
dmScreenSettings.dmFields=DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY | DM_BITSPERPEL;//флаги
dmScreenSettings.dmDisplayFrequency=Edit3->Text.ToIntDef(75);//частота мигания
i1=ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
DEVMODE dmSS;
int i,j;
AnsiString dd;
dmSS.dmFields=DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY | DM_BITSPERPEL;
Memo1->Lines->Clear();
i=0;
do{
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);
}
//---------------------------------------------------------------------------


Выводите список доступных видеорежимов и пусть пользователь в

Автор: 12usver12 2.2.2007, 23:59
Большое спасибо за советы!
По окончании работы второй функции выводится две таких сомнительных записей:
    640 х 480 4 bits 1Гц
    680 х 600 4 bits 1Гц
Если немного подкорректировать, то получается, что когда dmSS.dmDisplayFrequency принимает 1, цикл завершается, и такие значения уже не выводятся. Но когда пытаюсь присвоить переменной полученное значение dmSS.dmDisplayFrequency, то все равно выходит 1Гц. Интересно, что следует дописать, чтобы считывалось предпоследнее значение (последнее равняется единице)?

Код

void CTestDlg::OnButton2() 
{
    m_List.ResetContent();
    DEVMODE dmSS;
    int i,j;
    CString dd;
    CString str;
    CString str2;

    dmSS.dmFields=DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY | DM_BITSPERPEL;

    i=0;
    int a = 0;
    int b = 0;
    do{
        j=EnumDisplaySettings(0,i,&dmSS);
        
        if (j){
            b=dmSS.dmDisplayFrequency;
            if( b == 1 )
                break;
    
            dd.Format("%d)  %d x %d  %d bits  %d Гц",
                i+1,
                dmSS.dmPelsWidth,       
                dmSS.dmPelsHeight,      
                dmSS.dmBitsPerPel,      
                dmSS.dmDisplayFrequency
                );

            m_List.AddString(dd);
            a = m_List.GetCount();
            str.Format("%d",a);
            m_st.SetWindowText(str);/**/
            
//        if( b == 1 )
//            break;

        }
    //    dmSS.dmDisplayFrequency = i;
        //b=dmSS.dmDisplayFrequency;
        //if( b == 1 )
        //    return;
        i++;
    }while (j>0);

    
    str2.Format("%d",b);
    m_st2.SetWindowText(str2);

//    if( b == 1 )
//        return;
//    else
//    MessageBox(str2);
}

P.S. код и результат в скриншоте

Добавлено @ 00:06 
Мне просто хочется настроить свою программу таким образом, чтобы она автоматически определяла оптимальный видеорежим и тем самым обеспечивала более комфортную работу с приложением. А по окончании - возврат тех значений, которые у пользователя были. Думаю, не каждому будет приятно каждый раз лазить в настройки и все менять на прежнее  smile 

Автор: sgi1981 3.2.2007, 23:53
Моя демка, которую я компилировал на Borland C++ Builder 6.0.

Полный архив с исходниками можно скачать вот от сюда
http://www.cbuilder.ru/forums/index.php?act=Attach&type=post&id=36325

В общем суть выполнения этого фрагмента кода в следующем.
Когда начинает выполняться программа под WINDOWS - выполняется функция WinMain.
Ее код вызывает функцию инициализации диалога, в данном случае это функция не API, а собственная ShowStartupOptions, код которой вызывает API-функцию DialogBoxParamA, в качестве параметров которой передается адрес оконной функции диалогового окна и номер ресурса для создания диалогового окна (ресурс должен быть описан и подключен к исполняемому файлу при компиляции его). Затем, когда ОС создает исходя из ресурса диалоговое окно - она автоматически вызывает оконную функцию этого окна. Оконная функция содержит код, выполняемый при поступлении определенных сообщений, которые поступают как параметры функции окна. В данном случае обрабатывается команда инициализации диалога, нажатия на кнопку "OK", и нажатия на кнопку "CANCEL". При инициализации диалога оконная функция заполняет структуру PIXELFORMATDESCRIPTOR с данными о желаемом пиксельном формате для того, чтобы вызвать функцию [b]ChoosePixelF

Автор: 12usver12 4.2.2007, 20:27
Спасибо за советы! И отдельное большое спасибо за предоставленную программу! Сразу все стало на свои места. Просто вы показали мне пример на Build C++, в то время как моя программа пишется на Visual C++. И живой, работающий пример очень помог разобраться со всеми тонкостями работы с видеорежимами! Вы мне очень помогли! Думаю, на этом проблема успешно завершена.  smile 
Быть может, до встречи на форуме!  smile 

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