mfc对话框画三维矩阵
建立一个简单地画直线的MFC单文档对话框并实现在对话框里面画直线

建立一个简单地画直线的MFC单文档对话框并实现在对话框里面画直线在MFC单文档应用程序中创建一个对话框窗口并实现在对话框内画直线的过程如下:1.创建MFC单文档应用程序- 在 Visual Studio 中创建一个新的 MFC 单文档应用程序项目。
选择"对话框"作为应用程序类型。
-设置应用程序名称和位置,然后单击"完成"创建项目。
2.设置对话框窗口- 在对话框中添加一个自定义控件。
选择"工具箱"中的"Picture Control"控件,拖动到对话框上。
- 选中图片控件,右键单击并选择"属性"。
更改 ID 为IDC_DRAW_AREA,并将 Border 属性设置为 None。
-拖动控件大小以适应窗口布局,并保存对话框。
3.修改对话框类- 打开对话框类的头文件(例如 CMyDialog.h),添加一个标志变量来跟踪鼠标左键按下的状态:```cppBOOL m_bDrawing;```- 在 CMyDialog.cpp 文件中添加以下消息映射函数:```cppBEGIN_MESSAGE_MAP(CMyDialog, CDialogEx)ON_WM_LBUTTONDOWNON_WM_LBUTTONUPON_WM_MOUSEMOVEEND_MESSAGE_MAP```-在头文件中声明回调函数```cppafx_msg void OnLButtonDown(UINT nFlags, CPoint point);afx_msg void OnLButtonUp(UINT nFlags, CPoint point);afx_msg void OnMouseMove(UINT nFlags, CPoint point);```4.实现画线功能- 在 CMyDialog.cpp 文件中实现 OnLButtonDown 函数,该函数用于开始画线:```cppvoid CMyDialog::OnLButtonDown(UINT nFlags, CPoint point)m_bDrawing = TRUE;CClientDC dc(this);dc.MoveTo(point);}```- 实现 OnLButtonUp 函数,该函数用于结束画线:```cppvoid CMyDialog::OnLButtonUp(UINT nFlags, CPoint point) m_bDrawing = FALSE;}```- 实现 OnMouseMove 函数,该函数用于动态绘制线段:```cppvoid CMyDialog::OnMouseMove(UINT nFlags, CPoint point) if (m_bDrawing)CClientDC dc(this);dc.LineTo(point);}}5.更新对话框消息映射```cppafx_msg void OnPaint(;afx_msg BOOL OnEraseBkgnd(CDC* pDC);```6重写重绘和擦除背景函数- 在 CMyDialog.cpp 文件中添加以下代码来重绘对话框:```cppvoid CMyDialog::OnPaintCPaintDC dc(this); // 用于在对话框上绘制//TODO:在此处添加您的消息处理程序代码}```-添加以下代码来防止对话框背景擦除:```cppBOOL CMyDialog::OnEraseBkgnd(CDC* pDC)return TRUE;}7.运行程序-单击“开始调试”(F5)以运行应用程序。
mfc创建对话框的基本步骤

mfc创建对话框的基本步骤创建MFC对话框的步骤如下:1. 新建MFC项目。
在创建项目时,选择visual c++选项卡,然后选择MFC。
在右侧选择MFC应用程序,并在下方填写项目名称。
2. 选择应用程序类型。
在创建项目的过程中,你需要选择应用程序类型。
你可以选择单文档或基于对话框的应用程序类型。
以基于对话框的应用程序为例。
3. 添加对话框。
右键点击“Resource Files”,然后选择“Add Resource”。
在弹出的对话框中,选择“Dialog”,然后点击“New”。
这将在资源视图中创建一个新的对话框。
4. 给新的对话框重写ID。
右键点击新创建的对话框,选择“属性”,在属性页中修改IDD为所需的ID,例如IDD_EXEC。
5. 为模态对话框添加类。
右键点击选中的对话框,然后选择“添加类”。
在弹出的对话框中,输入类的名称,然后点击“确定”。
这将为对话框创建一个新的类。
6. 添加控件。
在对话框编辑器中,你可以直接从工具箱里拖动控件到对话框上。
例如,你可以拖动按钮控件到对话框上。
7. 添加事件处理程序。
对于每个添加的控件,你都可以为其添加事件处理程序。
你可以通过右键点击控件,然后选择“添加事件处理程序”来添加事件处理程序。
在弹出的对话框中,选择相应的事件(例如单击事件),然后在右侧的代码编辑器中编写事件处理程序。
8. 运行对话框。
在完成对话框的编辑后,你可以运行对话框来测试其功能。
你可以通过点击工具栏上的“启动”按钮或按F5键来启动应用程序。
这些步骤可以帮助你创建一个基本的MFC对话框。
当然,具体的实现方式还需要根据你的需求进行调整和修改。
MFC画图程序步骤

MFC画图程序步骤MFC(Microsoft Foundation Class)是一种用于开发Windows应用程序的C++类库。
在MFC中,我们可以使用GDI(Graphics Device Interface)来创建和操作图形。
下面是使用MFC创建一个简单的画图程序的步骤。
步骤1:创建一个新的MFC项目首先,打开Visual Studio并选择创建一个新的项目。
在项目类型中,选择Visual C++ -> MFC,然后选择MFC应用程序类型。
输入项目名称并选择保存的位置。
在应用程序类型中,选择“单文档”或“多文档”视图,具体根据你的需求而定。
点击“确定”按钮创建项目。
步骤2:设计用户界面在MFC应用程序中,用户界面是通过对话框资源来设计的。
在资源视图中,双击IDD_DIALOG(或其他对话框资源)以打开对话框编辑器。
在对话框编辑器中,你可以添加按钮、文本框、菜单等控件来设计你的用户界面。
在画图程序中,你可以添加一个画布控件来显示绘制的图形。
步骤3:添加绘图功能在MFC中,你可以使用GDI来进行绘图操作。
打开你的对话框类的头文件(例如,CMyDialog.h),添加以下头文件引用:#include <afxwin.h>#include <afxext.h>#include <afxdisp.h>在对话框类的源文件(例如,CMyDialog.cpp)中,添加以下代码来处理绘图操作:```void CMyDialog::OnPaint(){CPaintDC dc(this); // 用于绘制的设备上下文// 在这里进行绘图操作dc.Rectangle(100, 100, 200, 200); // 绘制一个矩形dc.Ellipse(300, 100, 400, 200); // 绘制一个椭圆}```步骤4:处理绘图事件在对话框类的消息映射中添加对绘图事件的处理。
MFC框架下三维场景的绘制与交互控制

软 什 导 刊
8 t f 0fWa CGuie d
Vo . ON 0 3 11 .
M a . Ol r2 l
M F C框 架 下 三 维 场 景 的 绘 制 与 交 互 控 制
朱 丽华 , 芦 娜
( 阳 工 学 院 计 算 机 科 学 与 信 息 工 程 学 院 ,河 南 安 阳 4 5 0 ) 安 5 0 0
1 创 建 项 目
在 VC环 境 下 用 O・ n p GL 函 数 库 绘 制 图 像 , 要 在 e 需 VC里 导 入 Op n 的头 文 件 、 态 链 接 文 件 等 。将 gu . e GI 静 lt
h放 到 … \ irs f Viu l tdo VC 8 I cu e GI M co o t s a u i\ 9 \ n ld \ 目 S 录 下 , gu 3 . i 放 到 … \M i o o tViu lS u i \ 将 lt2 1 b c sf r s a tdo
2 系 统 初 始 化
( ) 开 ClsW i r , 择 Ctsb l e 类 , 下 述 1打 as z d 选 a et al w Vi 为
始 化 地 球 参 数 函 数 v i nt ln t ( 及 B od I i a es ) P 00L Re d r n e—
Sc n ( BOOL t p x l r t v i e e )、 Se u Pi e Fo ma ( o d)、 o d Se Lo ia - v i t gc l
摘 要 : 过 一 个 实例 , 述 了在 MF 通 讲 C框 架下 使 用 Opn 函数 来 快 速 构 建 一 个 可 以 交换 控 制 的 三 维 球 体 。MF eGI C
MFC如何给对话框贴图并把对话框上面控件背景设置成透明

dc.StretchBlt(0,0,rect.Width(),30,&memDC,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY); memDC.SelectObject( pBmpOld );
bmp.DeleteObject();//释放bitmap对象相关的资源 memDC.DeleteDC();//释放兼容DC }
请您及时更换请请请您正在使用的模版将于2周后被下线请您及时更换
MFC如 何 给 对 话 框 贴 图 并 把 对 话 框 上 面 控 件 背 景 设 置 成 透 明
一、给对话框贴图步骤如下: 当前对话框类:CMyDlg 当前对话框模式:None 1、添加WM_PAINT消息(void CMyDlg::OnPaint()) 2、在Opaint函数内添加如下代码: void CMyDlg::OnPaint() { CPaintDC dc(this); // device context for painting CRect rect; GetClientRect(&rect);//获取当前窗口客户区域大小
bmp.LoadBitmap(IDB_BITMAP_TITLE); //加载BITMAP资源 BITMAP bitmap; bmp.GetBitmap(&bitmap); pBmpOld=memDC.SelectObject(&bmp); //把兼容DC中的图片存放到就的BITMAP中 dc.SetStretchBltMode(STRETCH_HALFTONE);//设置保留彩色位图中的颜色
CDC memDC;//兼容DC CBitmap bmp; //保存图片 memDC.CreateCompatibleDC(&dc);//创建兼容DC bmp.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());//建与指定的设备环境相关的设备兼容的位图 CBitmap *pBmpOld = memDC.SelectObject(&bmp);//把兼容DC指定到设备上下文环境 //在兼容DC上指定一个纯颜色填充给定矩形区域 memDC.FillSolidRect(4, 30, rect.Width()-8, rect.Height()-34, RGB(255, 255, 255)); memDC.FillSolidRect(0, 30, 4, rect.Height()-34, RGB(3, 102, 160)); memDC.FillSolidRect(0, rect.bottom-4, rect.Width(), 4, RGB(3, 102, 160)); memDC.FillSolidRect(rect.right-4, 30, 4, rect.Height()-34, RGB(3, 102, 160)); //源设备环境区域中的像素进行位块转换,以传送到兼容DC设备环境上 dc.BitBlt(0,0,rect.Width(),rect.Height(),&memDC,0,0,SRCCOPY); memDC.SelectObject( pBmpOld );//把旧的图片数据指定到兼容DC中 bmp.DeleteObject();//释放所有与该对象有关的系统资源
实验二结合MFC与OpenGL实现三维应用程序的显示

实验二结合MFC与OpenGL实现三维应用程序的显示1.实验目的●熟悉OpenGL的编程环境设置●熟悉MFC的基本编程框架●MFC与OpenGL混合编程的设置●OpenGL中基本图元的绘制2.实验内容●创建MFC+OpenGL的编程环境●利用三角形和四边形等基本图元绘制底面圆圆心在坐标原点,半径为r,高为h,方向沿z轴方向的圆柱3.实验指导3.1MFC应用程序框架在Visual C++ 2.0以后的版本中,Microsoft公司推出了MFC(Microsoft Foundation Class)类库。
MFC类库是用来编写Windows程序的C++类集。
使用MFC类库,可以简化应用程序的开发,从而缩短开发周期,而且代码的可靠性和可重用性也大大提高。
3.1.1MFC应用程序的文档/视图结构概述MFC提供了一个典型且实用的基于文档与视图的应用程序框架模板,按照其应用程序生成向导的导引步骤(MFC AppWizard)就可以创建一个基于文档/视图结构的MFC应用程序框架。
在此框架的基础上,设计和插入相关的对象,就可以实现交互式的用户界面、几何模型的管理和操作、图形图像的显示,以及其他各种专业功能。
在MFC的文档/视图结构的应用程序框架中,文档类和视图类是成对出现的。
文档用于管理应用程序的数据;而视图用于显示文档中的数据,并处理与用户的交互信息。
MFC通过文档类和视图类的划分,使数据的存储和显示既相对独立又相互关联。
在MFC所提供的框架结构中,文档与视图的关系可以由图0.1简要表示。
MFC中的视图和文档是由视图类(CView Class)和文档类(CDocument Class)分别表示的。
视图类可以调用其本身的成员函数GetDocument(),获得一个指向文档类的指针,从而能够访问文档类中的数据。
例如:在视图类中的OnDraw()函数中,视图类通过调用GetDocument()函数获得一个指向文档累的指针,然后通过这个指针获取文档类中的数据,并使用CDC类(负责处理应用程序显示设备接口的MFC类)中的函数将这些数据绘制在视图窗口中。
VC-6.0-下MFC基于对话框-绘制图形

附录表一、具体步骤:1、选择菜单栏的“新建”,选择MFC项目名为DrawGraphics,并设置为基于对话框的项目,如图-1、图-2所示;图-1图-22、按下键盘上的Ctrl+W键,调出类向导,选择“Add Class”,并点击“New”添加一个颜色按钮类CColorButton,继承自CButton类,如图-3所示:图-33、在CColorButton中添加如下成员变量:COLORREF color; //按钮颜色CPoint arrays[4]; //按钮顶点坐标BOOL IsShow; //是否显示按钮BOOL IsPressed; //按钮是否被按下4、右击CColorButton类,选择Add Virtulfunction ,重写其DraItem函数,如图-4,图-5所示:图-4图-55、为其Drawitem函数中添加如下代码:CRect rect;GetClientRect(rect);CDC dc;dc.Attach(lpDrawItemStruct->hDC);arrays[0]=CPoint(rect.left,rect.top);arrays[1]=CPoint(rect.right,rect.top);arrays[2]=CPoint(rect.right,rect.bottom);arrays[3]=CPoint(rect.left,rect.bottom);//设置背景透明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(arrays[0]);for(int i=1;i<4;i++){dc.LineTo(arrays[i]);}dc.LineTo(arrays[0]);}else{CPen pen(PS_DASHDOTDOT,2,color);dc.SelectObject(&pen);dc.MoveTo(arrays[0]);for(int i=1;i<4;i++){dc.LineTo(arrays[i]);}dc.LineTo(arrays[0]);}//绘制按钮文本CString str;GetWindowText(str);dc.SetTextColor(RGB(255-GetRValue(color),255-GetGValue(color),255-GetBValue(color)));dc.DrawText(str,CRect(0,0,rect.right,rect.bottom),DT_CENTER|DT_VCENTER|DT_SINGL ELINE);}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(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::OnLButtonUp(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 线条粗细下拉列表表-19、打开类向导,按图-7所示,为相关控件添加关联成员:10、在CDrawGraphicsDlg 类的OninitDialog 函数中添加初始化代码: BOOL CDrawGraphicsDlg:OnInitDialog() { /*.........省略无关代码...............................................................*/ // TODO: Add extra initialization hereCButton *cb; //设置相关按钮的默认选中状态 cb=(CButton *)GetDlgItem(IDC_RADIO_RECT); cb->SetCheck(1); cb=(CButton *)GetDlgItem(IDC_RADIO_SLOIDLINE); cb->SetCheck(1);IDC_STATIC_LINEEXAMPLE 显示线条粗细的Picture 控件 IDC_CHECK_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 控件)cb=(CButton *)GetDlgItem(IDC_CHECK_BORDER);cb->SetCheck(1);cb=(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);m_IsPressed=FALSE;m_nWidth=4;m_nPenStyle=PS_SOLID;return TRUE; // return TRUE unless you set the focus to a control}10、为CDrawGraphicsDlg添加WM_LBUTTONDOWN和WM_LBUTTONUP,WM_MOUSEMOVE消息,其消息处理函数如下:void CDrawGraphicsDlg:OnLButtonDown(UINT nFlags, CPoint point){// TODO: Add your message handler code here 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_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 defaultm_IsPressed=FALSE;ClipCursor(NULL); //解除鼠标的限定CClientDC dc(this);CPen pen(m_nPenStyle,m_nWidth,m_ForeColor);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_RECT)) //选择的为画矩形{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)) //如果选择无填充的话,使用空画刷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(GetStockObject(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,point);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 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_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.MoveTo(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.Rectangle(&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.SelectObject(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 CDrawGraphicsDlg: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 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)) //无填充时不能也无边框{CButton *cb=(CButton *)GetDlgItem(IDC_CHECK_BORDER);cb->SetCheck(1);}}void CDrawGraphicsDlg:OnRadioSloidline(){// TODO: Add your control notification handler code hereCString str[9]={"1px","2px","3px","4px","5px","6px","8px","10px","12px"};m_ComboLineValue.ResetContent();for (int i=0;i<9;i++)m_ComboLineValue.AddString(str[i]);m_ComboLineValue.SetCurSel(3);m_nWidth=4;m_nPenStyle=PS_SOLID;InvalidateMyRect();}void CDrawGraphicsDlg:OnRadioDottedline(){// TODO: Add your control notification handler code herefor (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;else{m_nPenStyle=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 CDrawGraphicsDlg:OnRadioSloidline(){// TODO: Add your control notification handler code hereCString str[9]={"1px","2px","3px","4px","5px","6px","8px","10px","12px"};m_ComboLineValue.ResetContent();for (int i=0;i<9;i++)m_ComboLineValue.AddString(str[i]);m_ComboLineValue.SetCurSel(3);m_nWidth=4;m_nPenStyle=PS_SOLID;InvalidateMyRect();}13、为CDrawGraphicsDlg类添加如下的两个自定义函数InvalidateMyRect以及DrawGradient,分别用来刷新工具区和绘制渐变:void CDrawGraphicsDlg:InvalidateMyRect() //将工具区部分刷新{CRect invaRect;invaRect.top=0;invaRect.bottom=500;invaRect.left=0;invaRect.right=205;InvalidateRect(invaRect,TRUE);}void CDrawGraphicsDlg:DrawGradient(HDC pDc, const RECT &rect, COLORREF begin, COLORREF end, const int &width){RECT rcstep; //设置每次填充的矩形HBRUSH br; //创建画刷句柄int n,m;float step=0.0;int nred=0,ngreen=0,nblue=0;float red=0.0,green=0.0,blue=0.0;nred=(GetRValue(begin)-GetRValue(end));ngreen=(GetGV alue(begin)-GetGValue(end));nblue=(GetBValue(begin)-GetBValue(end));step=(float)abs(rect.top-rect.bottom)/(float)width;red=nred/(float)step;green=ngreen/(float)step;blue=nblue/(float)step;for (int start=0;start<=step;start++) //一块快绘制矩形{n=min((int)(rect.top+start*width),rect.bottom);m=min((int)(rect.top+(start+1)*width),rect.bottom);::SetRect(&rcstep,rect.left,n,rect.right+1,m);br=CreateSolidBrush(RGB(nred-red*start,ngreen-green*start,nblue-blue*start));//选择笔刷颜色HBRUSH oldbr=(HBRUSH)::SelectObject(pDc,br);FillRect(pDc,&rcstep,br);//用新颜色填充矩形区::SelectObject(pDc,oldbr);DeleteObject(br);}}二、运行结果:1、绘图效果:2、选择颜色对话框以及清空画图板功能:。
用MFC绘制各种数学图形,如sin,cos等

用MFC绘制各种数学图形,如sin,cos等**理工大学C++面向对象课程设计报告院(系):计算机工程学院专业:计算机科学与技术学生姓名:__**班级计算111 学号: 2011070** 题目:设计绘制各种数学图形程序_起迄日期:_2013.6.23~2013.7.5 设计地点:计算机学院机房指导教师: *** 完成日期: 2013 年7月 5 日目录一、需求分析1.选做此课题的目的 (3)2.程序所实现的功能 (3)二、设计内容1.模块图 (3)2.主程序及其主要模块的流程图 (3)3.类图 (4)3.1表达式 (4)3.2 储存运算符的栈 (5)3.3储存运算数的栈 (5)3.4 圆 (5)3.5 椭圆 (6)3.6 三叶玫瑰线 (6)3.7 四叶玫瑰线 (7)3.8 阿基米德螺线 (7)3.9 心形线 (7)4.函数关系图 (8)5.编写程序代码 (9)三、调试分析1.实际完成的情况说明 (12)2.程序的性能分析 (12)3.上机过程中出现的问题及其解决方案 (12)4.程序中可以改进的地方说明 (13)四、用户手册 (13)五、设计总结 (15)六、参考文献 (15)七、附录 (15)一、需求分析1.选作此课题的目的在日常生活中我们常常需要解决一些复杂的数学问题,而这些数学问题的解答往往可以从它的函数图形上很直观、明了的表现出来,这时快捷方便的绘制出该数学函数的图形就显得尤为重要。
所以我们使用Microsoft 提供的MFC 类库来实现数学函数图形的绘制。
2 .程序所实现的功能本程序支持用户输入一般表达式,然后输出其对应的函数图形,例如:一次(二次……)函数,三角函数,双曲余弦,双曲正弦,双曲正切,幂函数,指数函数(以10为底,以e 为底)。
另外,还支持一些供选择的数学图形,例如:圆,椭圆,三叶玫瑰线,四叶玫瑰线,阿基米德螺线,心形线。
二、设计内容1.模块图2. 主程序及主要模块的流程图表达式特殊数学图形圆主界面椭圆三叶玫瑰线阿基米德螺线四叶玫瑰线心形线开始选择图形类型No确定Yes输入表达式或参数图形结束3.类图3.1 表达式CGraphDlgpublic:double Pow(double ,double ); //幂函数求值double Operate(double ,char ,double ); //表达式求值char Precede(char ,char); //判断操作符优先级int In(char ); //判断运算数和运算符void Coordinate(); //求点的集合double Calculate(CString ,double);CGraphDlg(CWnd* pParent = NULL);enum { IDD = IDD_GRAPH_DIALOG };protected:Virtual void DoDataExchange(CDataExchange* pDX); private: ICON m_hIcon;UINT m_num; //点的数量char *m_stop;CPtrArray m_ptrarray; //点的集合变量CComboBox m_type; //图形类型CString m_expression; //表达式3.2存储运算符的栈OPTRpublic:OPTR(); //缺省构造函数int InitOPTR(); //构造一个空栈char GetT op(); //返回栈顶元素int Push(char e); //进栈char Pop(); //出栈virtual ~OPTR(); //析构函数Public:char *base; //栈底指针char *top; //栈顶指针int size; //当前已分配的存储空间3.3存储运算数的栈OPNDpublic:OPND(); //缺省构造函数int InitOPND(); //构造一个空栈double GetTop(); //返回栈顶元素int Push(double e); //进栈double Pop(); //出栈virtual ~OPND(); //析构函数Public:double *base; //栈底指针double *top; //栈顶指针int size; //当前已分配的存储空间3.4 圆circlepublic:afx_msg void OnChangeEdit1();afx_msg void OnChangeEdit2();afx_msg void OnChangeEdit3();afx_msg void OnButton1();circle(CWnd* pParent = NULL);enum { IDD = IDD_DIALOG1 }; Public:double m_x; //圆心横坐标double m_y; //圆心纵坐标double m_r; //半径3.5椭圆ellipsepublic:afx_msg void OnChangeEdit1(); afx_msg void OnChangeEdit2(); afx_msg void OnChangeEdit3(); afx_msg void OnChangeEdit4(); afx_msg void OnButton1(); ellipse(CWnd* pParent = NULL); enum { IDD = IDD_DIALOG2 }; Public:double m_x; //椭圆中心横坐标double m_y; //椭圆中心纵坐标double m_lr; //长轴double m_sr; //短轴3.6 三叶玫瑰线sanyiepublic:afx_msg void OnChangeEdit1(); afx_msg void OnChangeEdit2(); afx_msg void OnButton1(); sanyie(CWnd* pParent = NULL); enum { IDD = IDD_DIALOG3 }; Public:double m_a; //系数adouble m_b; //角度θ3.7 四叶玫瑰线3.8 阿基米德螺线3.9 心形线siye public:afx_msg void OnChangeEdit1();afx_msg void OnChangeEdit2();afx_msg void OnButton1();siye(CWnd* pParent = NULL);enum { IDD = IDD_DIALOG4 }; Public:double m_a; //系数adouble m_b; //角度θajimide public:afx_msg void OnChangeEdit1();afx_msg void OnButton1();ajimide(CWnd* pParent = NULL); enum { IDD = IDD_DIALOG5 }; Public:double m_a; //系数adouble m_b; //角度θxinxingxian public:afx_msg void OnChangeEdit1();afx_msg void OnButton1(); xinxingxian(CWnd* pParent = NULL); enum { IDD = IDD_DIALOG6 }; Public:double m_a; //系数a4.函数关系图CGraphDlg::OnButton1() 类circle类ellipse类sanyie类siye 类ajimide类xinxingxianCGraphDlg::OnDrawing()circle::OnButton1()siye::OnButton1()ellipse::OnButton1()sanyie::OnButton1()ajimide::OnButton1()xinxingxian::OnButton1()CGraphDlg::Coordinate()CGraphDlg::Calculate(CString m_expression,double x)OPTR::Push(char ) CGraphDlg::Precede(char s,char c)CGraphDlg::In(char ch)OPND::GetTop()OPND::Pop()OPTR::GetTop()OPND::Push(double e)OPTR::InitOPTR() OPND::InitOPND()OPTR::GetTop()(箭头代表调用)CGraphDlg::Operate(double,char,double )CGraphDlg::Pow(double, double )5. 编写程序代码1.画坐标轴CClientDC dc(this);CRect rect;GetClientRect(&rect) ;dc.SetMapMode(MM_LOMETRIC) ; //设置映射模式;dc.SetWindowOrg(0,0) ; //设置屏幕窗口原点;dc.SetViewportOrg(CPoint(rect.right/2,rect.bottom/2)) ; //设置视口原点CPen pen1(PS_DOT,1,RGB(100,100,100)); //创建笔,并调整坐标颜色CPen *pOldPen = dc.SelectObject(&pen1); //更改笔并保存旧的笔for(int i=-900;i<=900;i+=50){dc.MoveTo (i,500);dc.LineTo (i,-500);}for(int j=-500;j<=500;j+=50){dc.MoveTo (-900,j);dc.LineTo (900,j);}dc.TextOut (10,500,'y'); //标记y轴dc.TextOut (870,0,'x'); //标记x轴dc.TextOut (0,0,'0'); //标记坐标原点dc.TextOut (-8,510,'^');dc.TextOut (900,25,'>');CPen pen(PS_SOLID,1,RGB(0,0,0));//创建笔,并调整坐标颜色pOldPen = dc.SelectObject(&pen);//更改笔并保存旧的笔dc.MoveTo (-900,0); //横坐标dc.LineTo (900,0);dc.MoveTo (0,-500); //纵坐标dc.LineTo (0,500);}2.选择图形类型//默认是表达式RedrawWindow();m_expression="";UpdateData(FALSE);CString text;m_type.GetWindowText(text);if(text=="圆"){circle d_circle;d_circle.DoModal(); //显示画圆的对话框}else if(text=="椭圆"){ellipse d_ellipse;d_ellipse.DoModal(); //显示画椭圆的对话框}else if(text=="三叶玫瑰线"){sanyie d_sanyie;d_sanyie.DoModal(); //显示画三叶玫瑰线的对话框}else if(text=="四叶玫瑰线"){siye d_siye;d_siye.DoModal(); //显示画四叶玫瑰线的对话框}else if(text=="阿基米德螺线"){ajimide d_ajimide;d_ajimide.DoModal(); //显示画阿基米德螺线的对话框} else if(text=="心形线"){xinxingxian d_xinxingxian;d_xinxingxian.DoModal(); //显示画心形线的对话框}3.根据表达式画出图形for(m_num-=1;m_num>0;m_num--) //从点集合中依次取出点并且相连{dc.MoveTo (((CPoint *)m_ptrarray.GetAt(m_num))->x,((CPoint *)m_ptrarray.GetAt(m_num))->y);dc.LineTo (((CPoint *)m_ptrarray.GetAt(m_num-1))->x,((CPoint *)m_ptrarray.GetAt(m_num-1))->y);}4. 画圆dc.Ellipse((m_x-m_r)*50,(m_y+m_r)*50,(m_x+m_r)*50,(m_y-m_r)*50); //调用Ellipse函数5. 画椭圆dc.Ellipse((m_x-m_lr)*50,(m_y+m_sr)*50,(m_x+m_lr)*50,(m_y-m_sr)*50);//调用Ellipse函数6. 画三叶玫瑰线double x=0,y=0;dc.MoveTo (0,0); //从原点开始画for(double p=-3.14;p<=3.14;p+=0.01) //计算点的同时画线{x=m_a*cos(3*(m_b+p))*cos(p);y=m_a*cos(3*(m_b+p))*sin(p);dc.LineTo(50*x,50*y);dc.MoveTo(50*x,50*y);dc.SelectObject(&pen);}7. 画四叶玫瑰线double x=0,y=0;dc.MoveTo (0,0); //从原点开始画for(double p=-3.14;p<=3.14;p+=0.01) //计算点的同时画线{x=m_a*sin(2*(m_b+p))*cos(p);y=m_a*sin(2*(m_b+p))*sin(p);dc.LineTo(50*x,50*y);dc.MoveTo(50*x,50*y);dc.SelectObject(&pen);}8. 画阿基米德螺线double p=-10;double x=0,y=0;x=m_a*p*cos(p);y=m_a*p*sin(p);dc.MoveTo (x*20,20*y);for( p=-10;p<=10;p+=0.01) //计算点的同时画线{x=m_a*p*cos(p);y=m_a*p*sin(p);dc.LineTo(20*x,20*y);dc.MoveTo(20*x,20*y);dc.SelectObject(&pen);}9. 画心形线double x=0,y=0;dc.MoveTo (0,0); //从原点开始画for(double p=-3.14;p<=3.14;p+=0.01) //计算点的同时画线{x=m_a*(1-cos(p))*cos(p);y=m_a*(1-cos(p))*sin(p);dc.LineTo(50*x,50*y);dc.MoveTo(50*x,50*y);dc.SelectObject(&pen);}三、调试分析1.实际完成的情况说明(完成的功能、支持的数据类型等)本程序支持用户选择数学图形类型并输入相应的参数,然后输出其对应的函数图形。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
mfc对话框画三维矩阵
摘要:
1.MFC 对话框简介
2.三维矩阵概念及表示方法
3.在MFC 对话框中绘制三维矩阵的方法
4.具体实现过程及代码示例
正文:
一、MFC 对话框简介
MFC(Microsoft Foundation Class)是微软提供的一组用于开发Windows 应用程序的类库。
它提供了许多现成的控件和窗口,方便开发者快速构建应用程序。
在本文中,我们将使用MFC 对话框作为基础,实现一个可以绘制三维矩阵的程序。
二、三维矩阵概念及表示方法
三维矩阵是一个具有三个维度的矩阵,可以用来表示空间中的点、向量和矩阵等几何信息。
在数学和物理学等领域,三维矩阵有着广泛的应用。
在计算机图形学中,我们可以通过绘制三维矩阵来实现对三维空间的表示。
三、在MFC 对话框中绘制三维矩阵的方法
要在MFC 对话框中绘制三维矩阵,我们可以使用Windows API 中的图形功能,结合MFC 提供的CDC(Client Device Context)类。
具体步骤如下:
1.创建一个MFC 对话框应用程序,并在对话框窗口中添加一个CDC 对象。
2.重载对话框的OnPaint() 函数,以便在窗口中绘制三维矩阵。
3.在OnPaint() 函数中,使用CDC 对象的GetDC() 方法获取一个设备上下文,以便绘制图形。
4.使用Windows API 中的BitBlt() 或DrawBitMap() 等函数,将三维矩阵的像素数据绘制到对话框窗口中。
四、具体实现过程及代码示例
以下是一个简单的示例,演示如何在MFC 对话框中绘制三维矩阵:
1.首先,创建一个MFC 对话框应用程序,并在对话框窗口中添加一个CDC 对象。
2.在对话框的头文件中,添加以下成员变量和成员函数:
```cpp
// 三维矩阵数据
float matrix[3][3][3] = {
{ {1, 2, 3}, {4, 5, 6}, {7, 8, 9} },
{ {10, 11, 12}, {13, 14, 15}, {16, 17, 18} },
{ {19, 20, 21}, {22, 23, 24}, {25, 26, 27} }
};
// 绘制三维矩阵的函数
void Draw3DMatrix();
```
3.在对话框的源文件中,实现Draw3DMatrix() 函数:
```cpp
void CMyDialog::Draw3DMatrix()
{
CClientDC dc(this);
int width, height;
dc.GetSize(&width, &height);
// 初始化设备上下文
CDC *pDC = dc.GetSafeHdc();
int x, y;
pDC->GetClipBox(&x, &y, &width, &height);
pDC->SetClipBox(0, 0, width, height);
// 绘制三维矩阵
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
for (int k = 0; k < 3; k++)
{
int pixel = (i * 3 + j) * 3 + k;
pDC->SetBkColor(RGB(matrix[i][j][k], 0, 255 - matrix[i][j][k]));
pDC->SetTextColor(RGB(255, 255, 255));
pDC->TextOut(x + j * 50, y + i * 50, _T("0"));
}
}
}
// 释放设备上下文
pDC->Release();
}
```
4.重载对话框的OnPaint() 函数,调用Draw3DMatrix() 函数:
```cpp
void CMyDialog::OnPaint()
{
CPaintDC dc(this);
Draw3DMatrix();
}
```
现在,运行该应用程序,你将看到一个对话框窗口,其中绘制了一个三维矩阵。