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