int m_NumStrokes=0; //笔画数
int m_NumPoints=0; //所有点数
int m_strokePoint=0; //每一笔画的点数
int PixelHandXY[320*240*2]; //存放点的坐标
#define LINE_END_CONST_X (9999) //每一笔画开始的标志,X坐标
#define LINE_END_CONST_Y (9999) //每一笔画开始的标志,Y坐标
#define MAXPOINT 100 //每一笔画最多点数
bool BIsLButtonDown=false; //有没有按下鼠标
void CHandDrawDialog::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CWnd *Pwnd=GetDlgItem(IDC_STATIC_HAND_SHOW);
this->ClientToScreen(&point);
Pwnd->ScreenToClient(&point);
Pwnd->GetClientRect(&m_ShowRect);
if(m_ShowRect.PtInRect(point))
{
m_ptOrigin=point;
BIsLButtonDown=true;
m_NumStrokes++;
m_strokePoint=1;
PixelHandXY[m_NumPoints++]=LINE_END_CONST_X;
PixelHandXY[m_NumPoints++]=LINE_END_CONST_Y;
PixelHandXY[m_NumPoints++]=m_ptOrigin.x;
PixelHandXY[m_NumPoints++]=m_ptOrigin.y;
CString strInfo;
strInfo.Format("笔画数目:%d",m_NumStrokes);
SetDlgItemText(IDC_STATIC_SHOW,strInfo);
}
CDialog::OnLButtonDown(nFlags, point);
}
void CHandDrawDialog::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CWnd *Pwnd=GetDlgItem(IDC_STATIC_HAND_SHOW);
CDC *pDC=Pwnd->GetDC();
this->ClientToScreen(&point);
Pwnd->ScreenToClient(&point);
Pwnd->GetClientRect(&m_ShowRect);
if(m_ShowRect.PtInRect(point))
{
HCURSOR hcur=AfxGetApp()->LoadCursor(IDC_CURSOR_PEN);
SetClassLong(GetSafeHwnd(),GCL_HCURSOR,(LONG)hcur);
if(BIsLButtonDown)
{
if(point.x<0) point.x=0;
if(point.x>m_ShowRect.Width()) point.x=m_ShowRect.Width();
if(point.y<0) point.y=0;
if(point.y>m_ShowRect.Height()) point.y=m_ShowRect.Height();
if(m_strokePoint<=MAXPOINT) //小与100才画出来
{
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
if(m_ptOrigin!=point)
{
PixelHandXY[m_NumPoints++]=point.x;
PixelHandXY[m_NumPoints++]=point.y;
m_ptOrigin=point;
m_strokePoint++;
}
}
}
}
else
{
SetClassLong(GetSafeHwnd(),GCL_HCURSOR,(LONG)LoadCursor(NULL, IDC_ARROW));
}
ReleaseDC(pDC);
CDialog::OnMouseMove(nFlags, point);
}
void CHandDrawDialog::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
BIsLButtonDown=false;
m_strokePoint = 0;
CDialog::OnLButtonUp(nFlags, point);
}
重绘
void CHandDrawDialog::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CWnd *Pwnd=GetDlgItem(IDC_STATIC_HAND_SHOW);
CDC *pDC=Pwnd->GetDC();
CRect m_clientRect;
Pwnd->GetClientRect(&m_clientRect);
pDC->Rectangle(&m_clientRect); //画矩形,使图片框背景为白色。
CPoint m_StartPoint,m_EndPoint;
for(int i=0;i<m_NumPoints-3;i=i+2)
{
if(PixelHandXY[i]!=LINE_END_CONST_X && PixelHandXY[i+3]!=LINE_END_CONST_Y)
{
m_StartPoint.x=PixelHandXY[i];
m_StartPoint.y=PixelHandXY[i+1];
m_EndPoint.x=PixelHandXY[i+2];
m_EndPoint.y=PixelHandXY[i+3];
pDC->MoveTo(m_StartPoint);
if(m_EndPoint.x!=0) pDC->LineTo(m_EndPoint);
}
}
// Do not call CDialog::OnPaint() for painting messages
}
int m_NumPoints=0; //所有点数
int m_strokePoint=0; //每一笔画的点数
int PixelHandXY[320*240*2]; //存放点的坐标
#define LINE_END_CONST_X (9999) //每一笔画开始的标志,X坐标
#define LINE_END_CONST_Y (9999) //每一笔画开始的标志,Y坐标
#define MAXPOINT 100 //每一笔画最多点数
bool BIsLButtonDown=false; //有没有按下鼠标
void CHandDrawDialog::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CWnd *Pwnd=GetDlgItem(IDC_STATIC_HAND_SHOW);
this->ClientToScreen(&point);
Pwnd->ScreenToClient(&point);
Pwnd->GetClientRect(&m_ShowRect);
if(m_ShowRect.PtInRect(point))
{
m_ptOrigin=point;
BIsLButtonDown=true;
m_NumStrokes++;
m_strokePoint=1;
PixelHandXY[m_NumPoints++]=LINE_END_CONST_X;
PixelHandXY[m_NumPoints++]=LINE_END_CONST_Y;
PixelHandXY[m_NumPoints++]=m_ptOrigin.x;
PixelHandXY[m_NumPoints++]=m_ptOrigin.y;
CString strInfo;
strInfo.Format("笔画数目:%d",m_NumStrokes);
SetDlgItemText(IDC_STATIC_SHOW,strInfo);
}
CDialog::OnLButtonDown(nFlags, point);
}
void CHandDrawDialog::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CWnd *Pwnd=GetDlgItem(IDC_STATIC_HAND_SHOW);
CDC *pDC=Pwnd->GetDC();
this->ClientToScreen(&point);
Pwnd->ScreenToClient(&point);
Pwnd->GetClientRect(&m_ShowRect);
if(m_ShowRect.PtInRect(point))
{
HCURSOR hcur=AfxGetApp()->LoadCursor(IDC_CURSOR_PEN);
SetClassLong(GetSafeHwnd(),GCL_HCURSOR,(LONG)hcur);
if(BIsLButtonDown)
{
if(point.x<0) point.x=0;
if(point.x>m_ShowRect.Width()) point.x=m_ShowRect.Width();
if(point.y<0) point.y=0;
if(point.y>m_ShowRect.Height()) point.y=m_ShowRect.Height();
if(m_strokePoint<=MAXPOINT) //小与100才画出来
{
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
if(m_ptOrigin!=point)
{
PixelHandXY[m_NumPoints++]=point.x;
PixelHandXY[m_NumPoints++]=point.y;
m_ptOrigin=point;
m_strokePoint++;
}
}
}
}
else
{
SetClassLong(GetSafeHwnd(),GCL_HCURSOR,(LONG)LoadCursor(NULL, IDC_ARROW));
}
ReleaseDC(pDC);
CDialog::OnMouseMove(nFlags, point);
}
void CHandDrawDialog::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
BIsLButtonDown=false;
m_strokePoint = 0;
CDialog::OnLButtonUp(nFlags, point);
}
重绘
void CHandDrawDialog::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CWnd *Pwnd=GetDlgItem(IDC_STATIC_HAND_SHOW);
CDC *pDC=Pwnd->GetDC();
CRect m_clientRect;
Pwnd->GetClientRect(&m_clientRect);
pDC->Rectangle(&m_clientRect); //画矩形,使图片框背景为白色。
CPoint m_StartPoint,m_EndPoint;
for(int i=0;i<m_NumPoints-3;i=i+2)
{
if(PixelHandXY[i]!=LINE_END_CONST_X && PixelHandXY[i+3]!=LINE_END_CONST_Y)
{
m_StartPoint.x=PixelHandXY[i];
m_StartPoint.y=PixelHandXY[i+1];
m_EndPoint.x=PixelHandXY[i+2];
m_EndPoint.y=PixelHandXY[i+3];
pDC->MoveTo(m_StartPoint);
if(m_EndPoint.x!=0) pDC->LineTo(m_EndPoint);
}
}
// Do not call CDialog::OnPaint() for painting messages
}
打印
void CHandDrawDialog::OnButtonPrint()
{
// TODO: Add your control notification handler code here
if(MessageBox("您要打印当前图像吗?","询问",MB_YESNO|MB_ICONQUESTION)==IDYES)
{
char szprinter[80];
char *szDevice,*szDriver,*szOutput;
HDC hdcprint; // 定义一个设备环境句柄
//定义一个打印作业
static DOCINFO di={sizeof(DOCINFO),"printer",NULL};
// 得到设备字符串存入数组szprinter中
GetProfileString("windows","device",",,,",szprinter,80);
// 将设备字符串分解
if (NULL!=(szDevice=strtok(szprinter,","))&& NULL!=(szDriver=strtok(NULL,","))&& NULL!=(szOutput=strtok(NULL,",")))
{
CWaitCursor wc;
// 创建一个打印机设备句柄
if ((hdcprint=CreateDC(szDriver,szDevice,szOutput,NULL))!=0)
{
if(StartDoc(hdcprint,&di)>0) //开始执行一个打印作业
{
StartPage(hdcprint); //打印机走纸,开始打印
SaveDC(hdcprint); //保存打印机设备句柄
// 输出一行文字
CString str;
str.Format("班级: %d 姓名: %d 学号: %d ",10,20,30);
TextOutA(hdcprint,150*6,40*6,str,str.GetLength());
// 输出图像
CPoint m_start,m_end;
for (int k=0;k<m_NumPoints-3;k=k+2)
{
if((PixelHandXY[k]!=LINE_END_CONST_X)&&(PixelHandXY[k+3]!=LINE_END_CONST_Y)) //-1是新笔画开始的标志
{
m_start.x=PixelHandXY[k]*6+150*6;
m_start.y=PixelHandXY[k+1]*6+90*6;
m_end.x=PixelHandXY[k+2]*6+150*6;
m_end.y=PixelHandXY[k+3]*6+90*6;
MoveToEx(hdcprint,m_start.x,m_start.y,NULL);
if (PixelHandXY[k+2]!=0)
{
LineTo(hdcprint,m_end.x,m_end.y); //m_end.x=0是轨迹结束的标志
}
}
}
RestoreDC(hdcprint,-1); //恢复打印机设备句柄
EndPage(hdcprint); //打印机停纸,停止打印
EndDoc(hdcprint); //结束一个打印作业
MessageBox("打印完成!","提示",MB_OK);
}
else
{
MessageBox("打印机没有连接!","提示",MB_OK|MB_ICONWARNING);
}
// 用API函数DeleteDC销毁一个打印机设备句柄
DeleteDC(hdcprint);
}
else
{
MessageBox("没有安装打印机!","提示",MB_OK|MB_ICONWARNING);
return;
}
}
}
}
void CHandDrawDialog::OnButtonPrint()
{
// TODO: Add your control notification handler code here
if(MessageBox("您要打印当前图像吗?","询问",MB_YESNO|MB_ICONQUESTION)==IDYES)
{
char szprinter[80];
char *szDevice,*szDriver,*szOutput;
HDC hdcprint; // 定义一个设备环境句柄
//定义一个打印作业
static DOCINFO di={sizeof(DOCINFO),"printer",NULL};
// 得到设备字符串存入数组szprinter中
GetProfileString("windows","device",",,,",szprinter,80);
// 将设备字符串分解
if (NULL!=(szDevice=strtok(szprinter,","))&& NULL!=(szDriver=strtok(NULL,","))&& NULL!=(szOutput=strtok(NULL,",")))
{
CWaitCursor wc;
// 创建一个打印机设备句柄
if ((hdcprint=CreateDC(szDriver,szDevice,szOutput,NULL))!=0)
{
if(StartDoc(hdcprint,&di)>0) //开始执行一个打印作业
{
StartPage(hdcprint); //打印机走纸,开始打印
SaveDC(hdcprint); //保存打印机设备句柄
// 输出一行文字
CString str;
str.Format("班级: %d 姓名: %d 学号: %d ",10,20,30);
TextOutA(hdcprint,150*6,40*6,str,str.GetLength());
// 输出图像
CPoint m_start,m_end;
for (int k=0;k<m_NumPoints-3;k=k+2)
{
if((PixelHandXY[k]!=LINE_END_CONST_X)&&(PixelHandXY[k+3]!=LINE_END_CONST_Y)) //-1是新笔画开始的标志
{
m_start.x=PixelHandXY[k]*6+150*6;
m_start.y=PixelHandXY[k+1]*6+90*6;
m_end.x=PixelHandXY[k+2]*6+150*6;
m_end.y=PixelHandXY[k+3]*6+90*6;
MoveToEx(hdcprint,m_start.x,m_start.y,NULL);
if (PixelHandXY[k+2]!=0)
{
LineTo(hdcprint,m_end.x,m_end.y); //m_end.x=0是轨迹结束的标志
}
}
}
RestoreDC(hdcprint,-1); //恢复打印机设备句柄
EndPage(hdcprint); //打印机停纸,停止打印
EndDoc(hdcprint); //结束一个打印作业
MessageBox("打印完成!","提示",MB_OK);
}
else
{
MessageBox("打印机没有连接!","提示",MB_OK|MB_ICONWARNING);
}
// 用API函数DeleteDC销毁一个打印机设备句柄
DeleteDC(hdcprint);
}
else
{
MessageBox("没有安装打印机!","提示",MB_OK|MB_ICONWARNING);
return;
}
}
}
}