vc++画图板程序总结Word文档下载推荐.docx
- 文档编号:16212155
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:16
- 大小:282.07KB
vc++画图板程序总结Word文档下载推荐.docx
《vc++画图板程序总结Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《vc++画图板程序总结Word文档下载推荐.docx(16页珍藏版)》请在冰豆网上搜索。
表1菜单项对应ID
菜单名
ID
直线
ID_LINE
线宽1
ID_W1
实线
ID_SOLID
矩形
ID_RECT
线宽2
ID_W2
虚线
ID_DASH
椭圆
ID_ELLIPSE
线宽3
ID_W3
点线
ID_DOT
颜色
ID_COLOR
线宽4
ID_W4
点段线
ID_DASHDOT
填充色
ID_FILLCOLOR
线宽5
ID_W5
建立类向导,在视图类CDrawView中,对各菜单项添加对应的COMMAND消息处理函数,部分菜单项还添加对应的UPDATE_COMMAND_UI消息函数,如图6所示。
图6建立类向导
3.在相应消息函数处添加代码,实现其功能
建立类向导,在视图类CDrawView中,添加WM_PAINT消息,以及WM_LBUTTONDOWN、WM_LBUTTONUP、WM_MOUSEMOVE消息,并在其中添加相应的代码。
B关键功能实现
1.选择要绘制的图形
在直线、矩形以及椭圆和曲线的消息处理函数里为shape分别赋值为1,2,3,4在OnPaint()函数里添加4个if语句的代码来这实现这三个图形的绘制:
当选择画直线时,shape=1,则执行绘制直线代码,当选择画矩形时,shape=2,则执行绘制矩形的代码,当选择画椭圆时,shape=3,则执行绘制椭圆的代码,当选择曲线时,shape=4。
2.改变线宽
在OnPaint()创建的画笔中,pen.CreatePen(penstyle,w,m_nColor),线宽处用w表示,则改变w的值即改变了画笔的粗细。
选择菜单绘图→线宽选择划线宽度值,此时所选的线宽值就赋给线宽变量w。
若不选择线宽值,则w=1(即默认线宽值为1)。
3.改变线型
在OnPaint()创建的画笔中,pen.CreatePen(penstyle,w,m_nColor),线型处用penstyle表示,则改变penstyle的值即改变了画笔的类型。
选择菜单绘图→线型选择线型,此时所选的线型就赋给线型变量penstyle。
若不选择线型值,则penstyle=ID_SOLID(即默认线型为实线)。
4.改变线色
在OnPaint()创建的画笔中,pen.CreatePen(penstyle,w,m_nColor),线的颜色处用m_nColor表示,则改变m_nColor即改变了画笔的颜色。
选择菜单绘图→颜色,会弹出通过WM_COLORREF从系统中引入的颜色选择对话框,选择颜色后,点击确定则相应颜色值就赋给变量m_nColor,此时画笔的颜色就会发上变化。
若不选择颜色,则默认(线)颜色为黑色。
4.改变填充色
在OnPaint()创建的画刷中,brush.CreateSolidBrush(m_fColor),颜色就是用m_fColor表示的,改变m_fColor即改变了画刷的颜色。
选择菜单绘图→填充色,会弹出通过WM_COLORREF从系统中引入的颜色选择对话框,选择颜色后,点击确定则相应颜色值就赋给变量m_fColor,此时画刷的颜色就会发上变化。
若不选择颜色,则默认填充色为黑色。
5.绘制图形
鼠标左键按下,则捕获鼠标此时的位置坐标为画图的起点,此时在OnLButtonDown()函数里,将捕获的坐标值赋给定义作为起点的变量opoint;
按下鼠标左键拖动鼠标时,捕捉鼠标当前位置坐标值为终点坐标值,此时在OnMouseMove()函数里,把捕获的坐标值赋给定义作为终点的变量cpoint,OnPaint()中绘图的代码中的坐标都得到了,进行绘图;
鼠标左键弹起时,此时绘图结束,鼠标弹起时所在位置就是画图的最终终点位置,画图结束后,刷新窗口,以便重新画图,此时执行的是OnLButtonUp()函数。
四、结果及源代码
4.1运行结果
1.点击链接,编译,运行后的窗口如图7所示。
图7运行结果
点击绘图,选择相应的图形和线宽和颜色以及背景色,即可绘出自己想画的图。
4.2程序代码
首先在Drawview.h中添加成员变量
1.在视图类构造函数中对各定义变量初始化
CDrawView:
:
CDrawView()
{
w=1;
//初始状态时线宽
shape=1;
//初始状态时形状
m_nColor=RGB(0,0,0);
//初始状态时线色
m_fColor=RGB(0,0,0);
//初始状态时填充色
penstyle=PS_SOLID;
//初始化线型为实线
}
2.形状函数
voidCDrawView:
OnLine()
OnRect()
shape=2;
OnEllipse()
shape=3;
OnCurve()
shape=4;
3.线宽改变函数
OnW1()
OnW2()
w=2;
OnW3()
w=3;
OnW4()
w=4;
OnW5()
w=5;
4.线型选择函数
OnSolid()
OnDash()
penstyle=PS_DASH;
OnDot()
penstyle=PS_DOT;
OnDashdot()
penstyle=PS_DASHDOT;
5.颜色选择函数
OnColor()
CColorDialogColor;
//创建颜色对话框
if(Color.DoModal()==IDOK)//如果用户点击OK按钮
{
m_nColor=Color.GetColor();
//更改颜色,把颜色赋到m_nColor
}
6.填充色选择函数
OnFullcolor()
CColorDialogFullColor;
if(FullColor.DoModal()==IDOK)//如果用户点击OK按钮
m_fColor=FullColor.GetColor();
//更改颜色,把颜色赋到m_fColor
}
7.单击、移动、绘画函数
OnLButtonDown(UINTnFlags,CPointpoint)
m_Down=TRUE;
//鼠标按下
SetCapture();
//获取坐标
opoint=point;
//把鼠标所在坐标赋给起点坐标opoint
ReleaseCapture();
//释放坐标
CView:
OnLButtonDown(nFlags,point);
OnLButtonUp(UINTnFlags,CPointpoint)
m_Down=FALSE;
//鼠标不按下,即弹起
Invalidate(0);
//刷新
OnLButtonUp(nFlags,point);
OnMouseMove(UINTnFlags,CPointpoint)
if(m_Down)//如果鼠标按下
cpoint=point;
//把鼠标所在点坐标赋给终点坐标cpoint
CClientDCdc(this);
if(4==shape)//画曲线
{
CPenpen(PS_SOLID,10,RGB(255,0,0));
CPen*oldpen=dc.SelectObject(&
pen);
dc.MoveTo(opoint);
dc.LineTo(cpoint);
dc.SelectObject(oldpen);
opoint=cpoint;
}
OnMouseMove(nFlags,point);
OnPaint()
CPaintDCdc(this);
//devicecontextforpainting
CPenpen;
//定义画笔
CBrushbrush;
//定义画刷
pen.CreatePen(penstyle,w,m_nColor);
//创建画笔
brush.CreateSolidBrush(m_fColor);
//创建画刷
dc.SelectObject(&
//获取画笔
brush);
//获取画刷
if(1==shape)//画直线
dc.MoveTo(opoint.x,opoint.y);
dc.LineTo(cpoint.x,cpoint.y);
//绘制直线,从opoint到cpoint连线
if(2==shape)///画矩形
dc.Rectangle(opoint.x,opoint.y,cpoint.x,cpoint.y);
//绘制矩形
if(3==shape)//画椭圆
dc.Ellipse(opoint.x,opoint.y,cpoint.x,cpoint.y);
//绘制椭圆
8.菜单勾选函数
OnUpdateLine(CCmdUI*pCmdUI)
pCmdUI->
SetCheck(shape==1);
//shape为1时,直线选项前打上勾
OnUpdateRect(CCmdUI*pCmdUI)
SetCheck(shape==2);
//shape为2时,矩形选项前打上勾
OnUpdateEllipse(CCmdUI*pCmdUI)
SetCheck(shape==3);
//shape为3时,椭圆选项前打上勾
OnUpdateRect(CCmdUI*pCmdUI)
pCmdUI->
SetCheck(shape==4);
//shape为4时,曲线选项前打上勾
OnUpdateW1(CCmdUI*pCmdUI)
SetRadio(w==1);
//当线宽为1时,此选项前标有圆点
OnUpdateW2(CCmdUI*pCmdUI)
SetRadio(w==2);
//当线宽为2时,此选项前标有圆点
OnUpdateW3(CCmdUI*pCmdUI)
SetRadio(w==3);
//当线宽为3时,此选项前标有圆点
OnUpdateW4(CCmdUI*pCmdUI)
SetRadio(w==4);
//当线宽为4时,此选项前标有圆点
OnUpdateW5(CCmdUI*pCmdUI)
SetRadio(w==5);
//当线宽为5时,此选项前标有圆点
OnUpdateSolid(CCmdUI*pCmdUI)
SetRadio(penstyle==PS_SOLID);
//当线型为实线时,此选项前标有圆点
OnUpdateDash(CCmdUI*pCmdUI)
SetRadio(penstyle==PS_DASH);
//当线型为虚线时,此选项前标有圆点
OnUpdateDot(CCmdUI*pCmdUI)
SetRadio(penstyle==PS_DOT);
//当线型为点线时,此选项前标有圆点
OnUpdateDashdot(CCmdUI*pCmdUI)
SetRadio(penstyle==PS_DASHDOT);
//当线型为点段线时,此选项前标有圆点
9.图像保存函数
OnBmpSave()
{
BITMAPINFObi;
//信息头
void*pBits=NULL;
CRectrect;
//客户区窗口
GetClientRect(&
rect);
intnWidth=rect.right;
intnHeight=rect.bottom;
//填充信息头
ZeroMemory(&
bi,sizeof(bi));
bi.bmiHeader.biSize=sizeof(bi.bmiHeader);
bi.bmiHeader.biHeight=nHeight;
bi.bmiHeader.biWidth=nWidth;
bi.bmiHeader.biPlanes=1;
bi.bmiHeader.biBitCount=24;
bi.bmiHeader.biCompression=BI_RGB;
bi.bmiHeader.biSizeImage=3*nWidth*nHeight;
//拷贝客户区至内存DC
HDChActiveDC=:
GetDC(this->
m_hWnd);
HDChActiveWndCompatibleDC=CreateCompatibleDC(hActiveDC);
HBITMAPhActiveWndCompactibleBitmap=CreateCompatibleBitmap(hActiveDC,rect.right,rect.bottom);
SelectObject(hActiveWndCompatibleDC,hActiveWndCompactibleBitmap);
BitBlt(hActiveWndCompatibleDC,0,0,rect.right,rect.bottom,hActiveDC,0,0,SRCCOPY);
//保存内存DC
HDChBmpFileDC=CreateCompatibleDC(hActiveWndCompatibleDC);
HBITMAPhBmpFileBitmap=CreateDIBSection(hActiveWndCompatibleDC,&
bi,DIB_RGB_COLORS,&
pBits,NULL,0);
SelectObject(hBmpFileDC,hBmpFileBitmap);
BitBlt(hBmpFileDC,0,0,nWidth,nHeight,hActiveWndCompatibleDC,0,0,SRCCOPY);
CStringtempFileName=_T("
test.bmp"
);
//目标文件名
CFileDialogdlg(FALSE,_T("
bmp"
),_T("
Temp.bmp"
),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("
BitmapFiles(*.bmp)|*.bmp|AllFiles(*.*)|*.*||"
),this);
if(dlg.DoModal()==IDOK)
tempFileName=dlg.GetPathName();
HANDLEhFile=CreateFile(tempFileName,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile!
=INVALID_HANDLE_VALUE)
DWORDdwRet=0;
//填充文件头
BITMAPFILEHEADERbmfHeader;
ZeroMemory(&
bmfHeader,sizeof(bmfHeader));
bmfHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
bmfHeader.bfSize=bi.bmiHeader.biSizeImage+bmfHeader.bfOffBits;
bmfHeader.bfType='
MB'
;
WriteFile(hFile,&
bmfHeader,sizeof(bmfHeader),&
dwRet,NULL);
bi.bmiHeader,sizeof(bi.bmiHeader),&
WriteFile(hFile,pBits,bi.bmiHeader.biSizeImage,&
CloseHandle(hFile);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- vc 画图板 程序 总结