VC++ MFC中点线面的绘制

现在我们在菜单栏上设置4个按钮,点,线,矩形,椭圆。选择后,可以在View窗口中画相应的图形。
1、在菜单栏中增加4个菜单 点(IDM_DOT),线(IDM_LINE),矩形(IDM_RECTANGLE),椭圆(IDM_ELLIPSE)
 
2、分别为每个菜单项添加COMMAND消息响应函数
 
3、设置2个View类的成员变量 UINT m_nDrawType;CPoint m_ptOrigin;用来分别保存画图类型和起始点坐标。
 
4、生成View上的OnLButtonDown和OnLButtonUp消息相应函数;在OnLButtonDown函数中,记录下m_ptOrigin的原始鼠标地址。在OnLButtonUp函数中根据m_nDrawType中的值,进行绘图。插入一下代码:
 CClientDC dc(this);                        /*产生一个window的子区域*/
 switch (m_nDrawType)                       /*判断m_nDrawType的值*/
 {
 case 1:
  dc.SetPixel(m_ptOrigin,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;
 }
 
5、如果我们要让画的图形为红色,内部不被白色重绘的话,在switch前加入一下代码:
 CPen pen(PS_SOLID,2,RGB(255,0,0));            /*创建一个红色的实线CPen对象,宽度为2*/
 dc.SelectObject(&pen);                        /*将画笔对象添加到dc的属性列表里*/
 CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));    /*创建一个空的画刷*/
 dc.SelectObject(pBrush);                      /*将画刷对象添加到dc的属性列表里*/
 
6、添加一个可以设置线宽和线型的对话框
首先,添加一个对话框,IDD_DLG_SETTING,并新建一个 CSettingDlg类。在对话框中添加一个Edit输入框,将id改为IDC_LINE_WIDTH,和属性为 public:UINT 的成员变量m_nLineWidth相关联。在View类中也添加一个 private: UINT m_nLineWidth 的成员变量。在添加一个Group Box,添加3个Radio Button,分别叫实线、虚线、点线。注意,将第一个“实线”的属性页中,把group选择。用类向导将IDC_RADIO1和m_nLineStyle相关联。在View类中建2个成员变量
public:
UINT m_nLineWidth;
int m_nLineStyle;
在CSettingDlg类的构造函数中,将以上两个变量初始化为0;
在View中新建一个IDD_DLG_SETTING窗体的ONSETTING窗体相应函数,加入代码:
 CSettingDlg dlg;
 dlg.m_nLineWidth=m_nLineWidth;        /*将原先view类中保存的线宽参数取回。否则会因为每次打开对话框而令m_nLineWidth初始化为0*/
dlg.m_nLineStyle=m_nLineStyle;         /*原因同上*/
 if (IDOK==dlg.DoModal())
 {
  m_nLineWidth=dlg.m_nLineWidth;
  m_nLineStyle=dlg.m_nLineStyle;
 }
并在5中的代码 CPen pen(PS_SOLID,2,RGB(255,0,0)); 改为 CPen pen(m_nLineStyle,m_nLineWidth,RGB(255,0,0));
 
7、通过一个颜色对话框来设置图形的颜色
可以在菜单栏中增加一栏,命令相应为弹出一个颜色对话框。在view中添加一个private: COLORREF m_clr;成员变量来保存颜色设置。在菜单的命令相应函数中代码如下:
void CGraphicView::OnColor()
{
 CColorDialog c_dlg;
 c_dlg.m_cc.Flags |= CC_FULLOPEN | CC_RGBINIT;    /*这里注意要和Flags的初始值相或,否则因为覆盖了原来的初始值而产生错误。如果要对颜色进行初始化设置,则必须添加CC_RGBINIT参数,否则初始化无效,默认为黑色。CC_FULLOPEN参数为打开时默认全部展开颜色对话框。*/
 c_dlg.m_cc.rgbResult=m_clr;
 if (IDOK==c_dlg.DoModal())
 {
  m_clr=c_dlg.m_cc.rgbResult;        /*rgbResult为返回的颜色*/
 }
}
 
8、用用户所选择的字体样式将字体的名字在view中显示。
在view中添加两个成员变量
private:
 CString m_strFontName;
 CFont m_font;
在菜单中添加一个“字体”项,在菜单的消息相应函数中代码如下:
void CGraphicView::OnFont()
{
 CFontDialog fdlg;
 if (IDOK==fdlg.DoModal())                /*判断是否选择OK按钮*/
 {
  if (m_font.m_hObject)                   /*判断m_font对象是否已被创建*/  
   m_font.DeleteObject();                 /*如果被创建就删除对象*/
  m_font.CreateFontIndirect(fdlg.m_cf.lpLogFont);    /*根据对话框中选择的字体创建*/
  m_strFontName=fdlg.m_cf.lpLogFont->lfFaceName;     /*将选择的字体名称复制给变量*/
  Invalidate();                           /*将客户区域View设置为无效*/
 }                                        /*直到窗口发生重绘*/
}
在窗口的OnDraw事件中,添加如下代码:
 pDC->SelectObject(&m_font);              /*先设置区域的字体对象*/
 pDC->TextOut(0,0,m_strFontName);         /*在view窗体左上角显示字体*/
 
9、在6中增加一个预览区域
添加一个Group Box区域ID改为IDC_SAMPLE,为EDIT添加一个OnChange消息响应函数,为三个Radio Button添加OnClick消息响应函数。都加上一下代码:
Invalidate();    //所有处理都交由OnPaint消息统一处理
增加一个OnPaint消息响应函数,代码如下:
void CSettingDlg::OnPaint()
{
 CPaintDC dc(this); // device context for painting
 UpdateData();      /*升级对话框。不写这句,将会发现预览不会变*/
 CPen pen(m_nLineStyle,m_nLineWidth,RGB(255,0,0)); /*首先创建一个画笔*/
 dc.SelectObject(&pen);    /*将画笔元素放到绘图设备中*/
 CRect rect;
 GetDlgItem(IDC_SAMPLE)->GetWindowRect(&rect); /*创建一个矩形,将预览区域的
               值赋给矩形*/
 ScreenToClient(&rect);       /*此矩形是以屏幕左上角为原点
               的,需要转化为对话框的坐标*/
 dc.MoveTo(rect.left+20 , rect.top+rect.Height()/2); /*起点*/
 dc.LineTo(rect.right-20 , rect.top+rect.Height()/2);/*画线*/
}
如果想预览是也能看到自定义的颜色,需要在对话框属性中添加一个 public: COLORREF m_clr,成员变量。在view类设置颜色对话框时,将view类中的m_clr复制给设置对话框下的m_clr,即可。
 
 

你可能感兴趣的:(程序开发)