- PVSM.RU - https://www.pvsm.ru -

Image Control своими руками в Visual C++

В Visual C++ нет нормального стандартного способа отображения произвольных изображений на форме. Конечно, можно воспользоваться Picture Control, но изображение в нем можно установить только из ресурсов (насколько я помню), отсутствует возможность масштабирования, и нет поддержки скролбаров, если изображение выходит за границы контрола. Эти задачи и были реализованы в Image Control (часть кода была заимствована из другого контрола, но к сожалению источник уже затерялся, так как делал я это давно).

Называется класс CImageViewer, и наследуется он от CWnd. Изображение, отображаемое в контроле, хранится в члене класса m_image с типом CImage. Это позволит нам отображать изображения большинства популярных форматов. Основные методы класса:

— Установка изображения: void SetImage(CImage *image);
— Увеличить: void ZoomIn();
— Уменьшить: void ZoomOut();

Остальные методы и члена класса являются служебными.

void Paint() отвечает за отрисовку изображения и установка Scroll Bar если нужно.

Использовать класс очень просто, кидаете на форму Custom control, устанавливаете свойство Class в значение CImageViewer и добавляете переменную image_ctrl с типом CimageViewer (не забываем подключить заголовочный файл ImageViewer.h). Далее создаете объект с типом CImage, например img и вызываете метод CImageViewer::SetImage:

image_ctrl.SetImage(&img)

Используя функции ZoomIn()/ZoomOut() можно увеличивать и уменьшать изображение.

Иногда могут потребоваться координаты, в которых щелкнули левой кнопкой мыши, для этого нужно переопределить класс CImageViewer примерно так:

class CMyImageViewer : public CImageViewer
{
public:
	//CMyImageViewer():CImageViewer(){}
	//~CMyImageViewer(){}
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	CWnd* m_sxema;
};

И реализовать функцию OnLButtonDown:

void CMyImageViewer::OnLButtonDown(UINT nFlags, CPoint point)
{
	int hp = GetScrollPos(SB_HORZ);
	int vp = GetScrollPos(SB_VERT);
	
	point.x = point.x + hp;
	point.y = point.y + vp;

	CWnd::OnLButtonDown(nFlags, point);
}

Image Control своими руками в Visual C++

P. S.: Пример с исходниками можно скачать здесь [1]. Данный класс еще нужно немного доработать, при масштабировании в изображении искажаются цвета, и размеры ползунков скролбаров не меняются при изменении размеров изображения.

Автор: DenisT


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/razrabotka/3977

Ссылки в тексте:

[1] здесь: http://files.mail.ru/J9VKR7