Шаг 20 - Масштабирование графического изображения

Создание проекта

Дополняем наш проект. Создаем класс CZoomWindow также как в Шаге 16.

20_1.gif (2392 b)

Создаем код

Описание функций класса CZoomWindow.

#endif // _MSC_VER > 1000
#include "afxwin.h"
class CZoomWindow
{
public:
CZoomWindow();
virtual ~CZoomWindow();
CSize GetWin(); // получить размер окна
CSize GetView(); // получить единицы разрешения
void ZoomIn(); // увеличение
void ZoomOut(); // уменьшение
private:
CSize win; // размер окна
CSize view; // единицы разрешения
};
#endif // !defined(AFX_ZOOMWINDOW_H__27523D43_6E14_11D5_B617_C90BBA3D9146__INCLUDED_)

Реализация функций.

CZoomWindow::CZoomWindow()
{
win=CSize(1,1); // начальные установки
view=CSize(1,1);
}
CZoomWindow::~CZoomWindow()
{
}
void CZoomWindow::ZoomIn() // больше
{
if (win==CSize(1,1)) view+=CSize(1,1); // если размер окно достиг минимума увеличивать разрешение
else win-=CSize(1,1); // иначе менять размер окна
}
void CZoomWindow::ZoomOut() // меньше
{
if (view==CSize(1,1)) win+=CSize(1,1); // если разрешение достигло минимума менять размер окна
else view-=CSize(1,1); // иначе уменьшать разрешение
}
CSize CZoomWindow::GetWin()
{
return win; // вернуть размер окна
}
CSize CZoomWindow::GetView()
{
return view; // вернуть разрешение
}

Теперь нужно включить описания класса в наш основной файл.

#include "ScreenPos.h"					// класс координаты
#include "ZoomWindow.h" // класс масштабирования
#define IDC_MYBUTTON 100 // Идентификатор кнопки

Объявить класс в классе рамки окна.

class CMainWnd : public CFrameWnd
{
public:
............
CScreenPos position; // Это класс координат
CZoomWindow zoomWin; // Это класс для масштабирования
BOOL blFlagMove; // Это флаг перемещения
};

Меняем реакцию на двойные нажатия мышью.

void CMainWnd::OnRButtonDblClk( UINT, CPoint ) 
{
zoomWin.ZoomOut(); // правая кнопка, меньше
Invalidate(TRUE); // перерисовывать экран
my_ToolBar.Invalidate(TRUE); // панель инструментов
}
void CMainWnd::OnLButtonDblClk( UINT, CPoint)
{
zoomWin.ZoomIn(); // левая кнопка, больше
Invalidate(TRUE); // перерисовывать экран
my_ToolBar.Invalidate(TRUE); // панель инструментов
}

Меняем OnPaint.

void CMainWnd::OnPaint()
{
.............
CPen MyPen(PS_DASHDOT,1,RGB(0,255,0)); // настраиваем перо
dc.SetMapMode( MM_ANISOTROPIC); // режим
dc.SetViewportExt(zoomWin.GetView()); // разрешение
dc.SetWindowExt(zoomWin.GetWin()); // размер

dc.SelectObject(MyPen); // выбираем перо
............
}

Вот так будет работать наша программа.

20_2.gif (9627 b)

Описание

Масштабирование в данной реализации основано на идеи применения двух функций.

SetViewportExt применяется для определения желаемых единиц, ориентации и масштабирования осей. Если ей передать в параметры (1,1) то не изменится нечего, а вот если (2,2) то графическое изображение увеличится. Соответственно наращивая эти параметры можно увеличивать изображение, уменьшая уменьшать. Но вот есть что, уменьшать можно до 1 , дальше при переходе к отрицательным значения изображение опять увеличивается. И выход из этого есть в другой функции.

SetWindowExt устанавливает заданные размеры окна. Так вот увеличивая экран, уменьшается изображение. То есть параметры можно наращивать и изображение уменьшится, и наоборот, с границей на единице(1).

view+=CSize(1,1); Так я увеличиваю view на один. Класс CSize имеет перегруженные функции + и -. Для того чтобы не создавать отдельный класс CSize(1,1) мы его создаем в ходе сложения.

Остальное известно из прошлых шагов. Я надеюсь что, известно. Если Вы желаете поделиться опытом масштабирования - Пишите.

Шпаргалка

SetViewportExt - Увеличивает изображение.

CDC
virtual CSize SetViewportExt( int cx, int cy );
virtual CSize SetViewportExt( SIZE size );

SetWindowExt - Уменьшение изображения.

CDC
virtual CSize SetWindowExt( int cx, int cy );
virtual CSize SetWindowExt( SIZE size );

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