版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、附录表1、 具体步骤: 1、选择菜单栏的“新建,选择MFC工程名为DrawGraphics,并设置为基于对话框的工程,如图-1、图-2所示; 图-1 图-22、 按下键盘上的Ctrl+W键,调出类向导,选择“Add Class,并点击“New添加一个颜色按钮类CColorButton,继承自CButton类,如图-3所示: 图-3 3、在CColorButton中添加如下成员变量:COLORREF color;/按钮颜色CPoint arrays4;/按钮顶点坐标BOOL IsShow; /是否显示按钮BOOL IsPressed; /按钮是否被按下 4、右击CColorButton类,选择A
2、dd Virtul function ,重写其DraItem函数,如图-4,图-5所示: 图-4 图-55、 为其Drawitem函数中添加如下代码: CRect rect;GetClientRect(rect);CDC dc;dc.Attach(lpDrawItemStruct->hDC); arrays0=CPoint(rect.left,rect.top);arrays1=CPoint(rect.right,rect.top); arrays2=CPoint(rect.right,rect.bottom); arrays3=CPoint(rect.left,rect.bottom)
3、;/设置背景透明dc.SetBkMode(TRANSPARENT);if (IsShow)/创立一个位图画刷CBrush brush(color);dc.SelectObject(&brush);CPen pen(PS_NULL,1,color);dc.SelectObject(&pen);dc.Rectangle(rect);if(IsPressed)CPen pen(PS_DASHDOTDOT,3,RGB(0,0,0);dc.SelectObject(&pen);dc.MoveTo(arrays0);for(int i=1;i<4;i+)dc.LineTo(a
4、rraysi);dc.LineTo(arrays0);elseCPen pen(PS_DASHDOTDOT,2,color);dc.SelectObject(&pen);dc.MoveTo(arrays0);for(int i=1;i<4;i+)dc.LineTo(arraysi);dc.LineTo(arrays0);/绘制按钮文本CString str;GetWindowText(str);dc.SetTextColor(RGB(255-GetRValue(color),255-GetGValue(color),255-GetBValue(color); dc.DrawTex
5、t(str,CRect(0,0,rect.right,rect.bottom),DT_CENTER|DT_VCENTER|DT_SINGLELINE);6、 为CColorButton添加属性设置函数:void CColorButton:SetDrawColor(COLORREF m_color,BOOL IsShow)this->color = m_color; this->IsShow=IsShow;7、 为CColorButton添加WM_LBUTTONDOWN和WM_LBUTTONUP消息,其消息处理函数如下:void CColorButton:OnLButtonDown(
6、UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultIsPressed = true; CButton:OnLButtonDown(nFlags, point);void CColorButton:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultIsPressed = false; CButton:OnLButtonU
7、p(nFlags, point);8、 为DrawGraphics工程的中的对话框资源拖拽如下控件,如图-6所示,并按表-1设置其相关ID; 图-6ID作用及类别IDC_RADIO_RECT矩形单项选择按钮IDC_RADIO_ROUND圆形单项选择按钮IDC_RADIO_LINE直线单项选择按钮IDC_RADIO_SELF涂鸦单项选择按钮IDC_RADIO_SLOIDLINE实线单项选择按钮IDC_RADIO_DOTTEDLINE虚线单项选择按钮IDC_COMBO_LINEVALUE线条粗细下拉列表IDC_STATIC_LINEEXAMPLE显示线条粗细的Picture控件IDC_CHECK_
8、BORDER是否有边界复选框IDC_RADIO_SOLID填充单项选择按钮IDC_RADIO_GRADIENT渐变单项选择按钮IDC_RADIO_NULL无填充单项选择按钮IDC_BUTTON_FORECOLOR前景色按钮IDC_BUTTON_BKCOLOR背景色按钮IDC_RADIO_PEN画笔单项选择按钮IDC_RADIO_CLEAR清空画板单项选择按钮IDC_STATIC_GRAPHICS画板区Picture控件 表-19、 翻开类向导,按图-7所示,为相关控件添加关联成员:10、在CDrawGraphicsDlg类的OninitDialog函数中添加初始化代码: BOOL CDrawG
9、raphicsDlg:OnInitDialog()/*.省略无关代码. .*/ TODO: Add extra initialization here CButton *cb; /设置相关按钮的默认选中状态 cb=(CButton *)GetDlgItem(IDC_RADIO_RECT); cb->SetCheck(1); cb=(CButton *)GetDlgItem(IDC_RADIO_SLOIDLINE); cb->SetCheck(1); cb=(CButton *)GetDlgItem(IDC_CHECK_BORDER); cb->SetCheck(1); cb=
10、(CButton *)GetDlgItem(IDC_RADIO_SOLID); cb->SetCheck(1); cb=(CButton *)GetDlgItem(IDC_RADIO_PEN); cb->SetCheck(1); m_ComboLineValue.SetCurSel(3); m_ForeColor=RGB(255,0,0); m_BkColor=RGB(0,0,255); m_ForeCButton.SetDrawColor(m_ForeColor,TRUE); /设置前背景色按钮的颜色 m_BkCButton.SetDrawColor(m_BkColor,TRUE
11、); m_IsPressed=FALSE; m_nWidth=4; m_nPenStyle=PS_SOLID; return TRUE; / return TRUE unless you set the focus to a control10、 为CDrawGraphicsDlg添加WM_LBUTTONDOWN和WM_LBUTTONUP,WM_MOUSEMOVE消息,其消息处理函数如下:void CDrawGraphicsDlg:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code her
12、e and/or call defaultm_IsPressed=TRUE;SetCursor(m_Hcursor);if (IsDlgButtonChecked(IDC_RADIO_SELF) m_pOld=point;else if (IsDlgButtonChecked(IDC_RADIO_LINE)m_pOld=point;m_PointOrigin=point;else if (IsDlgButtonChecked(IDC_RADIO_RECT)m_pOld=point;m_PointOrigin=point;else if (IsDlgButtonChecked(IDC_RADIO
13、_ROUND)m_pOld=point;m_PointOrigin=point;CDialog:OnLButtonDown(nFlags, point);void CDrawGraphicsDlg:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default m_IsPressed=FALSE;ClipCursor(NULL); /解除鼠标的限定CClientDC dc(this);CPen pen(m_nPenStyle,m_nWidth,m_Fore
14、Color);dc.SelectObject(&pen); if (IsDlgButtonChecked(IDC_RADIO_LINE) /选择的为画直线 dc.SetROP2(R2_NOT); /逆转当前屏幕颜色来画线的绘图方式dc.MoveTo(m_PointOrigin);dc.LineTo(m_pOld);/擦去上一次的临时线dc.SetROP2(R2_COPYPEN);/缺省绘图模式,像素为画笔颜色dc.MoveTo(m_PointOrigin);dc.LineTo(point);/绘制固定线 else if (IsDlgButtonChecked(IDC_RADIO_REC
15、T) /选择的为画矩形 dc.SelectObject(GetStockObject(NULL_BRUSH);/选择空话刷 dc.SetROP2(R2_NOT); CRect Oldrect(m_PointOrigin,m_pOld); dc.Rectangle(&Oldrect); /去除之前的矩形绘图 dc.SetROP2(R2_COPYPEN); CBrush brush(m_BkColor); dc.SelectObject(&brush); /画这次的矩形 if (IsDlgButtonChecked(IDC_RADIO_NULL) /如果选择无填充的话,使用空画刷
16、dc.SelectObject(GetStockObject(NULL_BRUSH); CRect Nowrect(m_PointOrigin,point); dc.Rectangle(&Nowrect); if (IsDlgButtonChecked(IDC_RADIO_GRADIENT)/如果选择渐变的话,调用渐变函数 DrawGradient(dc.GetSafeHdc(),Nowrect,m_ForeColor,m_BkColor,1); else if(IsDlgButtonChecked(IDC_RADIO_ROUND)/如果选择绘制椭圆 dc.SelectObject(G
17、etStockObject(NULL_BRUSH); dc.SetROP2(R2_NOT); CRect Oldrect(m_PointOrigin,m_pOld); dc.Ellipse(&Oldrect); dc.SetROP2(R2_COPYPEN); CBrush brush(m_BkColor); dc.SelectObject(&brush); if (IsDlgButtonChecked(IDC_RADIO_NULL) dc.SelectObject(GetStockObject(NULL_BRUSH); CRect Nowrect(m_PointOrigin,p
18、oint); if (IsDlgButtonChecked(IDC_RADIO_GRADIENT)/如果选择渐变的话,调用渐变函数 DrawGradient(dc.GetSafeHdc(),Nowrect,m_ForeColor,m_BkColor,1); dc.Ellipse(&Nowrect); InvalidateMyRect();/刷新工具区CDialog:OnLButtonUp(nFlags, point);void CDrawGraphicsDlg:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message
19、 handler code here and/or call defaultif (m_IsPressed&&point.x>205)/如果鼠标移动位置到达画板区CRect rect;m_Graphics.GetClientRect(&rect);m_Graphics.ClientToScreen(&rect); ClipCursor(rect);/限定光标在指定矩形CClientDC dc(this);if (m_IsPressed&&IsDlgButtonChecked(IDC_RADIO_SELF)/如果选择了涂鸦CPen pen(m
20、_nPenStyle,m_nWidth,m_ForeColor); /创立画笔dc.SelectObject(&pen); /选入画笔dc.MoveTo(m_pOld);dc.LineTo(point);/绘制轨迹m_pOld=point;/将当前点设置为旧点 else if(m_IsPressed&&IsDlgButtonChecked(IDC_RADIO_LINE)/如果选择了直线dc.SetROP2(R2_NOT);/逆转当前屏幕颜色来画线的绘图方式dc.MoveTo(m_PointOrigin);dc.LineTo(m_pOld); /擦去上一次的线 dc.Mo
21、veTo(m_PointOrigin);dc.LineTo(point);/绘制这一次的临时线m_pOld=point; else if(m_IsPressed&&IsDlgButtonChecked(IDC_RADIO_RECT)/如果选择了矩形 dc.SetROP2(R2_NOT); CPen pen(PS_DOT,1,m_ForeColor); dc.SelectObject(&pen); dc.SelectObject(GetStockObject(HOLLOW_BRUSH); CRect Oldrect(m_PointOrigin,m_pOld); dc.Re
22、ctangle(&Oldrect); CRect Nowrect(m_PointOrigin,point); dc.Rectangle(&Nowrect); m_pOld=point; pen.DeleteObject(); else if (m_IsPressed&&IsDlgButtonChecked(IDC_RADIO_ROUND)/如果选择了圆 CClientDC dc(this); dc.SetROP2(R2_NOT); CPen pen(PS_DOT,1,m_ForeColor); dc.SelectObject(&pen); dc.Sele
23、ctObject(GetStockObject(HOLLOW_BRUSH); CRect Oldrect(m_PointOrigin,m_pOld); dc.Ellipse(&Oldrect); CRect Nowrect(m_PointOrigin,point); dc.Ellipse(&Nowrect); m_pOld=point; pen.DeleteObject(); CDialog:OnMouseMove(nFlags, point);11、 为背景色、前景色、无填充、实线、虚线、边框、清空画板按钮添加按钮单击消息,响应函数如下:void CDrawGraphicsD
24、lg:OnButtonBkcolor() / TODO: Add your control notification handler code hereCColorDialog cdg;if (cdg.DoModal()=IDOK) /调用颜色对话框m_BkColor=cdg.GetColor(); /更改背景色m_BkCButton.SetDrawColor(m_BkColor,TRUE);/更改背景色按钮颜色InvalidateMyRect(); /刷新工具区void CDrawGraphicsDlg:OnButtonForecolor() / TODO: Add your control
25、 notification handler code hereCColorDialog cdg;if (cdg.DoModal()=IDOK)m_ForeColor=cdg.GetColor();m_ForeCButton.SetDrawColor(m_ForeColor,TRUE);InvalidateMyRect();void CDrawGraphicsDlg:OnRadioNull() / TODO: Add your control notification handler code hereif (!IsDlgButtonChecked(IDC_CHECK_BORDER) /无填充时
26、不能也无边框CButton *cb=(CButton *)GetDlgItem(IDC_CHECK_BORDER);cb->SetCheck(1);void CDrawGraphicsDlg:OnRadioSloidline() / TODO: Add your control notification handler code hereCString str9="1px","2px","3px","4px","5px","6px","8px",&q
27、uot;10px","12px"m_ComboLineValue.ResetContent();for (int i=0;i<9;i+)m_ComboLineValue.AddString(stri);m_ComboLineValue.SetCurSel(3);m_nWidth=4; m_nPenStyle=PS_SOLID;InvalidateMyRect();void CDrawGraphicsDlg:OnRadioDottedline() / TODO: Add your control notification handler code herefo
28、r (int i=11;i>0;i-) m_ComboLineValue.DeleteString(i);m_ComboLineValue.SetCurSel(0); m_nWidth=1;m_nPenStyle=PS_DOT;InvalidateMyRect(); void CDrawGraphicsDlg:OnCheckBorder() / TODO: Add your control notification handler code hereif (IsDlgButtonChecked(IDC_CHECK_BORDER) m_nPenStyle=PS_SOLID;elsem_nP
29、enStyle=PS_NULL;if (IsDlgButtonChecked(IDC_RADIO_NULL) /既不能无边框也不能无填充CButton *cb=(CButton *)GetDlgItem(IDC_CHECK_BORDER); cb->SetCheck(1);void CDrawGraphicsDlg:OnRadioClear() / TODO: Add your control notification handler code hereInvalidate(TRUE);12、 为选择画笔宽度的下拉列表添加CBN_SELCHAGE消息,消息处理函数如下:void CDra
30、wGraphicsDlg:OnRadioSloidline() / TODO: Add your control notification handler code hereCString str9="1px","2px","3px","4px","5px","6px","8px","10px","12px"m_ComboLineValue.ResetContent();for (int i=0;i<9;i+)m_ComboLineValue.AddString(stri);m_ComboLineValue.SetCurSel(3);m_nWidth=4;m_nPenStyle=PS_SOLID;InvalidateMyRect();13、 为CDrawGraphicsDlg类添加如下的两个自定义函数InvalidateMyRect以及DrawGradient,分别用来刷新工具区和绘制渐变: void CDrawGraphicsDlg:InvalidateMyRect() /将工具区局部刷新CRect i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 订购木门合同(标准版)
- 宁波一院龙山医院医疗健康集团掌起分院招聘考试真题2024
- 2025年平湖市法院系统招聘真题
- 难点解析人教版八年级物理上册第5章透镜及其应用-凸透镜成像的规律重点解析试卷(附答案详解)
- 综合解析人教版八年级上册物理光现象《光的反射》专题练习试卷(含答案解析)
- 2025金属非金属矿山主要负责人和安管人员考试模拟试题及答案
- 难点解析-人教版八年级物理上册第4章光现象-光的色散重点解析试卷(详解版)
- 2025年数控加工工艺题库及答案
- 考点解析-人教版八年级上册物理物态变化《汽化和液化》专项测试练习题(解析版)
- 2025年住房建设面试试题及答案
- 农行考试历年真题及答案
- 成都市外国语学校八年级上册历史期中试卷及答案-百度文库
- 初中英语时态练习题集及详细解析
- 2025年高中生物高一年级上学期期中考试试卷
- 核桃肽粉生产技术规程(征求意见稿)
- 能力提升课题立项申报书
- 2024-2025学年江苏省泰州市八年级上册(11月)期中数学试题【附答案】
- 体育职称考评课件
- 市场监管局知识产权课件
- 8.2 法治政府 课件 高中政治统编版必修三《政治与法治》
- 宣传通讯报道培训课件
评论
0/150
提交评论