#pragma once


#ifdef _INTERFACE_OBJECT_EXPORT_
#define _INTERFACE_OBJECT_FUN_  __declspec(dllexport)
#else
#define _INTERFACE_OBJECT_FUN_  __declspec(dllimport)
#endif


#include <Windows.h>
#include <vector>
#include <string>

/*
图像显示方向 ,0,90,190
*/
typedef enum _AVD_IMAGE_DIRECTION_METHOD_
{
	DIRECTION_0,
	DIRECTION_90,
	DIRECTION_180,
	DIRECTION_270
}emImageDirection;
 

/*
信息显示位置； 
*/
typedef enum _ADV_INFO_POS_
{
	POS_LEFT_TOP = 0,
	POS_RIGHT_TOP = 1,
	POS_LEFT_BOTTOM = 2,
	POS_RIGHT_BOTTOM = 3
}emADVInfoPos;


/////////////////////////////////图像信息指定显示项
#define  PIC_INFO_TEXT_IMAGE_IDX   0x01   //图像序号
#define  PIC_INFO_TEXT_IMAGE_SIZE  0x02   //图像尺寸
#define  PIC_INFO_TEXT_ZOOM_VALUE  0x04   //缩放比例
#define  PIC_INFO_TEXT_MOUSE_PT	   0x08   //鼠标位置。（屏幕位置）
#define  PIC_INFO_TEXT_PIC_POS     0x10   //图像当前位置
#define  PIC_INFO_TEXT_IMAGE_EXT   0X20   //图像扩展信息
#define  PIC_INFO_TEXT_IMAGE_TIME  0X40   //图像时间信息
#define  PIC_INFO_TEXT_IMAGE_KM    0X80   //图像里程信息
#define  PIC_INFO_TEXT_CURRENT_MODE     0X100  //是否显示当前模式；


typedef struct _IMAGE_TIME_
{
	int nYear;
	int nMonth;
	int nDay;
	int nHour;
	int nMintue;
	int nSecond;
}stImageTime;

typedef struct _ADV_IMAGE_BASE_INFO_
{
	long nImageIndex; //图号
	long lKm;         //图像里程。千米信息;
	long lM;          //图像里程。米信息;

	int   nImageWidth;   //图像宽度
	int   nImageHeight;  //图像高度
 
	stImageTime _time;   //图像采集时间；

	std::string strInfoExt; //扩展信息，如果设置为显示图像信息，此信息将显示在信息的最后位置

}stImageBaseInfo;


typedef enum _ADV_MARK_STATUS_
{
	_MARK_STATUS_SELECT   = 0, //缺陷为选中状态。.//调用方，请不要设置此值。（保留值）
	_MARK_STATUS_INVALID  = 1, // 无效的缺陷
	_MARK_STATUS_VALID    = 2,				// 有效的缺陷
	_MARK_STATUS_UNKONWN  = 3				// 待定的缺陷
}emMarkStatus;

// 缺陷结构体
typedef struct _ADV_MARK_INFO_
{
	long    lFaultIndex;     //缺陷的ID，全局唯一；
	long	nImageIndex;     // 缺陷所在图像的序号
	long	nKM;             // 缺陷里程信息; 
	long	nM;              // 缺陷里程信息
	long	iFaultX;         // 缺陷位置信息
	long	iFaultY;
	long	iFaultCx;
	long	iFaultCy;
	emMarkStatus	iFaultState; //缺陷状态
	long    nFaultTypeID;        //缺陷类型序号;
	std::string strFaultName;
	_ADV_MARK_INFO_()
	{
		lFaultIndex = -1;
		nImageIndex = -1;
	}
}stMarkInfo;

 
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//                                                   控件调用方需要实现的虚基类
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////
class  IAveImageNotify
{
public:
	 
	/////
	//通知上层.当前新添加的标记区域 ::上层需要填充:stFaultInfo::nImageIndex值
	/*
	这个回调里面，必须要填充：
	   lFaultIndex
	   nFaultTypeID
	   strFaultName   
	   返回失败，控件将放弃此次标记结果;
	*/
	virtual BOOL OnControlInsertMark(UINT nID,stMarkInfo&) = 0;

	//通知上层，标记区域发生变化；  
	virtual BOOL OnControlModifyMark(UINT nID,stMarkInfo&) = 0;
	//通知当前图像的缩放比例
	virtual void OnZoomValueChange(UINT nID,const float& _curValue) = 0;
	//控件鼠标右键消息，出入当前选中图像号和标记区域ID.... -1为没有任何选择；
	virtual void OnControlRButtonDown(UINT nID,long lImageIdx, long lMarkIdx) = 0; 

	//测量状态，当前测量的宽度和高度，图像的真是像素。_showInfo 上层传入控件，测量时显示的内容。
	virtual void OnControlMeasure(UINT nID,int nWidth, int nHeight, std::string& _showInfo) = 0;
};

class IAdvImageShowControl
{
public:
	virtual ~IAdvImageShowControl() {};
public:
	typedef enum _FULLSCREEN_MONITOR_STATUS_
	{
		MONITOR_ALL = 0,       //全屏显示在所有显示器上。
		MONITOR_CURRENT = 1,   //全屏显示在当前程序所在显示器上
		MONITOR_DEFAULT = 2    //全屏显示在主显示器上;
	}emFullScreenMonitorStatus;
public:

	///////////////////////////////////////////////////////////////////////////////////////////////////////////
	//
	//                                                     控件初始化
	//
	///////////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual BOOL Create(HWND hParent, int x, int y, int cx, int cy,IAveImageNotify*,UINT nControlID) = 0;
	virtual UINT GetControlID() = 0;

	//设置控件显示或隐藏;
	virtual void ShowControl(BOOL bShow) = 0 ;
	//获取控件是否显示
	virtual BOOL IsControlVisible() = 0;
	//设置控件ENABLE;
	virtual void EnableControl(BOOL  bEnable) = 0;
	//控件是否ENABLE;
	virtual BOOL IsControlEnable() = 0;
 
	//设置控件大小和位置;
	virtual void SetControlPos(int x, int y, int cx, int cy) = 0;
	//获取控件位置和大小;
	virtual void GetContrlPos(int& x, int& y, int& cx, int& cy) = 0;

	//设置控件背景色;
	virtual void SetControlBackColor(COLORREF) = 0;
	//获取控件背景色;
	virtual void GetControlBackColor(COLORREF&) = 0;


	virtual void SetControlData(DWORD_PTR pData) = 0;
	virtual DWORD_PTR GetControlData() = 0;
	///////////////////////////////////////////////////////////////////////////////////////////////////////////
	//
	//                                                     图像数据接口
	//
	///////////////////////////////////////////////////////////////////////////////////////////////////////////
	///////////////////////////////////////////////////////////////////////
	virtual BOOL SetImageBuffer(BYTE* pImageBuffer, long lBufferLength, const stImageBaseInfo&) = 0;
	//这里可以返回图像的大小;
	virtual BOOL SetImageFile(std::string strFileName, stImageBaseInfo&) = 0;
	//更新图像的信息
	virtual void  UpdateImageInfo(long nImageIndex, std::string) = 0;
	////////////////////////////////////////////基本操作/////////////////////////
	//获取当前控件中有多少张图像;
	virtual int GetImageCount() = 0;
	//获取当前控件中的图像序号::按照添加顺序返回;
	virtual BOOL GetImageListByShowOrder(std::vector<long>&) = 0;
	//跳转到某图像；
	virtual BOOL  SeekToImage(long lImageIdx) = 0;
	//删除指定的图像 
	virtual BOOL  DeleteImage(long lImageIdx) = 0;
	//删除所有图像;
	virtual void  DeleteAllImage() = 0;

	//

	//向控件添加一个标记框，
	virtual void   AddMarkInfo(stMarkInfo) = 0;
	//删除指定标记框
	virtual void   DeleteMarkInfo(long nImageIndex,long lMarkIdx) = 0;
	//删除指定图像的标记框；
	virtual void   DeleteMarkInfoByImageIdx(long lImageIdx) = 0;
	//删除所有的标记区域
	virtual void   DeleteAllMarkInfo() = 0;
	//当前缩放率下，居中显示标记信息;
	virtual void   SelectMarkInfo(long lImageIdx, long lMarkIdx) = 0;


	///////////////////////////////////////////////////////////////////////////////////////////////////////////
	//
	//                                                     控件操作相关
	//
	///////////////////////////////////////////////////////////////////////////////////////////////////////////
	//获取当前系统的显示器数量;
	virtual int  GetMonitorCount() = 0;
    //设置是否全屏;
	virtual void SetFullScreen(BOOL bFull) = 0;
	//判断当前是否全屏模式
	virtual BOOL IsFullScreen() = 0;
	//设置全屏的行为模式，所有显示器全屏，主显示器全屏，程序当前显示器全屏。（如果存在多显示器的情况）
	virtual void SetFullScreenMode(emFullScreenMonitorStatus) = 0;
	//获取全屏行为;
	virtual void GetFullScreenMode(emFullScreenMonitorStatus& _status) = 0;
	
	//是否启用全屏退出按钮
	virtual void EnableFullCloseImage(BOOL bEnable) = 0;
	virtual BOOL IsEnableFullCloseImages() = 0;
	//设置全屏时退出全屏按钮图片，（设置后，可以显示一个退出按钮，点击退出全屏，否则使用ESC退出）
	virtual void SetFullCloseImage(std::string strFileName) = 0;
	virtual void GetFullCloseImage(std::string& strFileName) = 0;
	//显示图像为显示区域自动适配;
	virtual void ShowImageAdjustByVisibleRectMode() = 0;
	//显示图像原始大小;  
	virtual void ShowImageWidthRealSize() = 0;
	//设置 AND 获取缩放比例
	virtual void SetImageZoomValue(float flZoom) = 0;
	virtual BOOL GetImageZoomValue(float& flZoomValue) = 0;
    //设置控件的最大，最小缩放比例;
	virtual void SetZoomRange(float flMin = 0.2, float flMax = 5.0) = 0;
	virtual void GetZoomRange(float& flMin, float& flMax) = 0;

	//图像双击操作;
	virtual void EnableDoubleClickZoom(BOOL bEnable) = 0;
	virtual BOOL IsEnableDoubleClickZoom() = 0;
	//设置图像双击时的倍数
	virtual void SetDoubleClickZoomValue(float flZoom) = 0;
	virtual void GetDoubleClickZoomValue(float& flZoom) = 0;
	
	///////////////////////////////////////////////////////////////////////////////////////////////////////////
	//
	//                                                     控件信息显示相关
	//
	///////////////////////////////////////////////////////////////////////////////////////////////////////////
	//是否显示控件信息；
	virtual void SetControlInfoStatus(BOOL bEnable) = 0;
	virtual BOOL GetControlInfoStatus() = 0;
	//是否显示
	//设置控件显示信息；
	virtual void SetControlInfo(std::string pszControlInfo) = 0;
	virtual void GetControlInfo(std::string& pszControlInfo) = 0;

	//设置控件信息的显示位置; //bTop = TRUE 显示在顶部 =false,显示在底部
	virtual void SetControlInfoShowAtTop(BOOL bTop = TRUE) = 0;
	virtual BOOL ContrlInfoPosIsTop() = 0;
	//设置控件信息的显示高度;
	virtual void SetControlInfoHeight(int nHeight = 20) = 0;
	virtual int GetControlInfoHeight() = 0;
	//设置控件信息的显示背景色
	virtual void SetControlInfoBackColor(COLORREF crBack) = 0;
	virtual void GetControlInfoBackColor(COLORREF& crColor) = 0;
	//设置控件信息的显示文本色
	virtual void SetControlInfoTextColor(COLORREF crBack) = 0;
	virtual void GetControlInfoTextColor(COLORREF& crColor) = 0;
	//设置控件信息的显示字体
	virtual void SetControlInfoFont(std::string pszFontName) = 0;
	virtual void GetControlInfoFont(std::string& pszFontName) = 0;

	//基础信息文字显示大小;
	virtual void SetControlInfoFontSize(int) = 0;
	virtual void GetControlInfoFontSize(int&) = 0;
	///////////////////////////////////////////////////////////////////////////////////////////////////////////
	//
	//                                                     图像基础信息显示  
	//  
	///////////////////////////////////////////////////////////////////////////////////////////////////////////
	//是否显示图像基础信息；
	//PIC_INFO_TEXT_??
	virtual void SetImageBaseInfoStatus(DWORD dwPicInfoText_) = 0;
	virtual DWORD GetImageBaseInfoStatus() = 0;
	//基础信息文字显示颜色;
	virtual void SetImageBaseInfoColor(COLORREF crInfoColor) = 0;
	virtual void GetImageBaseInfoColor(COLORREF&) = 0;
	//基础信息文字字体
	virtual void SetImageBaseInfoFont(std::string pszFontName) = 0;
	virtual void GetImageBaseInfoFont(std::string& pszFontName) = 0;

	//基础信息文字显示大小;
	virtual void SetImageBaseInfoFontSize(int) = 0;
	virtual void GetImageBaseInfoFontSize(int&) = 0;
	//图像基础信息显示位置；
	virtual void SetImageBaseInfoPos(emADVInfoPos) = 0;
	virtual emADVInfoPos GetImageBaseInfoPos() = 0;
	///////////////////////////////////////////////////////////////////////////////////////////////////////////
	//
	//                                                     导航缩略图
	//
	///////////////////////////////////////////////////////////////////////////////////////////////////////////
	//是否启用缩略图显示;
	virtual void SetThumbnailStatus(BOOL bShow) = 0;
	//获取缩略图显示状态;
	virtual BOOL GetThumbnailStatus() = 0;
	//设置缩略图位置:注意和文字信息的位置不要冲突；
	virtual void SetThumbnailPositon(emADVInfoPos) = 0;
	virtual void GetThumbnailPositon(emADVInfoPos&) = 0;
	//缩略显示区域边框颜色
	virtual void SetThumbnailBorderColor(COLORREF) = 0;
	virtual void GetThumbnailBorderColor(COLORREF&) = 0;
	//缩略图显示区域框颜色;
	virtual void SetThumbnailRectColor(COLORREF) = 0;
	virtual void GetThumbnailRectColor(COLORREF&) = 0;

	//设置缩略图大小，像素宽度;
	//20---1000;
	virtual void SetThumbnailWidth(int nWidth) = 0;
	virtual int  GetThumbnailWidth() = 0;
	//是否允许缩略图定位
	virtual void SetThumbnailLocation(BOOL bEnable) = 0;
	virtual void GetThumbnailLocation(BOOL& bEnable) = 0;

	//是否使用图像来显示缩略图
	virtual void SetThumnailUseImage(BOOL bEnable) = 0;
	virtual void GetThumnailUseImage(BOOL& bEnable) = 0;
	/////////////////////////////////////////
	////////////////////////////////////////////////////////////////////
	//
	//                                                     图像调节  
	//
	///////////////////////////////////////////////////////////////////////////////////////////////////////////
	//亮度
	virtual void AdjustBrightness(int nValue) = 0;
	//对比度
	virtual void AdjustContrast(int nValue) = 0;
	//清晰度
	virtual void AdjustDefinition(int nValue) = 0;
	//
	virtual void GetBrightness(int& nValue) = 0;
	virtual void GetContrast(int& nValue) = 0;
	virtual void GetDefinition(int& nValue) = 0;


	//方向
	virtual void SetImageDirection(emImageDirection _dir) = 0;
	virtual void GetImageDirection(emImageDirection& _dir) = 0;
	//////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//
	//                                                  框选放大模式相关
	//
	//////////////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual void EnableMouseRectZoom(BOOL bEnable) = 0;
	virtual BOOL IsEnableMouseRectZoom() = 0;
	//鼠标框选放大，由于和图像的其他操作有冲突，所以必须要使用键盘CTRL OR SHIRFT来组合使用；
	virtual void SetMouseZoomRectCorpKeyValue(UINT vk_key) = 0;
	virtual void GetMouseZoomRectCorpKeyValue(UINT& vk_key) = 0;
	//其他设置
	virtual void SetMouseRectZoomLineWidth(int nWidth) = 0;
	virtual void GetMouseRectZoomLineWidth(int& nWidth) = 0;
	virtual void SetMouseRectZoomLineColor(COLORREF cr) = 0;
	virtual void GetMouseRectZoomLineColor(COLORREF& cr) = 0;
	///////////////////////////////////////////////////////////////////////////////////////////////////////////
	//
	//                                                     标记模式相关
	//
	///////////////////////////////////////////////////////////////////////////////////////////////////////////
	//外部设置，缺陷ID和缺陷名称的对应关系表。如果没有设置，将无法显示和设置缺陷。
	//启用OR关闭标记模式;  
	virtual void SetMarkMode(BOOL bEnable) = 0;
	virtual BOOL GetMarkMode() = 0;

	//设置是否显示缺陷，如果markmode == 1 bShow恒定为true；
	virtual void  SetMarkShowStatus(BOOL bShow) = 0;
	virtual BOOL  GetMarkShowStatus() = 0;
	//
	//设置缺陷不同状态的颜色
	virtual void SetMarkStatusColor(emMarkStatus,COLORREF) = 0;
	virtual void GetMarkStatusColor(emMarkStatus,COLORREF&) = 0;

 
	///////////////////////////////////////////////////////////////////////////////////////////////////////////
	//
	//                                                    测量模式相关
	//
	///////////////////////////////////////////////////////////////////////////////////////////////////////////
	//是否启用测量模式
	virtual void SetMeasureModeStatus(BOOL bEnable) = 0;
	virtual BOOL GetMeasureModeStatus() = 0;
	//设置测量绘制线的颜色
	virtual void SetMeasureLineColor(COLORREF crLine) = 0;
	virtual void GetMeasureLineColor(COLORREF& crLine) = 0;
	//设置测量模式线的粗细  (1-N)
	virtual void SetMeasureLineWidth(int nWidth = 1) = 0;
	virtual void GetMeasureLineWidth(int& nWidth) = 0;

	//
	virtual void Release() = 0;

 
};
  
//创建控件指针。
_INTERFACE_OBJECT_FUN_ void CreateImageControlInstance(IAdvImageShowControl** pObject);