MFC应用心得

用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;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值