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

📄 canvas.cpp

📁 一个使用Windows SDK编写的简单画板程序。实现点、线、矩形、椭圆、文字。
💻 CPP
📖 第 1 页 / 共 2 页
字号:

#include "Stdafx.h"
#pragma warning (disable:4786)
#include"canvas.h"

Canvas::Canvas():iMode(0),Choose_Mode(0),iState(0),Choose_ID(0),IntFont(0),fSave(false)
{
	vec_font.push_back("Courier New");
	vec_font.push_back("Courier New Bold");
	vec_font.push_back("Courier New Italic");
	vec_font.push_back("Courier New Bold Italic");
	vec_font.push_back("Times New Roman");
	vec_font.push_back("Times New Roman Bold");
	vec_font.push_back("Times New Roman Italic");
	vec_font.push_back("Times New Roman Bold Italic");
	vec_font.push_back("Arial");
	vec_font.push_back("Arial Bold");
	vec_font.push_back("Arial Italic");
	vec_font.push_back("Arial Bold Italic");
	vec_font.push_back("Symbol");
	vec_font.push_back("楷体_GB2312");
	vec_font.push_back("宋体");
	vec_font.push_back("隶书");
	vec_font.push_back("黑体");
	vec_font.push_back("幼圆");
}

int Canvas::GetMode()
{
	return iMode;
}
bool Canvas::SetMode(int x)
{
	iMode = x;
	return true;
}
int Canvas::GetState()
{
	return iState;
}
bool Canvas::SetState(int x)
{
	iState = x;
	return true;
}
int Canvas::GetFont()
{
	return IntFont;
}
bool Canvas::SetFont(int x)
{
	IntFont = x;
	return true;
}

int Canvas::GetChoose_Mode()
{
	return Choose_Mode;
}
bool Canvas::Draw(HWND hWnd)
{
	HDC hDc;
	
	//PAINTSTRUCT ps;
	

	for(int i =0 ;i< vec_line.size();i++)
	{
		hDc = ::GetDC(hWnd);
		if(Choose_Mode==1 && i == Choose_ID)
		{
			::SelectObject(hDc, ::CreatePen(PS_DASHDOT, 1, RGB(255,0,0)));
			::MoveToEx(hDc,vec_line[i].start_x,vec_line[i].start_y,NULL);
			::LineTo(hDc,vec_line[i].end_x,vec_line[i].end_y);
		}
		else
		{
			::MoveToEx(hDc,vec_line[i].start_x,vec_line[i].start_y,NULL);
			::LineTo(hDc,vec_line[i].end_x,vec_line[i].end_y);
		}
		::ReleaseDC(hWnd,hDc);
	}
	
	for( int j=0 ;j< vec_rect.size();j++)
	{
		hDc = ::GetDC(hWnd);
		if(Choose_Mode==2 && j == Choose_ID)
		{
			::SelectObject(hDc, ::CreatePen(PS_DASHDOT, 1, RGB(255,0,0)));
			::SelectObject(hDc, ::GetStockObject(NULL_BRUSH));
			::Rectangle(hDc,vec_rect[j].start_x,vec_rect[j].start_y,vec_rect[j].end_x,vec_rect[j].end_y);
			
		}
		else
		{
			::SelectObject(hDc, ::GetStockObject(NULL_BRUSH));
			::Rectangle(hDc,vec_rect[j].start_x,vec_rect[j].start_y,vec_rect[j].end_x,vec_rect[j].end_y);
		}
		::ReleaseDC(hWnd,hDc);
	}
	for(int l=0;l< vec_ellipse.size(); l++)
	{
		hDc = ::GetDC(hWnd);
		if(Choose_Mode==5 && l == Choose_ID)
		{
			::SelectObject(hDc, ::CreatePen(PS_DASHDOT, 1, RGB(255,0,0)));
			::SelectObject(hDc, ::GetStockObject(NULL_BRUSH));
			::Ellipse(hDc,vec_ellipse[l].start_x,vec_ellipse[l].start_y,vec_ellipse[l].end_x,vec_ellipse[l].end_y);
		}
		else
		{
			::SelectObject(hDc, ::GetStockObject(NULL_BRUSH));
			::Ellipse(hDc,vec_ellipse[l].start_x,vec_ellipse[l].start_y,vec_ellipse[l].end_x,vec_ellipse[l].end_y);	
		}
		::ReleaseDC(hWnd,hDc);
	}

	for( int k=0;k< vec_text.size();k++)
	{
		HFONT hF;
		TEXTMETRIC tm;
		hDc = ::GetDC(hWnd);
		//hDc = BeginPaint(hWnd,&ps);
		if(Choose_Mode==3 && k == Choose_ID)
		{
			::SetTextColor(hDc, RGB(255,0,0));
			if(vec_text[k].IFont ==0)
				::TextOut(hDc,vec_text[k].x,vec_text[k].y,vec_text[k].sText.c_str(),strlen(vec_text[k].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[k].IFont-1].c_str());
				SelectObject(hDc,hF);
				GetTextMetrics(hDc,&tm);
				::TextOut(hDc,vec_text[k].x,vec_text[k].y,vec_text[k].sText.c_str(),strlen(vec_text[k].sText.c_str()));
				DeleteObject(hF);
				//InvalidateRect(hWnd,NULL,1);
			}
		}
		else
		{

			if(vec_text[k].IFont ==0)
				::TextOut(hDc,vec_text[k].x,vec_text[k].y,vec_text[k].sText.c_str(),strlen(vec_text[k].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[k].IFont-1].c_str());
				SelectObject(hDc,hF);
				GetTextMetrics(hDc,&tm);
				::TextOut(hDc,vec_text[k].x,vec_text[k].y,vec_text[k].sText.c_str(),strlen(vec_text[k].sText.c_str()));
				DeleteObject(hF);
				//InvalidateRect(hWnd,NULL,1);
			}
		
		}
		//EndPaint(hWnd,&ps);
		::ReleaseDC(hWnd,hDc);
	}
	
	return true;
}

bool Canvas::Choose_text(HWND hWnd)
{
	HDC hDc;
	HFONT hF;
	TEXTMETRIC tm;
	hDc = ::GetDC(hWnd);
	if( IntFont== 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[IntFont-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);
	}
	::ReleaseDC(hWnd,hDc);
	vec_text[Choose_ID].IFont = IntFont;
	return true;
}


bool Canvas::Start_line(int x,int y)
{
	
	
	iLine.start_x = x;
	iLine.start_y = y;
	temp.x = x;
	temp.y = y;
	iState = 1;
	return true;
}

bool Canvas::Move_line(HWND hWnd,int x,int y)
{

	HDC hDc;
	hDc = ::GetDC(hWnd);
	::SelectObject(hDc, ::GetStockObject(WHITE_PEN));
	::MoveToEx(hDc,iLine.start_x,iLine.start_y,NULL);
	::LineTo(hDc,temp.x ,temp.y );
	::SelectObject(hDc, ::GetStockObject(BLACK_PEN));
	::MoveToEx(hDc,iLine.start_x,iLine.start_y,NULL);
	::LineTo(hDc,x,y);
	::ReleaseDC(hWnd,hDc);

	temp.x = x;
	temp.y= y;
	return true;
}

bool Canvas::Draw_line(HWND hWnd,int x,int y)
{
	HDC hDc;
	hDc = ::GetDC(hWnd);
	::MoveToEx(hDc,iLine.start_x,iLine.start_y,NULL);
	::LineTo(hDc,x,y);
	::ReleaseDC(hWnd,hDc);

	SHAPE_POINT temp_line;
	temp_line.start_x = iLine.start_x;
	temp_line.start_y = iLine.start_y;
	temp_line.end_x = x;
	temp_line.end_y = y;
	
	vec_line.push_back(temp_line);

	iState = 0;
	return true;
}

bool Canvas::Start_rect(int x,int y)
{
	iRect.start_x = x;
	iRect.start_y = y;
	temp.x = x;
	temp.y = y;
	iState =1;
	return true;
}

bool Canvas::Move_rect(HWND hWnd,int x,int y)
{
	HDC hDc;
	hDc = ::GetDC(hWnd);
	::SelectObject(hDc, ::GetStockObject(WHITE_PEN));
	::SelectObject(hDc, ::GetStockObject(NULL_BRUSH));
	::Rectangle(hDc,iRect.start_x,iRect.start_y,temp.x,temp.y);
	

	::SelectObject(hDc, ::GetStockObject(BLACK_PEN));
	::SelectObject(hDc, ::GetStockObject(NULL_BRUSH));
	::Rectangle(hDc,iRect.start_x,iRect.start_y,x,y);

	::ReleaseDC(hWnd,hDc);
	
	temp.x = x;
	temp.y = y;
	return true;
}
bool Canvas::Draw_rect(HWND hWnd,int x,int y)
{
	HDC hDc;
	hDc = ::GetDC(hWnd);
	::SelectObject(hDc, ::GetStockObject(NULL_BRUSH));
	::Rectangle(hDc,iRect.start_x,iRect.start_y,x,y);

	::ReleaseDC(hWnd,hDc);

	SHAPE_POINT temp_rect;
	temp_rect.start_x = iRect.start_x;
	temp_rect.start_y = iRect.start_y;
	temp_rect.end_x = x;
	temp_rect.end_y = y;
	vec_rect.push_back(temp_rect);
	iState = 0;
	return true;
}

bool Canvas::Start_ellipse(int x, int y)
{
	iEllipse.start_x = x;
	iEllipse.start_y = y;
	temp.x = x;
	temp.y = y;
	iState =1;
	return true;
}

bool Canvas::Move_ellipse(HWND hWnd,int x,int y)
{
	HDC hDc;
	hDc = ::GetDC(hWnd);
	::SelectObject(hDc, ::GetStockObject(WHITE_PEN));
	::SelectObject(hDc, ::GetStockObject(NULL_BRUSH));
	::Ellipse(hDc,iEllipse.start_x,iEllipse.start_y,temp.x,temp.y);
	::SelectObject(hDc, ::GetStockObject(BLACK_PEN));
	::SelectObject(hDc, ::GetStockObject(NULL_BRUSH));
	::Ellipse(hDc,iEllipse.start_x,iEllipse.start_y,x,y);
	::ReleaseDC(hWnd,hDc);

	temp.x = x;
	temp.y= y;
	return true;
}

bool Canvas::Draw_ellipse(HWND hWnd,int x,int y)
{
	HDC hDc;
	hDc = ::GetDC(hWnd);
	::SelectObject(hDc, ::GetStockObject(NULL_BRUSH));
	::Ellipse(hDc,iEllipse.start_x,iEllipse.start_y,x,y);
	::ReleaseDC(hWnd,hDc);

	SHAPE_POINT temp_ellipse;
	temp_ellipse.start_x = iEllipse.start_x;
	temp_ellipse.start_y = iEllipse.start_y;
	temp_ellipse.end_x = x;
	temp_ellipse.end_y = y;
	
	vec_ellipse.push_back(temp_ellipse);

	iState = 0;
	return true;
}
bool Canvas::Input_text(HWND hWnd, int x,int y, char pText[256])
{
	HDC hDc;
	HFONT hF;
	hDc =::GetDC(hWnd);
	TEXTMETRIC tm;
	if(IntFont == 0)
	{
		
		::TextOut(hDc,x,y,pText,strlen(pText));
		
	}
	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[IntFont-1].c_str());
		SelectObject(hDc,hF);
		GetTextMetrics(hDc,&tm);
		::TextOut(hDc,x,y,pText,strlen(pText));
		DeleteObject(hF);
		
	}

⌨️ 快捷键说明

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