📄 canvas.cpp
字号:
::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 + -