Шаг 184 - Создаем хранитель экрана

Давате сделаем основу для чего-нибудь полезного, например, хранителя экрана. Создаем проект с именем SaveScreen на базе диалогового окна. При использовании AppWizard отключайте все, что можно. На диалоговом окне удалите все кнопки. При этом диалоговое окно нужно сделать без рамки указав соответствующий стиль.

184_1.gif (5023 b)

Теперь нам нужно изменить функцию InitInstance():

BOOL CSaveScreenApp::InitInstance()
{

    if (!strcmpi(m_lpCmdLine,"/s") || 
		!strcmpi(m_lpCmdLine,"-s") ||
		!strcmpi(m_lpCmdLine,"s"))
    {
        SetDialogBkColor(RGB(0,0,0));
	CSaveScreenDlg dlg;
	m_pMainWnd = &dlg;
	dlg.DoModal();
    }
    return FALSE;
}

Итак, функцией SetDialogBkColor устанавливаем цвет фона диалога. А вот изначально проверяем параметры командной строки. Для хранителей экрана есть некоторые правила в том числе и на командные параметры.

c  для конфигурирования из конрольной панели
s  для запуска в режиме сохранения

Это все хорошо, но диалоговую панель необходимо сделать на весь экран. Это можно сделать в OnInitDialog.

BOOL CSaveScreenDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	SetIcon(m_hIcon, TRUE);			
	SetIcon(m_hIcon, FALSE);		
	SetWindowPos(&wndTopMost,0,0,::GetSystemMetrics(SM_CXSCREEN),
		::GetSystemMetrics(SM_CYSCREEN) ,SWP_SHOWWINDOW);
	return TRUE;   
}

Самое главное здесь в функции SetWindowPos, которая устанавливает размеры экрана получая их из системы используя GetSystemMetrics.

Для завершения работы необходимо при нажатии на клавишу или мышку. Ну это с помощью ClassWizard код вот такой:

void CSaveScreenDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	CDialog::EndDialog(IDOK); 	
}

void CSaveScreenDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	CDialog::EndDialog(IDOK);
}

void CSaveScreenDlg::OnRButtonDown(UINT nFlags, CPoint point) 
{
	CDialog::EndDialog(IDOK); 
}

Для того, чтобы название хранителя экрана было в контрольной панели нужно создать строковый ресурс вот такой.

184_2.gif (4315 b)

Главное, что значение строкового ресурса равно 1.

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

Поместить хранитель экрана надо в папку windows\system и поменять расширение на *.SCR. По этому расширению Windows определяет, что это хранитель экрана.

Выходов из этой ситуации наверно много, но вот я решил просто установить у окна title и по нему искать окно если она загружено, то запускать приложение нельзя. Выход конечно не очень хороший, вот он:

if (FindWindow(NULL,"SCREENSAVE")==NULL)	// title dialog тоже
		{   
			SetDialogBkColor(RGB(0,0,0));
			CSaveScreenDlg dlg;
			m_pMainWnd = &dlg;
			dlg.DoModal();
		}

Кто чего знает по этому поводу пишите не стесняйтесь.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 14.05.2000