#pragma once

// 包含情报结构体文件
#include "QBStru.h" 

// 回调函数定义
#include "CallBackDef.h"

// 声明 图像显示对话框类
class CImgShowDlg;
class AFX_CLASS_EXPORT CExportImgShowBase: public CObject
{
public:

	// 构造函数
	CExportImgShowBase(void);

	// 析构函数
	~CExportImgShowBase(void);

public:

	/************************************************************************/
	/* part 1:窗口创建、销毁、图像显示、标注等                             */
	/************************************************************************/

	// 1 功能:创建视频显示窗口
	//   输入:
	//       1. hParentWnd: 父窗口句柄
	//
	//   输出:创建成功返回TRUE,否则返回FALSE
	BOOL CreateWnd(const HWND hParentWnd);


	// 2 功能:移动(设置)窗口(整个视频显示窗口)至指定位置
	//   输入:
	//       1. clientRect:移动至该区域
	//
	//   输出:无
	void MoveWnd(const CRect &clientRect);


	// 3 功能:显示SW_SHOW 或隐藏 SW_HIDE 窗口
	//   输入:
	//       1. nCmdShow:SW_SHOW 或 SW_HIDE
	//
	//   输出:无
	void ShowWnd(const int nCmdShow);


	// 4 功能:显示一帧图像 
	//   输入:
	//       1. pImgInfo:图像信息头
	//       2. pImgData:图像数据指针
	//       3. LBbox:经纬度盒子
	//       4  isNeedFlip: 是否需要反转
	//       5. isNeedClip:是否需要裁剪标识
	//       6. ShowRegion:裁剪区域
	//       7. Strecth_Ratio 图像拉伸比例,默认为1,即填满屏幕
	//       8. 图像平移控制
	//
	//   输出:显示成功返回TRUE,否则返回FALSE 
	//   说明:信号1
	BOOL  ShowImage(const BITMAPINFO* pImgInfo,
					BYTE* pImgData,
					GeoBoundingBox LBbox = GeoBoundingBox(),
					BOOL isNeedFlip   = FALSE,
					BOOL isNeedClip   = FALSE,
					const CRect* pShowRegion = NULL,
					float Strecth_Ratio  = 1.0F,
					POINT xyShift = POINT());

	// 5 功能:显示并处理通用情报数据
	//   输入:
	//       1.qbData: 情报数据结构体变量指针
	//
	//   输出: 无
	//   说明:信号2
	//   注意:信号1优先级 > 信号2优先级
	void DisposeQBData(const QBStru* qbData); 


	// 6 功能:标绘目标,其中输入为目标点像素坐标
	//   输入:
	//       1. pt:目标点像素坐标
	//
	//   输出:在窗口标绘目标 
	//   注意事项:如果输入图像同时,对目标进行标绘,需要在 函数4(ShowImage)输入之后 输入本函数
	void SetTargetPixelCoordinate(const CPoint &pt);

	// 6.1 功能:标绘图像中的一块区域,其中输入为4个像素坐标点
	//   输入:
	//       1. pt:4个角点像素坐标
	//
	//   输出:在窗口标绘目标 
	//   注意事项:如果输入图像同时,对目标进行标绘,需要在 函数4(ShowImage)输入之后 输入本函数
	void SetQuadrangleCorners(const POINT *pts);

	// 6.2 功能:标绘目标,其中输入为经纬度坐标 
	//   输入:
	//       1. pt:经纬度坐标
	//
	//   输出:在窗口标绘目标 
	//   注意事项:如果输入图像同时,对目标进行标绘,需要在 函数4(ShowImage)输入之后 输入本函数
	void SetTgtLocLeadLonLat(double lon, double lat);



	// 7 功能:删除视频显示窗口,同时释放所有占用资源
	//   输入:无
	//
	//   输出:无
	void DestroyWnd();


	// 8 功能:清理内存及记忆
	//   输入:无
	//
	//   输出:无
	void ClearMemory();



	/************************************************************************/
	/* part 2:设置回调函数:像素点坐标、像素点信息、文件保存路径           */
	/************************************************************************/

	// 1 功能:设置回调函数,对外输出目标点像素坐标(目标点通过左键双击图像获得)
	//	 输入:
	//       1. proc: 回调函数指针
	//
	//   输出:设置成功返回TRUE,否则返回FALSE
	BOOL SetCallBackFun(SendCoordinateProc proc);


	// 2 功能:设置回调函数,像素信息传递到外部CSU中
	//   输入:
	//       1.proc: 函数指针
	//
	//   输出: 设置成功返回TRUE,否则返回FALSE
	BOOL SetCallBackFun(SendPixInfoProc proc);


	// 3 功能:设置回调函数,传递保存文件路径到外部CSU中
	//   输入:
	//       1.proc: 函数指针
	//
	//   输出: 设置成功返回TRUE,否则返回FALSE
	BOOL SetCallBackFun(SendFilePath proc);


	// 5 功能:设置回调函数,目标定位导引经纬度到外部CSU中
	//   输入:
	//       1.proc: 函数指针
	//
	//   输出: 设置成功返回TRUE,否则返回FALSE
	BOOL SetCallBackFun(SendTgrLocLeadLonLatProc proc);


	// 6 功能:设置回调函数,火炮校射信息输出到外部CSU中
	//   输入:
	//       1.proc: 函数指针
	//
	//   输出: 设置成功返回TRUE,否则返回FALSE
	BOOL SetCallBackFun(SendArtilleryReviseInfoProc proc);

	/************************************************************************/
	/* part 3:图像处理:显示控制、处理控制、保存控制                       */
	/************************************************************************/

	// 4 功能:通过鼠标滚轮,实现图像放大缩小
	BOOL OnMouseWheelZoomInOutImg(UINT nFlags, short zDelta, CPoint pt);

	// 5 功能:取消目标标绘
	void CancelTargetPlot();

	// 6 功能:图像去雾
	//   输入:
	//       1. bAdjust 是否调节
	//       2. A_MAX   控制去雾效果, A_MAX < 0 时,自适应计算(特别耗时); 
	//                  有效范围【0,255】 异常值自适应;
	//       3. degree  控制去雾效果, 有效范围【0,1】 异常值自适应
	//   输出:无
	void AdjustImgDehaze(BOOL bAdjust = FALSE, int A_MAX = -1, double degree = 0.78);

	// 7 功能:图像亮度调节
	//   输入:
	//       1. bAdjust 是否调节
	//       2. degree  调节力度[0 20]
	//   输出:无
	void AdjustImgIntensity(BOOL bAdjust = FALSE, int degree = 10);

	// 8 功能:图像对比度调节
	//   输入:
	//       1. bAdjust 是否调节
	//       2. degree  调节力度[0 20]
	//   输出:无
	void AdjustImgContrast(BOOL bAdjust = FALSE, int degree = 10);

	// 9 功能:图像清晰度调节
	//   输入:
	//       1. bAdjust 是否调节
	//       2. degree  调节力度[0 20]
	//   输出:无
	void AdjustImgDefinition(BOOL bAdjust = FALSE, int degree = 10);

	// 10 功能:返回图像调节上一步图像状态,显示上一次处理图像
	void ReturnToPreImgState();

	// 11 功能:返回原始图像状态,显示原始图像
	void ReturnToSrcImgState();

	// 12 功能:保存当前图像几何校正,并保存为TIFF格式
	void SaveImgToTiff();

	// 13 功能:保存当前帧至本地文件
	//   输入:
	//        1. sSaveFolder 图像存储文件夹,为空或找不到时,按默认存储路径存储
	//    说明:图像命名规则见设计文档
	void SaveCurrentFrame(CString sSaveFolder = "");

	// 14 功能:是否需要记忆前面多帧(18帧)图像信息
	//    输入:
	//        1. bMem TRUE:记忆 FALSE:不记忆
	//    输出:无
	void MemPreMultiFrame(BOOL bMem = TRUE);


	// 18 功能:设置图像编辑类型
	//    输入:
	//         1. type : 1:定位标记
	//                   2: 文字标记
	//                   3: 火炮校射标记
	//                   其他值,无效
	void SetImgEditType(int type);

	// 19 功能:获取图像编辑模式
	//    输入:无
	//    返回:
	//         true: 图像增强模式
	//         false:图像标记模式 
	bool GetImgEditMode();


	// 21 功能:几何校正图像并显示图像
  	void GeoCorrectAndShowImg();

	// 22 功能:获取当前显示图像
	//    输入:
	//    输出:
	//         1:imgWidth 图像宽
	//         2:imgHeight 图像高
	//         3:bitCount 图像位数
	//         4:pImgData 图像数据指针
	//    返回值:
	//         成功返回true,失败返回false
	bool GetCurrentImg(int &imgWidth, int &imgHeight, int& bitCount, uchar* &pImgData);


	// 23 功能:获取图像边界地理坐标
	//    输入:
	//    输出:
	//         1:leftLon   西经
	//         2:topLat    北纬
	//         3:rigtLon   东经
	//         4:bottomLat 南纬
	//    返回值:
	//         成功返回true,失败返回false
	bool GetImgBoundingBox(double &leftLon, double &topLat, double &rigtLon, double &bottomLat);

	
	// 24 功能:获取当前显示图像中心经纬度
	//    输入:
	//    输出:
	//         1:lon 经度
	//         2:lat 纬度
	//    返回值:
	//         成功返回true,失败返回false
	bool GetCurrentImgCerterLonLat(double &lon, double &lat);


	// 25 功能:标注图像(矩形、区域边缘)
	//    输入:
	//         1. 区域边缘点 集合
	void MarkRegionOnImg(std::vector<std::vector<cv::Point>> &valisContours);


	// 26 功能:屏蔽右键菜单
	//    输入:
	//         1. bClose 默认true关闭
	void CloseRightBtnDownMenu(bool bClose = true);


	// 27 功能:设置空屏文字
	//    输入:
	//         1. str 主题文字
	void SetThemeText(CString str);


	// 28 功能:图像位置导引(同内部目标定位导引)
	void LeadImgLoc();

private:
	CImgShowDlg* m_ShowDlg; // MFC 对话框
};