VC++,6.0 MFC设计--- 图形界面

控制用的软件还是很早的vC++ 6.0, 为了先应用,就先在上面设计了,我需要做得很少

目标:做轨迹演示图形界面,轨迹类型--圆,直线

之前上过C语言,做过课设,MFC 方面还是不太会上手,先搜索吧

一个系列有用博文,MFC 绘图函数:

https://blog.csdn.net/eastmount/article/details/53180524

这篇博文是在单文档中进行MFC设计,而我要在基本对话中使用MFC。不过函数都是一样,只是调用的步骤会有不同

结果:图形界面如下

VC++,6.0 MFC设计--- 图形界面_第1张图片

编译运行

VC++,6.0 MFC设计--- 图形界面_第2张图片

使对象在x轴方向走100,y轴走200

VC++,6.0 MFC设计--- 图形界面_第3张图片

然后画圆,半径300,很大,超出了背景,改小,半径200

VC++,6.0 MFC设计--- 图形界面_第4张图片

出现了bug

超出的部分原图像没有清除

mfc在基本对话中擦除原图比较麻烦,用到命令如下

pWnd->Invalidate();
pWnd->UpdateWindow();

首先使窗口变成无效区域,然后再更新窗口,将画的图像显示在上面

出现上面这个问题说明画布外的部分没被更新。基本实现的就这个功能。还有个实时点显示,慢慢探索

添加的功能有

画布背景设置

画出指定大小的图

接下来是程序及相关设置

首先是在类中添加声明,

HBRUSH OnCtlColor(CDC*   pDC,   CWnd*   pWnd,   UINT   nCtlColor);
CColorDlg(CWnd* pParent = NULL);	// standard constructor
CBrush m_brush;

后面要进行MFC美化,调整控件的颜色,设置画刷等

在对话文件中添加控件背景颜色函数

HBRUSH CMy4cableDlg::OnCtlColor(CDC*   pDC,   CWnd*   pWnd,   UINT   nCtlColor)
{
 HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);  
    if(nCtlColor   ==CTLCOLOR_DLG)      //对话框颜色  
      return   m_brush;       //返加绿色刷子    
    if(nCtlColor==CTLCOLOR_STATIC && pWnd->GetDlgCtrlID()==IDC_STATIC)  //静态文本颜色,并且指定控件ID号  
    {  
         pDC->SetTextColor(RGB(255,0,0));  
         pDC->SetBkColor(RGB(191,219,255));     //静态控件的背景颜色设置,这里设置于背景颜色一致,则可以免设置透明  
         //pDC->SetBkMode(TRANSPARENT);    //模式设置透明的话,则忽略静态控件的背景颜色设置,与对话框颜色融合  
         hbr=(HBRUSH)m_brush;  
    }  
    if(nCtlColor==CTLCOLOR_EDIT)    //文本编辑框颜色  
    {  
        pDC->SetTextColor(RGB(0,0,0));   
        //pDC->SetBkColor(RGB(191,219,255));     //静态控件的背景颜色设置  
        pDC->SetBkMode(TRANSPARENT);  
        hbr=(HBRUSH)m_brush;  
    }     
    return hbr; 
}

然后在void CMy4cableDlg::OnPaint() 函数中else后面添加代码

	else
	{
	    CRect   rect;    
            CPaintDC   dc(this);    
            GetClientRect(rect);   
            dc.FillSolidRect(rect,RGB(250,250,250)); 
	    CDialog::OnPaint();
	}

设置了画布的背景色

然后就

                //绘图代码:
		//获取控件DC
		CWnd *pWnd=GetDlgItem(IDC_PAINT);
		CRect rect;
		pWnd->GetClientRect(&rect);
		CDC *pDC=pWnd->GetDC();

		//使static控件区域无效

		pWnd->Invalidate();

		pWnd->UpdateWindow();

		CPen MyPen, *OldPen;   
		MyPen.CreatePen(PS_DASH, 2, RGB(0,200,255)); //虚线 粗2 蓝色  
		OldPen = pDC->SelectObject(&MyPen);        //旧画笔赋值
		pDC->MoveTo(10,20);
		pDC->LineTo(10+int(m_X),20+int(m_Y));

这是绘制直线的代码,CDC中有图形的函数,选择画图控制区域,在基本对话中是在静态文本控件上画图的,因此先选中控件使控件无效,刷新一次窗口,无论之前有没有图像都会留个干净画布,选择合适的笔,RGB是颜色选择,三通道

下面的画圆的

    //选定窗口
        CWnd *pWnd=GetDlgItem(IDC_PAINT);
	CRect rect;
	pWnd->GetClientRect(&rect);
	CDC *pDC=pWnd->GetDC();
	//使static控件区域无效

	pWnd->Invalidate();

	pWnd->UpdateWindow();

        //定义画笔  
       CPen MyPen, *OldPen;   
       MyPen.CreatePen(PS_DASH, 2, RGB(0,0,255)); //虚线 粗2 蓝色  
       OldPen = pDC->SelectObject(&MyPen);        //旧画笔赋值  
  
    /*//画刷  
    CBrush MyBrush, *OldBrush;  
    MyBrush.CreateSolidBrush(RGB(0,200,255));  
    OldBrush = pDC->SelectObject(&MyBrush);  
	*/
    //画圆
	pDC->Ellipse(20, 20,20+int(m_R), 20+int(m_R));
	/*
	//添加文字
	CString str1 = "绘制圆 半径=";  
	CString data;  
    data.Format("%s %f", str1,m_R);  
	pDC->TextOut(80,80,data); 
	*/
	//清除  
    pDC->SelectObject(OldPen);  
    MyPen.DeleteObject();  

画刷相当于填充,这里我注释掉了一段画刷代码和文字注释代码,暂时不需要,想用随时用的

好的到此就结束了,继续完成后面的任务

你可能感兴趣的:(VC++,6.0 MFC设计--- 图形界面)