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

в 9:58, , рубрики: c++, control, image, visual c++, Visual Studio, изображения, картинки, разработка, метки: , , , , ,

В 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.: Пример с исходниками можно скачать здесь. Данный класс еще нужно немного доработать, при масштабировании в изображении искажаются цвета, и размеры ползунков скролбаров не меняются при изменении размеров изображения.

Автор: DenisT


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js