用picture control 显示图像,不用opencv
CRect p_rect;
CWnd *pWnd = NULL;
CImage image;
string filepath = "D:\\3.jpg"; //文件根目录
CString cstr(filepath.c_str());
image.Load(cstr);
if (image == NULL) {
return;
}
pWnd = GetDlgItem(IDC_PIC);//获取控件句柄
pWnd->GetClientRect(&p_rect); //获取Picture Control控件的客户区
CDC *pDc = NULL;
pDc = pWnd->GetDC();//获取picture control的DC
SetStretchBltMode(pDc->m_hDC, STRETCH_HALFTONE);
image.StretchBlt(pDc->m_hDC, p_rect, SRCCOPY);
ReleaseDC(pDc);
用picture control 显示图像,用opencv
// TODO: 在此添加控件通知处理程序代码
Mat img = imread("D:/3.jpg");
if (img.empty())
{
cout << "could not load the picture..." << endl;
return;
}
cv::Mat imgTmp;
CRect rect;
GetDlgItem(IDC_PIC)->GetClientRect(&rect); // 获取控件大小
cv::resize(img, imgTmp, cv::Size(rect.Width(), rect.Height()));// 缩小或放大Mat并备份
// 转一下格式 ,这段可以放外面,
switch (imgTmp.channels())
{
case 1:
cv::cvtColor(imgTmp, imgTmp, CV_GRAY2BGRA); // GRAY单通道
break;
case 3:
cv::cvtColor(imgTmp, imgTmp, CV_BGR2BGRA); // BGR三通道
break;
default:
break;
}
int pixelBytes = imgTmp.channels()*(imgTmp.depth() + 1); // 计算一个像素多少个字节
// 制作bitmapinfo(数据头)
BITMAPINFO bitInfo;
bitInfo.bmiHeader.biBitCount = 8 * pixelBytes;
bitInfo.bmiHeader.biWidth = imgTmp.cols;
bitInfo.bmiHeader.biHeight = -imgTmp.rows;
bitInfo.bmiHeader.biPlanes = 1;
bitInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bitInfo.bmiHeader.biCompression = BI_RGB;
bitInfo.bmiHeader.biClrImportant = 0;
bitInfo.bmiHeader.biClrUsed = 0;
bitInfo.bmiHeader.biSizeImage = 0;
bitInfo.bmiHeader.biXPelsPerMeter = 0;
bitInfo.bmiHeader.biYPelsPerMeter = 0;
// Mat.data + bitmap数据头 -> MFC
CDC *pDC = GetDlgItem(IDC_PIC)->GetDC();
::StretchDIBits(
pDC->GetSafeHdc(),
0, 0, rect.Width(), rect.Height(),
0, 0, rect.Width(), rect.Height(),
imgTmp.data,
&bitInfo,
DIB_RGB_COLORS,
SRCCOPY
);
ReleaseDC(pDC);
用picture control控件显示图像
CRect p_rect;
CWnd *pWnd = NULL;
CImage image;
image.Load(imagePath);
if (image == NULL) {
return;
}
pWnd = GetDlgItem(IDC_STABIMAGE);//获取控件句柄
pWnd->GetClientRect(&p_rect); //获取Picture Control控件的客户区
CDC *pDc = NULL;
pDc = pWnd->GetDC();//获取picture control的DC
SetStretchBltMode(pDc->m_hDC, STRETCH_HALFTONE);
image.StretchBlt(pDc->m_hDC, p_rect, SRCCOPY);
ReleaseDC(pDc);
图像缩放
void HistoryRecord::Draw(CDC *pDC)
{
if (image_path == "") {
return;
}
Image img((wchar_t*)(image_path.AllocSysString()));
//Image img(image_path);
image_h = img.GetHeight();
image_w = img.GetWidth();
Pen pen(Color(255, 255, 0, 0));
CRect r_rect, p_rect;
r_rect.SetRect(min(pt1.x, pt2.x), min(pt1.y, pt2.y), max(pt1.x, pt2.x), max(pt1.y, pt2.y));
Graphics graph(pDC->GetSafeHdc());
graph.SetInterpolationMode(InterpolationModeHighQualityBilinear); //设置缩放质量
graph.ScaleTransform(m_zoom, m_zoom); //缩放
graph.TranslateTransform(m_imgX, m_imgY);
//m_imgX,m_imgY是原图应该偏移的量
graph.DrawImage(&img, 0, 0);
graph.Flush();
}
void HistoryRecord::MyInvalidate()
{
//HDC hdc = ::GetDC(m_hWnd);
HDC hdc = ::GetDC(GetDlgItem(IDC_PICRESULT)->GetSafeHwnd());
CDC dc;
dc.Attach(hdc);
CDC memDC;
CBitmap MemBitmap;
// 设备描述表初始化
memDC.CreateCompatibleDC(NULL);
// 建立与屏幕显示兼容的内存显示设备
MemBitmap.CreateCompatibleBitmap(&dc, m_Rect.Width(), m_Rect.Height());
// 选取空白位图
memDC.SelectObject(MemBitmap);
memDC.FillSolidRect(0, 0, m_Rect.Width(), m_Rect.Height(), RGB(255, 255, 255));
//画图
Draw(&memDC);
Graphics graph(memDC.GetSafeHdc());
CRect r_rect;
Pen pen(RGB(255, 0, 0), 1.0);
pen.SetDashStyle(DashStyleDot);
//拷贝到控件DC
dc.BitBlt(0, 0, m_Rect.Width(), m_Rect.Height(), &memDC, 0, 0, SRCCOPY);
MemBitmap.DeleteObject();
memDC.DeleteDC();
dc.Detach();
::ReleaseDC(m_hWnd, hdc);
}
BOOL HistoryRecord::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
REAL oldzoom = m_zoom; //保存当前的缩放系数,用于计算当前滚动时的坐标
CPoint ppt = pt;
CRect rect;
if (zDelta == 120) {
m_zoom += 0.4f;
}
if (zDelta == -120) {
m_zoom = m_zoom - 0.4f;
if (m_zoom<0) {
m_zoom += 0.4f;
}
}
GetWindowRect(rect); //注意这里的区域是窗口相对于整个屏幕的,因为cpoint pt这个点是相对于屏幕的
//ppt.x -= rect.left; //计算该点在对话框中的位置
//ppt.y -= rect.top;
ScreenToClient(&ppt);
int x = ppt.x - m_Rect.left;
int y = ppt.y - m_Rect.top;
REAL oldimagex = (x / oldzoom); //缩放前鼠标在原图中的位置
REAL oldimagey = (y / oldzoom);
REAL newimagex = (x / m_zoom); //缩放后鼠标在原图中的位置
REAL newimagey = (y / m_zoom);
m_imgX = newimagex - oldimagex + m_imgX; //计算原图应该的偏移
m_imgY = newimagey - oldimagey + m_imgY;
MyInvalidate(); //绘图
return CDialogEx::OnMouseWheel(nFlags, zDelta, pt);
}
void HistoryRecord::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (nFlags & MK_RBUTTON)
{
REAL deltaX = point.x - m_mouseDown.X; //x轴方向偏移
REAL deltaY = point.y - m_mouseDown.Y; //y轴方向偏移
m_imgX = (m_PtStart.X + (deltaX / m_zoom)); //在原始图像中X坐标偏移,这里计算的是在原始图片中的位移,原因在上面已经说明,全局的仿射变换会影响实际的位移
m_imgY = (m_PtStart.Y + (deltaY / m_zoom)); //在原始图像中Y坐标偏移
MyInvalidate(); //重绘
}
CDialogEx::OnMouseMove(nFlags, point);
}
//第二种
My_pic::My_pic()
{
m_zoom = 1.0f;
m_imgX = 0.0f;
m_imgY = 0.0f;
m_PtStart.X = 0.0f;
m_PtStart.Y = 0.0f;
m_mousepressed = false;
}
My_pic::~My_pic()
{
}
void My_pic::initial(CWnd * now_this, CListCtrl*list, CScrollBar*bar)
{
//初始化
//m_zoom = 1.0f;
//m_imgX = 0.0f;
//m_imgY = 0.0f;
//m_PtStart.X = 0.0f;
//m_PtStart.Y = 0.0f;
p_this = now_this;
p_this->GetClientRect(&m_Rect);
p_this->GetWindowRect(&pctrl_rect);
m_list = list;
m_bar = bar;
//获取工程目录
GetModuleFileName(NULL, object_path.GetBufferSetLength(MAX_PATH + 1), MAX_PATH);
object_path.ReleaseBuffer();
int pos = object_path.ReverseFind('\\');
object_path = object_path.Left(pos);
object_path = object_path + _T("\\");
}
BEGIN_MESSAGE_MAP(My_pic, CStatic)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_RBUTTONDOWN()
ON_WM_RBUTTONUP()
ON_WM_MOUSEWHEEL()
END_MESSAGE_MAP()
void My_pic::MyInvalidate()
{
//HDC hdc = ::GetDC(m_hWnd);
HDC hdc = p_this->GetDC()->m_hDC;
CDC dc;
dc.Attach(hdc);
CDC memDC;
CBitmap MemBitmap;
// 设备描述表初始化
memDC.CreateCompatibleDC(NULL);
// 建立与屏幕显示兼容的内存显示设备
MemBitmap.CreateCompatibleBitmap(&dc, m_Rect.Width(), m_Rect.Height());
// 选取空白位图
memDC.SelectObject(MemBitmap);
memDC.FillSolidRect(0, 0, m_Rect.Width(), m_Rect.Height(), RGB(255, 255, 255));
//画图
Draw(&memDC);
Graphics graph(memDC.GetSafeHdc());
CRect r_rect;
Pen pen(RGB(255, 0, 0), 1.0);
pen.SetDashStyle(DashStyleDot);
//拷贝到控件DC
dc.BitBlt(0, 0, m_Rect.Width(), m_Rect.Height(), &memDC, 0, 0, SRCCOPY);
MemBitmap.DeleteObject();
memDC.DeleteDC();
dc.Detach();
::ReleaseDC(m_hWnd, hdc);
}
void My_pic::openfile()
{
//CFileDialog Dlg(TRUE, "BMP", "*.bmp",
// OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
// "bmp文件(*.bmp)");//| OFN_ALLOWMULTISELECT,
//if (Dlg.DoModal() == IDOK)
//{
// image_path = Dlg.GetPathName();
// Draw(p_this->GetDC());
// CString name;
// dbpath = object_path + "\\" + Dlg.GetFileName() + ".db";
// CString str[6] = {
// "左上角行号 INT",
// "左上角列号 INT",
// "右下角行号 INT",
// "右下角列号 INT",
// "时间 TEXT",
// "空余 TEXT"
// };
/*Mysqlite sqlite;
sqlite.SQOpendatabase(dbpath, 6, str);*/
//}
}
void My_pic::Draw(CDC *pDC)
{
if (image_path==""){
return;
}
Image img((wchar_t*)(image_path.AllocSysString()));
//Image img(image_path);
image_h = img.GetHeight();
image_w = img.GetWidth();
Pen pen(Color(255, 255, 0, 0));
CRect r_rect,p_rect;
r_rect.SetRect(min(pt1.x, pt2.x), min(pt1.y, pt2.y), max(pt1.x, pt2.x), max(pt1.y, pt2.y));
Graphics graph(pDC->GetSafeHdc());
graph.SetInterpolationMode(InterpolationModeHighQualityBilinear); //设置缩放质量
graph.ScaleTransform(m_zoom, m_zoom); //缩放
graph.TranslateTransform(m_imgX, m_imgY);
//m_imgX,m_imgY是原图应该偏移的量
graph.DrawImage(&img, 0, 0);
graph.Flush();
}
Rect * My_pic::readfromdb(int *row)
{
int row_1 = 0, col;
/*CString title[] = { "左上角行号 INT",
"左上角列号 INT",
"右下角行号 INT",
"右下角列号 INT" };
Mysqlite DB;
DB.SQGetRoworColCount(dbpath,row,&col);
row_1 = *row;
CString *getrect = new CString [row_1];*/
Rect *rect = new Rect[row_1];
/*for (size_t j = 0; j < 4; j++)
{
DB.SQSelect_M(dbpath,title[j],getrect);
switch (j)
{
case 0:
for (size_t i = 0; i < row_1; i++) {
rect[i].X = _ttoi(getrect[i]);
}break;
case 1:
for (size_t i = 0; i < row_1; i++) {
rect[i].Y = _ttoi(getrect[i]);
}break;
case 2:
for (size_t i = 0; i < row_1; i++) {
rect[i].Width =abs( _ttoi(getrect[i])- rect[i].X);
}break;
case 3:
for (size_t i = 0; i < row_1; i++) {
rect[i].Height = abs( _ttoi(getrect[i])- rect[i].Y);
}break;
default:
break;
}
}*/
return rect;
}
Rect * My_pic::readfromlist()
{
Rect *rect=new Rect[m_list->GetItemCount()];
if (m_list==NULL) {
return rect;
}
//float x, y, zoom;
CRect n_rect;
for (size_t i = 0; i < m_list->GetItemCount(); i++) {
n_rect.SetRect(
_ttoi(m_list->GetItemText(i, 1)),
_ttoi(m_list->GetItemText(i, 2)),
_ttoi(m_list->GetItemText(i, 3)),
_ttoi(m_list->GetItemText(i, 4)));
rect[i].X = n_rect.left;
rect[i].Y = n_rect.top ;
rect[i].Width = n_rect.Width();
rect[i].Height = n_rect.Height() ;
}
return rect;
}
void My_pic::OnMouseMove(UINT nFlags, CPoint point)
{
//GetCursorPos(&point);
//if (!pctrl_rect.PtInRect(point) || image_path == "") {
// CStatic::OnMouseMove(nFlags, point);
// return;
//}
if (nFlags & MK_RBUTTON)
{
REAL deltaX = point.x - m_mouseDown.X; //x轴方向偏移
REAL deltaY = point.y - m_mouseDown.Y; //y轴方向偏移
//在原始图像中X坐标偏移,这里计算的是在原始图片中的位移,原因在上面已经说明,全局的仿射变换会影响实际的位移
m_imgX = (m_PtStart.X + (deltaX / m_zoom));
m_imgY = (m_PtStart.Y + (deltaY / m_zoom)); //在原始图像中Y坐标偏移
MyInvalidate(); //重绘
}
if (nFlags & MK_LBUTTON&&pt1!=(CPoint)(-1,-1))
{
GetCursorPos(&pt2);
//重绘
if (pt1 !=pt2) {
MyInvalidate();
}
}
CStatic::OnMouseMove(nFlags, point);
}
BOOL My_pic::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
//GetCursorPos(&pt);
//if (!pctrl_rect.PtInRect(pt)|| image_path=="") {
// return CStatic::OnMouseWheel(nFlags, zDelta, pt);
//}
REAL oldzoom = m_zoom; //保存当前的缩放系数,用于计算当前滚动时的坐标
float change_size = 0.19f;
CPoint ppt = pt;
// CRect rect;
if (zDelta == 120) {
m_zoom += change_size;
}
if (zDelta == -120) {
m_zoom = m_zoom - change_size;
if (m_zoom<0){
m_zoom += change_size;
}
}
//GetWindowRect(rect); //注意这里的区域是窗口相对于整个屏幕的,因为cpoint pt这个点是相对于屏幕的
p_this->ScreenToClient(&ppt);
int x = ppt.x - m_Rect.left;
int y = ppt.y - m_Rect.top;
REAL oldimagex = (x / oldzoom); //缩放前鼠标在原图中的位置
REAL oldimagey = (y / oldzoom);
REAL newimagex = (x / m_zoom); //缩放后鼠标在原图中的位置
REAL newimagey = (y / m_zoom);
m_imgX = newimagex - oldimagex + m_imgX; //计算原图应该的偏移
m_imgY = newimagey - oldimagey + m_imgY;
//双缓冲绘图
MyInvalidate();
if (m_bar == NULL) {
return CStatic::OnMouseWheel(nFlags, zDelta, pt);
}
int tem = (m_zoom - 0.05) / 0.19;
if (m_bar!=NULL) {
m_bar->SetScrollPos(tem + 1, TRUE);
}
return CStatic::OnMouseWheel(nFlags, zDelta, pt);
}
void My_pic::OnLButtonUp(UINT nFlags, CPoint point)
{
//GetCursorPos(&point);
//if (!pctrl_rect.PtInRect(point) || image_path == "" ) {
// CStatic::OnLButtonUp(nFlags, point);
// return;
//}
GetCursorPos(&pt2);
if (pt1==pt2) {
return;
}
CRect r_rect;
r_rect.SetRect(min(pt1.x, pt2.x), min(pt1.y, pt2.y), max(pt1.x, pt2.x), max(pt1.y, pt2.y));
p_this->ScreenToClient(&r_rect);
outtolist(r_rect);
pt1 = (-1, -1);
CStatic::OnLButtonUp(nFlags, point);
}
void My_pic::OnLButtonDown(UINT nFlags, CPoint point)
{
//GetCursorPos(&point);
//if (!pctrl_rect.PtInRect(point) || image_path == "") {
// CStatic::OnLButtonDown(nFlags, point);
// return;
//}
p_this->SetFocus();
GetCursorPos(&pt1);
CStatic::OnLButtonDown(nFlags, point);
}
void My_pic::OnRButtonDown(UINT nFlags, CPoint point)
{
//GetCursorPos(&point);
//if (!pctrl_rect.PtInRect(point) || image_path == "") {
// CStatic::OnRButtonDown(nFlags, point);
// return;
//}
if (nFlags & MK_RBUTTON)
{
m_mousepressed = true;
m_mouseDown.X = point.x;
m_mouseDown.Y = point.y;
m_PtStart.X = m_imgX;
m_PtStart.Y = m_imgY;
}
CStatic::OnRButtonDown(nFlags, point);
}
void My_pic::OnRButtonUp(UINT nFlags, CPoint point)
{
//if (!pctrl_rect.PtInRect(point) || image_path == "") {
// CDialogEx::OnRButtonUp(nFlags, point);
// return;
//}
m_mousepressed = false;
CStatic::OnRButtonUp(nFlags, point);
}
void My_pic::outtolist(CRect r)
{
short list_number;
CString x, str_region, str;
SYSTEMTIME systime;
if (m_list==NULL) {
return;
}
//获得本时区的时间
GetLocalTime(&systime);
list_number = m_list->GetItemCount() + 1;
CTime time(systime);
str_region.Format(_T("%d"), list_number);
str = _T("区域") + str_region;
//序号
m_list->InsertItem(list_number - 1, str);
//左上X
x.Format(_T("%d"), (int)(r.left / m_zoom - m_imgX));
m_list->SetItemText(list_number - 1, 1, x);
//左上Y
x.Format(_T("%d"), (int)(r.top / m_zoom - m_imgY));
m_list->SetItemText(list_number - 1, 2, x);
//右下X
x.Format(_T("%d"), (int)(r.left / m_zoom - m_imgX + r.Width() / m_zoom));
m_list->SetItemText(list_number - 1, 3, x);
//右下Y
x.Format(_T("%d"), (int)(r.top / m_zoom - m_imgY + r.Height() / m_zoom));
m_list->SetItemText(list_number - 1, 4, x);
x = time.Format("%Y-%m-%d %H-%M-%S");
m_list->SetItemText(list_number - 1, 5, x);
outtosqlite(r, time);
}
void My_pic::outtosqlite(CRect point_rect, CTime addtime)
{
if (dbpath == "") {
return;
}
//Mysqlite sqlite;
CString data[10];
data[0].Format(_T("%d"), (int)(point_rect.left / m_zoom - m_imgX));
data[1].Format(_T("%d"), (int)(point_rect.top / m_zoom - m_imgY));
data[2].Format(_T("%d"), (int)(point_rect.left / m_zoom - m_imgX + point_rect.Width() / m_zoom));
data[3].Format(_T("%d"), (int)(point_rect.top / m_zoom - m_imgY + point_rect.Height() / m_zoom));
data[4] = _T("'") + addtime.Format("%Y-%m-%d %H-%M-%S") + _T("'");
data[5] = "''";
//sqlite.SQAdddata(dbpath, 6, data);
}
数据库
vs如何连接数据库
https://www.cnblogs.com/Donnnnnn/p/5985639.html
数据库操作
https://www.cnblogs.com/leemano/p/6578050.html
MFC显示图像
//第一种
CRect p_rect;
//CWnd *pWnd = NULL;
CImage image;
image.Load(imagepath);
if (image == NULL) {
return;
}
//pWnd = pDC;//获取控件句柄
pWnd->GetClientRect(&p_rect); //获取Picture Control控件的客户区
CDC *pDc = NULL;
pDc = pWnd->GetDC();//获取picture control的DC
SetStretchBltMode(pDc->m_hDC, STRETCH_HALFTONE);
image.StretchBlt(pDc->m_hDC, p_rect, SRCCOPY);
ReleaseDC(pDc);
//第二种 显示halcon图像
GetDlgItem(IDC_LEFT)->EnableWindow(TRUE);
GetDlgItem(IDC_RIGHT)->EnableWindow(TRUE);
/*imagepath = Dlg.GetPathName();*/
imagepath = "D://0410//1.bmp";
m_nImageNum = 1;
USES_CONVERSION;
char*temp = T2A(imagepath.GetBuffer(0));
HTuple imageName = (HTuple)temp;
ReadImage(&ImageModule, imageName);
//openfileimage(imagelist);
CRect p_rect;
CWnd *pWnd = NULL;
CImage image;
image.Load(imagepath);
if (image == NULL) {
return;
}
pWnd = GetDlgItem(IDC_IMAGESHOW);//获取控件句柄
pWnd->GetClientRect(&p_rect); //获取Picture Control控件的客户区
CDC *pDc = NULL;
pDc = pWnd->GetDC();//获取picture control的DC
SetStretchBltMode(pDc->m_hDC, STRETCH_HALFTONE);
image.StretchBlt(pDc->m_hDC, p_rect, SRCCOPY);
ReleaseDC(pDc);
//读取文件后显示图像
}
CString CImageNum;
CImageNum.Format(_T("%d"), m_nImageNum);
CString cPath = _T("D://0410//");
CString cIndex = _T(".bmp");
imagepath = cPath + CImageNum + cIndex;
USES_CONVERSION;
char*temp = T2A(imagepath.GetBuffer(0));
HTuple imageName = (HTuple)temp;
ReadImage(&ImageModule, imageName);
//openfileimage(imagelist);
CRect p_rect;
CWnd *pWnd = NULL;
CImage image;
image.Load(imagepath);
if (image == NULL) {
return;
}
pWnd = GetDlgItem(IDC_IMAGESHOW);//获取控件句柄
pWnd->GetClientRect(&p_rect); //获取Picture Control控件的客户区
CDC *pDc = NULL;
pDc = pWnd->GetDC();//获取picture control的DC
SetStretchBltMode(pDc->m_hDC, STRETCH_HALFTONE);
image.StretchBlt(pDc->m_hDC, p_rect, SRCCOPY);
ReleaseDC(pDc);
USES_CONVERSION:是用来转换类型的, 在Socket编程时候,我们的IP地址从界面上输进去一般都使用CString类型的,可是在SOCKADDR_IN中的inet_addr却是const char *我们就不能直接用CString来用。我们就可以使用T2A()宏了。例如:
SOCKADDR_IN localaddr;
CString m_IP = L"192.168.1.2";
USES_CONVERSION;
localaddr.sin_family = AF_INET;
localaddr.sin_addr.S_un.S_addr = inet_addr(T2A(m_IP));
当然使用USES_CONVERSION也是要注意一个很重要的问题。
USES_CONVERSION它是在堆栈上分配空间的,也就是说你在你在函数未结束就不会被释放掉。所有要注意不要在一个函数中用while循环执行它,不然栈空间就马上会分配完(栈空间一般只有2M,很小)。
创建画笔工具
void RectangleDraw::OnDraw(CRect rect, COLORREF color, int pen_point)
{
CWnd *pwnd = GetDlgItem(IDC_IMAGESHOW);
//创建一个画笔工具
CPen pen(PS_SOLID, pen_point, color);
CClientDC dc(pwnd);
//选择画笔
dc.SelectObject(&pen);
//透明填充
dc.SelectStockObject(NULL_BRUSH);
dc.Rectangle(rect);
//outtolist(rect);
}
文件操作
CString CImageNum;
CImageNum.Format(_T("%d"), m_nImageNum);
CString cPath = _T("D://0410//");
CString cIndex = _T(".bmp");
imagepath = cPath + CImageNum + cIndex;
USES_CONVERSION;
char*temp = T2A(imagepath.GetBuffer(0));
HTuple imageName = (HTuple)temp;