图形的绘制.docx
- 文档编号:4608945
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:11
- 大小:21.05KB
图形的绘制.docx
《图形的绘制.docx》由会员分享,可在线阅读,更多相关《图形的绘制.docx(11页珍藏版)》请在冰豆网上搜索。
图形的绘制
图形的绘制
新建一个MFC单文档应用程序,工程名为Graphic.
1.画点、直线、矩形、椭圆
在菜单上添加一个绘图弹出菜单,并添加点、直线、矩形、椭圆菜单项,ID分别为:
IDM_POINT、IDM_LINE、IDM_RECTANGLE、IDM_ELLIPS,并分别添加命令消息响应,
编辑:
void CGraphicView:
:
OnPoint()
{
// TODO:
Add your command handler code here
m_nDrawType=1;
}
void CGraphicView:
:
OnLine()
{
// TODO:
Add your command handler code here
m_nDrawType=2;
}
void CGraphicView:
:
OnRectangle()
{
// TODO:
Add your command handler code here
m_nDrawType=3;
}
void CGraphicView:
:
OnEllpse()
{
// TODO:
Add your command handler code here
m_nDrawType=4;
}
在CGraphicView类中添加私有的成员变量:
private:
CPoint m_ptOrigin;
UINT m_nDrawType;
并在构造函数中初始化:
CGraphicView:
:
CGraphicView()
{
// TODO:
add construction code here
m_nDrawType=0;//初始化为0
m_ptOrigin=0;//将原点设置成(0,0)
}
再在CGraphicView类上添加两个消息处理函数,WM_LBUTTONDOWN,WM_LBUTTONUP,编辑:
void CGraphicView:
:
OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO:
Add your message handler code here and/or call default
m_ptOrigin=point;//当鼠标左键按下时,将当前点保存到成员变量当中
CView:
:
OnLButtonDown(nFlags, point);
}
void CGraphicView:
:
OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO:
Add your message handler code here and/or call default
CClientDC dc(this);
CPenpen(PS_SOLID,1,RGB(255,0,0));//创建画笔
dc.SelectObject(&pen);//将画笔选到设备描述表当中
CBrush*pBrush=CBrush:
:
FromHandle
((HBRUSH)GetStockObject(NULL_BRUSH));//创建透明的画刷
dc.SelectObject(pBrush);//将画刷选到设备描环境当中
switch(m_nDrawType)
{
case 1:
dc.SetPixel(point,RGB(255,0,0));
break;
case 2:
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
break;
case 3:
dc.Rectangle(CRect(m_ptOrigin,point));
break;
case 4:
dc.Ellipse(CRect(m_ptOrigin,point));
break;
default:
break;
}
CView:
:
OnLButtonUp(nFlags, point);
}
运行,OK!
2.给程序添加设置对话框
在对话框资源中新建一个对话框,ID:
IDD_DIALOG_SETTING,标题:
Setting,并添加一个静态文本控件(标题:
线宽)和一个编辑框控件(ID:
IDC_LINE_WIDTH),双击新建一对话框控件,给它新增一个类(类名:
CSettingDlg),由于VC6.0本身的问题,这里要删除工程目录下的Graphic.clw文件,然后再打开classwizard….重新根据源文件建立一个类向导文件,取名仍就为Grahpic.clw。
再给编辑框控件添加一个关联的UINT类型的成员变量m_nLineWidth.
再给CGraphicView类添加一个UINT类型的私有成员变量(取名也叫m_nLineWidth),并在其构造方法中初始化:
m_nLineWidth=0;
然后在CGraphicView类当中对话框IDM_SETTING添加一个COMMAND消息响应函数,编辑:
voidCGraphicView:
:
OnSettiing()
{
//TODO:
Addyourcommandhandlercodehere
CSettingDlgdlg;//设置一个CSettingDlg对象
dlg.m_nLineWidth=m_nLineWidth;
//将View类中先前保存的值传回到对话框变量
if(IDOK==dlg.DoModal())//如果选择是的OK按钮
{
m_nLineWidth=dlg.m_nLineWidth;//将用户输入的线宽保存到m_nLineWidth
}
}
并在CGraphicView:
:
OnLButtonUp函数中把线宽改成m_nLineWidth替代:
void CGraphicView:
:
OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO:
Add your message handler code here and/or call default
CClientDC dc(this);
CPen pen(PS_SOLID,m_nLineWidth,RGB(255,0,0));//创建画笔
……………
………….
………….
}
OK^_^!
!
!
3.添加线型设置选项
在对话框中建一个组框(标题:
线型),并在组框内加三个单选按钮,标题分别为:
实线,虚线,点线。
并选中实线单选按钮的组属性,并给它添加一个int类型的成员变量m_nStyle。
然后在CGraphicView:
:
OnSettiing函数中编辑:
void CGraphicView:
:
OnSettiing()
{
// TODO:
Add your command handler code here
CSettingDlg dlg;//设置一个CSettingDlg对象
dlg.m_nLineWidth=m_nLineWidth;
dlg.m_nLineStyle=m_nLineStyle;
//将View类中先前保存的值传回到对话框变量
if(IDOK==dlg.DoModal())//如果选择是的OK按钮
{
m_nLineWidth=dlg.m_nLineWidth;//将用户输入的线宽保存到m_nLineWidth
m_nLineStyle=dlg.m_nLineStyle;
}
}
在CGraphicView:
:
OnLButtonU函数中修改:
void CGraphicView:
:
OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO:
Add your message handler code here and/or call default
CClientDC dc(this);
CPen pen(m_nLineStyle,m_nLineWidth,RGB(255,0,0));//创建画笔
//因为组中的单选按实线,虚线,点线的值恰好是0,1,2,所以不需要作switch语句
..............
..............
..............
CView:
:
OnLButtonUp(nFlags, point);
}
4.创建一个颜色对话框
在资源的绘图菜单下,添加一个颜色菜单选项,并在CGrahpicView类中给它添加一个命令消息响应函数OnColor.然后再在CGrahpicView类中添加一个COLORREF类型的私有的成员变量m_clr,
并在构造函数中将其初始化:
m_clr=RGB(255,0,0);//将颜色初始化为红色
在CGraphicView:
:
OnColor函数中编辑:
void CGraphicView:
:
OnColor()
{
// TODO:
Add your command handler code here
CColorDialog Dlg;//创建一个颜色对话框对象
Dlg.m_cc.Flags|=CC_RGBINIT|CC_FULLOPEN;//设置Dlg的标记,与它先前的标记组合起来
//CC_FULLOPEN是把颜色对话框完全展开
Dlg.m_cc.rgbResult=m_clr;//将View类的颜色值设置回颜色对话框去
if(IDOK==Dlg.DoModal())
{
m_clr=Dlg.m_cc.rgbResult;
}
//DoModal:
Call this function to display the Windows common color dialog box and allow the user to select a color.
}
在CGraphicView:
:
OnLButtonUp中修改:
void CGraphicView:
:
OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO:
Add your message handler code here and/or call default
CClientDC dc(this);
CPen pen(m_nLineStyle,m_nLineWidth,m_clr);//创建画笔
//因为组中的单选按实线,虚线,点线的值恰好是0,1,2,所以不需要作switch语句
dc.SelectObject(&pen);//将画笔选到设备描述表当中
CBrush *pBrush=CBrush:
:
FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//创建透明的画刷
dc.SelectObject(pBrush);//将画刷选到设备描环境当中
switch(m_nDrawType)
{
case 1:
dc.SetPixel(point,m_clr);
break;
..........
..........
..........
}
CView:
:
OnLButtonUp(nFlags, point);
}
OK!
!
^_^
5.创建字体对话框
在资源的绘图菜单下,添加一个字体菜单选项,并在CGrahpicView类中给它添加一个命令消息响应函数OnFont.然后再在CGrahpicView类中添加一个CFont类型的私有的成员变量m_font,和一个CString类型的私有成员变量m_strFontName,并在构造函数中将其初始化:
m_strFontName="";
在CGraphicView:
:
OnFont函数中编辑:
void CGraphicView:
:
OnFont()
{
// TODO:
Add your command handler code here
CFontDialog dlg;
if(IDOK==dlg.DoModal())
{
if(m_font.m_hObject)//如果字体资源对象已存在
{
m_font.DeleteObject();//就释放这种字体资源对象
}
m_font.CreateFontIndirect(dlg.m_cf.lpLogFont);//再创建一种字体资源,并与之相关联
//CreateFontIndirect:
This method initializes a CFont object with the characteristicsgiven in a LOGFONT structure pointed to by lpLogFont.
m_strFontName=dlg.m_cf.lpLogFont->lfFaceName;//将字体的名字保存下来
Invalidate();//使窗口无效,下次WM_PAINT消息发送时,窗口就进行重绘
}
}
将选择的字体的名字显示出来,在CGraphicView:
:
OnDraw函数中编辑:
void CGraphicView:
:
OnDraw(CDC* pDC)
{
CGraphicDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO:
add draw code for native data here
CFont *pOldFont=pDC->SelectObject(&m_font);//保存原来的字体
pDC->TextOut(0,0,m_strFontName);//将选择的字体的名字输出
pDC->SelectObject(pOldFont);//将原来的字体选择回去
}
运行,OK!
!
6.在设置对话框中做示例
在IDD_DIALOG_SETTING对话框中,拖入一个组框(ID:
IDC_SAMPLE,标题:
示例),然后再给IDC_LINE_WIDTH(编辑框)、IDC_RADIO1(实线单选按钮)、IDC_RADIO2、IDC_RADIO3分别添加EN_CHANGE、BN_CLICKED、BN_CLICKED、BN_CLICKED消息响应函数,并在这四个消息响应函数中都添加一句:
Invalidate();使窗口无效,这样下次发送WM_PAINT消息,窗口便会重绘。
这样就只需要在OnPaint函数中编写一处代码就行了。
接着,在CSettingDlg类上添加一个成员变量:
public:
COLORREFm_clr;//用来保存颜色值
并在构造函数中初始化:
m_clr=RGB(255,0,0);//初始化红色
同样,在CGraphicView:
:
OnSettiing函数中也要修改:
void CGraphicView:
:
OnSettiing()
{
// TODO:
Add your command handler code here
CSettingDlg dlg;//设置一个CSettingDlg对象
dlg.m_nLineWidth=m_nLineWidth;
dlg.m_nLineStyle=m_nLineStyle;
dlg.m_clr=m_clr;
//将View类中先前保存的值传回到对话框变量
if(IDOK==dlg.DoModal())//如果选择是的OK按钮
{
m_nLineWidth=dlg.m_nLineWidth;//将用户输入的线宽保存到m_nLineWidth
m_nLineStyle=dlg.m_nLineStyle;
}
}
在CSettingDlg类上添加一个WM_PAINT消息响应函数,编辑:
void CSettingDlg:
:
OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO:
Add your message handler code here
//在这里完成示例线条的绘制
UpdateData();//将控件上的值反应到成员变量当中
CPen pen(m_nLineStyle,m_nLineWidth,m_clr);
dc.SelectObject(&pen);
CRect rect;
GetDlgItem(IDC_SAMPLE)->GetWindowRect(&rect);//得到静态文本控件矩形区域的大小
ScreenToClient(rect);//将屏幕坐标转换成客户区坐标
dc.MoveTo(rect.left+12,rect.top+rect.Height()/2+3);//示例线条初始位置的坐标
dc.LineTo(rect.right-12,rect.top+rect.Height()/2+3);//示例线条末端坐标,加3是为了调整坐标
// Do not call CDialog:
:
OnPaint() for painting messages
}
7.改变对话框控件的背景色及文字颜色
修改整个对话框及其控件的背景色
设置对话框控件的背景色,在CSettingDlg类下添加一个WM_CTLCOLOR消息处理函数,并添加一个私有的成员变量:
CBrushm_brush;并在构造函数中初始化:
m_brush.CreateSolidBrush(RGB(0,0,255));//对画刷进行初始化,蓝色
然后在CSettingDlg:
:
OnCtlColor函数中修改:
HBRUSH CSettingDlg:
:
OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog:
:
OnCtlColor(pDC, pWnd, nCtlColor);
// TODO:
Change any attributes of the DC here
// TODO:
Return a different brush if the default is not desired
//return hbr;
return m_brush;
}
修改某一个控件的背景色
对线型组框修改,首先将线型组框的ID改为:
IDC_LINE_STYLE,并在CSettingDlg:
:
OnCtlColor中编辑:
HBRUSH CSettingDlg:
:
OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog:
:
OnCtlColor(pDC, pWnd, nCtlColor);
// TODO:
Change any attributes of the DC here
if(pWnd->GetDlgCtrlID()==IDC_LINE_STYLE)//匹配是否是线型组框
{
pDC->SetTextColor(RGB(255,0,0));//设置组框文字颜色为红色
pDC->SetBkMode(TRANSPARENT); //设置文字的背景色为透明
return m_brush; //设置相匹配的控件的背景色
}
if(pWnd->GetDlgCtrlID()==IDC_LINE_WIDTH)//匹配编辑框
{
pDC->SetTextColor(RGB(255,0,0));//设置编辑框文字颜色为红色
pDC->SetBkMode(TRANSPARENT); //设置文字的背景色为透明
//pDC->SetBkColor(RGB(255,0,0));//设置文字背景色为蓝色
return m_brush;
}
// TODO:
Return a different brush if the default is not desired
return hbr;
//return m_brush;
}
8.修改控件的字体
在对话框中插入一个静态文本控件(ID:
IDC_TEXT,标题:
程序员),再给CStringDlg类添加一个私有的成员变量m_font,并在构造函数中初始化:
m_font.CreatePointFont(200,"华文行楷");
在CSettingDlg:
:
OnCtlColor添加:
if(pWnd->GetDlgCtrlID()==IDC_TEXT)//匹配程序员静态文本控件
{
pDC->SelectObject(&m_font);//设置字体
}
9.修改Button控件的背景色和文本颜色
修改OK按钮的文字颜色
先创建一个Button类,然后将CSetttingDlg这个对话框上的按钮控件与它关联。
Insert->newclass->(classtype:
MFCClass,name:
CTestBtn,BaseClass:
CButton)如果这里出现问题了,可以重新建立那个Classwizard数据库文件。
然后可以在CTestBtn上增加一个DrawItem虚函数,并添加以下代码:
void CTestBtn:
:
DrawI
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图形 绘制