⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 canvas.cpp

📁 一个使用Windows SDK编写的简单画板程序。实现点、线、矩形、椭圆、文字。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	::ReleaseDC(hWnd,hDc);
	TEXT temp_text;
	temp_text.x = x;
	temp_text.y = y;
	
	temp_text.sText = pText;
	
	temp_text.IFont = IntFont;
	/*if(IntFont==0)
	{
		temp_text.chFont="NULL";
	}
	else
		temp_text.chFont = vec_font[IntFont-1];*/
	vec_text.push_back(temp_text);
	
	
	return true;
}

bool Canvas::Choose(HWND hWnd,int x,int y)
{
	int i;
	float a,b,c,d,e;
	//int j,k;
	for(i=0;i< vec_line.size();i++)
	{
		
		a = (vec_line[i].start_x - vec_line[i].end_x)*(vec_line[i].start_y - y) + (vec_line[i].start_y - vec_line[i].end_y)*(x - vec_line[i].start_x);
		b = (vec_line[i].start_x - vec_line[i].end_x)*(vec_line[i].start_x - vec_line[i].end_x) + (vec_line[i].start_y - vec_line[i].end_y)*(vec_line[i].start_y - vec_line[i].end_y);

		if(a*a / b <= 100)
		{
			Choose_Mode = 1;
			Choose_ID = i;
			goto FINISH;
		}
		
	}

	for(i=0;i< vec_rect.size();i++)
	{
		if(((y-vec_rect[i].start_y)*(y-vec_rect[i].start_y)<=100||(y-vec_rect[i].end_y)*(y-vec_rect[i].end_y)<=100)&&(x-vec_rect[i].start_x)*(x-vec_rect[i].end_x)<0)
		{
			Choose_Mode =2;
			Choose_ID = i;
			goto FINISH;
		}
		if(((x-vec_rect[i].start_x)*(x-vec_rect[i].start_x)<=100||(x-vec_rect[i].end_x)*(x-vec_rect[i].end_x)<=100)&&(y-vec_rect[i].start_y)*(y-vec_rect[i].end_y)<0)
		{
			Choose_Mode =2;
			Choose_ID = i;
			goto FINISH;
		}
	}
	
	for(i = 0; i<vec_ellipse.size();i++)
	{
		
		a = x - (vec_ellipse[i].end_x + vec_ellipse[i].start_x)/2;
		b = y - (vec_ellipse[i].end_y + vec_ellipse[i].start_y)/2;
		c = (vec_ellipse[i].end_x - vec_ellipse[i].start_x)/2;
		d = (vec_ellipse[i].end_y - vec_ellipse[i].start_y)/2;
	
		
		e = (a*a)/(c*c) + (b*b)/(d*d);
		if(e - 1 <=0.05 && e - 1>= -0.05)
		{
			Choose_Mode =5;
			Choose_ID = i;
			goto FINISH;
		}
	}
	for(i = 0; i<vec_text.size();i++)
	{
		TEXTMETRIC tm;
		HDC hDc;
		hDc = ::GetDC(hWnd);
		::GetTextMetrics(hDc, &tm);
		::ReleaseDC(hWnd, hDc);

		if(x >= vec_text[i].x && x <= vec_text[i].x + tm.tmAveCharWidth * vec_text[i].sText.length()+20 && y >= vec_text[i].y && y <= vec_text[i].y + tm.tmHeight  )
		{
			Choose_Mode =3;
			Choose_ID = i;
			goto FINISH;
		}
	}



FINISH:
	
	if(Choose_Mode == 0)
		return false;
	else 
		return true;
}

bool Canvas::Delete(HWND hWnd)
{
	HDC hDc;
	hDc = ::GetDC(hWnd);
	::SelectObject(hDc, ::GetStockObject(WHITE_PEN));
	switch(Choose_Mode)
	{
	case 0:
		return false;
	case 1:
		{
			::MoveToEx(hDc,vec_line[Choose_ID].start_x,vec_line[Choose_ID].start_y,NULL);
			::LineTo(hDc,vec_line[Choose_ID].end_x,vec_line[Choose_ID].end_y);
			
			vec_line.erase(&vec_line[Choose_ID]);
			Choose_Mode = 0;
			return true;
		}
	case 2:
		{
			::SelectObject(hDc, ::GetStockObject(NULL_BRUSH));
			::Rectangle(hDc,vec_rect[Choose_ID].start_x,vec_rect[Choose_ID].start_y,vec_rect[Choose_ID].end_x,vec_rect[Choose_ID].end_y);
			
			vec_rect.erase(&vec_rect[Choose_ID]);
			Choose_Mode = 0;
			return true;
		}
	case 5:
		{
			::SelectObject(hDc, ::GetStockObject(NULL_BRUSH));
			::Ellipse(hDc,vec_ellipse[Choose_ID].start_x,vec_ellipse[Choose_ID].start_y,vec_ellipse[Choose_ID].end_x,vec_ellipse[Choose_ID].end_y);
			vec_ellipse.erase(&vec_ellipse[Choose_ID]);
			Choose_Mode = 0;
			return true;
		}
	case 3:
		{
			HFONT hF;
			TEXTMETRIC tm;
			::SetTextColor(hDc, RGB(255,255,255));
			if(vec_text[Choose_ID].IFont ==0)
				::TextOut(hDc,vec_text[Choose_ID].x,vec_text[Choose_ID].y,vec_text[Choose_ID].sText.c_str(),strlen(vec_text[Choose_ID].sText.c_str()));
			else
			{
				hF = CreateFont(20,0,0,0,400,0,0,0,GB2312_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,vec_font[vec_text[Choose_ID].IFont-1].c_str());
				SelectObject(hDc,hF);
				GetTextMetrics(hDc,&tm);
				::TextOut(hDc,vec_text[Choose_ID].x,vec_text[Choose_ID].y,vec_text[Choose_ID].sText.c_str(),strlen(vec_text[Choose_ID].sText.c_str()));
				DeleteObject(hF);
			}
			vec_text.erase(&vec_text[Choose_ID]);
			Choose_Mode = 0;
			return true;
		}
	}
	return false;
}
bool Canvas::SaveAsToDisk(HWND hWnd)
{
	OPENFILENAME of;
	char cTemp[256] ={0};
	ZeroMemory(&of,sizeof(of));

	
	of.lStructSize = sizeof(OPENFILENAME);
	of.nMaxFile = 256;
	of.nMaxFileTitle = 256;
	of.lpstrFile = cTemp;
	of.lpstrFilter = "Paint files (*.mf)\0*.mf\0ALL files\0*.*\0\0";
	of.hwndOwner = hWnd;
	of.lpstrDefExt = "mf";
	of.Flags = OFN_OVERWRITEPROMPT;

	
	if(::GetSaveFileName(&of) == false)
	{
		//::MessageBox(hWnd,"save","save",MB_OK);
		return false;
	}

	fSave = true;
	
	strFileName = of.lpstrFile;

	ofstream open_file(of.lpstrFile);
	
	open_file << vec_line.size() <<endl;
	for(int i=0;i< vec_line.size();++i)
	{
		open_file << vec_line[i].start_x <<endl << vec_line[i].start_y <<endl;
		open_file << vec_line[i].end_x << endl <<vec_line[i].end_y << endl;
	}
	
	open_file << vec_rect.size()<<endl;
	for(i=0;i < vec_rect.size() ; ++i )
	{
		open_file << vec_rect[i].start_x << endl << vec_rect[i].start_y <<endl;
		open_file << vec_rect[i].end_x << endl << vec_rect[i].end_y << endl;
	}
	
	open_file << vec_ellipse.size()<<endl;
	for( i=0;i< vec_ellipse.size();++i)
	{
		open_file << vec_ellipse[i].start_x <<endl << vec_ellipse[i].start_y <<endl;
		open_file << vec_ellipse[i].end_x << endl <<vec_ellipse[i].end_y << endl;
	}

	open_file << vec_text.size() << endl;
	for(i=0 ; i< vec_text.size(); ++i )
	{
		open_file << vec_text[i].x <<endl << vec_text[i].y << endl;
		open_file << vec_text[i].sText << endl;
		open_file << vec_text[i].IFont << endl;

	}

	open_file.close();

	::MessageBox(hWnd,"File saved successfully!","Paint",MB_OK);
	return true;
}

bool Canvas::LoadFromDisk(HWND hWnd)
{
	int i,j;
	string tp;
	SHAPE_POINT  sp;
	OPENFILENAME of;
	char cTemp[256] = {0};
	ZeroMemory(&of, sizeof(of));
	of.Flags = OFN_OVERWRITEPROMPT;
	of.lStructSize = sizeof(OPENFILENAME);
	of.nMaxFile = 256;
	of.nMaxFileTitle = 256;
	of.lpstrFile = cTemp;
	of.lpstrFilter = "Paint files (*.mf)\0*.mf\0All files\0*.*\0\0";
	of.hwndOwner = hWnd;
	of.lpstrDefExt = "mf";

	if(::GetOpenFileName(&of) == false)
	{
		return false;
	}

	fSave = true;
	strFileName = of.lpstrFile;

	ifstream ReadFile(of.lpstrFile);
	ReadFile >> j;
	for(i = 0; i< j; ++i)
	{
		ReadFile >> sp.start_x >> sp.start_y >> sp.end_x >> sp.end_y ;
		vec_line.push_back(sp);
	}
	
	ReadFile >> j;
	for(i=0; i < j; ++i )
	{
		ReadFile >> sp.start_x >> sp.start_y >> sp.end_x >> sp.end_y;
		vec_rect.push_back(sp);
	}
	
	ReadFile >> j;
	for(i=0;i< j; ++i)
	{
		ReadFile >> sp.start_x >> sp.start_y >> sp.end_x >> sp.end_y;
		vec_ellipse.push_back(sp);
	}

	TEXT tap;
	ReadFile >> j;
	for(i=0; i<j; ++i)
	{
		ReadFile >> tap.x >> tap.y ;
		getline(ReadFile,tp);
		getline(ReadFile, tap.sText	);
		ReadFile>> tap.IFont ;
		vec_text.push_back(tap);
	}
	
	ReadFile.close();

	this->Draw(hWnd);
	::MessageBox(hWnd,"File loaded successfully!","paint",MB_OK);

	return true;
}

bool Canvas::SaveToDisk(HWND hWnd)
{
	if(!fSave)
	{
		this->SaveAsToDisk(hWnd);
		return true;
	}
	
	ofstream open_file(strFileName.c_str());
	
	open_file << vec_line.size() << endl;
	for(int i=0;i< vec_line.size();++i)
	{
		open_file << vec_line[i].start_x <<endl << vec_line[i].start_y <<endl;
		open_file << vec_line[i].end_x << endl <<vec_line[i].end_y << endl;
	}
	
	open_file << vec_rect.size()<<endl;
	for(i=0;i < vec_rect.size() ; ++i )
	{
		open_file << vec_rect[i].start_x << endl << vec_rect[i].start_y <<endl;
		open_file << vec_rect[i].end_x << endl << vec_rect[i].end_y << endl;
	}
	
	open_file << vec_ellipse.size()<<endl;
	for(i=0;i< vec_line.size();++i)
	{
		open_file << vec_ellipse[i].start_x <<endl << vec_ellipse[i].start_y <<endl;
		open_file << vec_ellipse[i].end_x << endl <<vec_ellipse[i].end_y << endl;
	}

	open_file << vec_text.size() << endl;
	for(i=0 ; i< vec_text.size(); ++i )
	{
		open_file << vec_text[i].x <<endl << vec_text[i].y << endl;
		open_file << vec_text[i].sText << endl;
		open_file << vec_text[i].IFont << endl;
//		open_file << vec_text[i].chFont << endl;
	}

	open_file.close();
	::MessageBox(hWnd,"File saved successfully!","paint",MB_OK);

	return true;
}















⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -