Шаг 155 - Борьба с однообразием, круглое окно

Сначала посмотрите как работает. Я просто в шоке. Сначало обычный запуск.

155_1.gif (2715 b)

Теперь нажмем правую кнопку мыши.

155_2.gif (2392 b)

При некоторой доли сноровки можно добиться и такого эффекта.

155_3.gif (3019 b)

Нажмете левую кнопку и окно вернется к начальному виду.

Итак, создаем приложение как MFC AppWizard. Пусть оно будет SDI и имя у него будет tt. В классе приложения заведем переменную типа регион.

class CTtApp : public CWinApp
{
public:
	HRGN rgn;
	CTtApp();
........
};

И сохраним регион окна при инициализации окна.

////////////////////////////////////
// CTtApp initialization

BOOL CTtApp::InitInstance()
{
	.......
	GetWindowRgn(m_pMainWnd->m_hWnd,rgn);
	return TRUE;
}

Вот теперь окно можно будет востановить. Код при нажатии на правую кнопку мыши.

void CTtView::OnRButtonDown(UINT nFlags, CPoint point) 
{
 AfxGetApp()->m_pMainWnd->SetWindowRgn( CreateEllipticRgn(40, 40, 300, 200),true);	
 CView::OnRButtonDown(nFlags, point);
}

И левую при востановлении.

void CTtView::OnLButtonDown(UINT nFlags, CPoint point) 
{
    CTtApp* tt=(CTtApp*)AfxGetApp();
    AfxGetApp()->m_pMainWnd->SetWindowRgn(tt->rgn,true);
    CView::OnLButtonDown(nFlags, point);
}

Вот и всё. Смотрите на код. Основой этого года является понятие регион. Это давайте договоримся что это область окна. Её можно получить использовав функцию GetWindowRgn. И поменять SetWindowRgn помня, что все эти функции находятся в классе CWinApp. Регионы бывают разные. Например, эллипсоидные. Вот такой регион мы и делаем. Чем же регион отличается от класса CRect. Только тем, что CRect всегда прямоугольник, а регион может принимать разные формы.


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 17.03.2000