VC++ 安装

VC++我基本不用的,平时写C/C++的代码都用Code::Blocks.
VC++基本都是绿色版,下载解压就可以用了,但是在中国,你知道的,下载安装的时候注意一点。(你知道的)
下载解压完,打开

\Microsoft Visual Studio\Common\MSDev98\Bin\MSDEV.EXE
  • 1

正常情况下双击那个文件就可以打开vc++,
但是,却发现下面那个错误。。。。。
这里写图片描述
没错,就是那个错误,查了一下,原来是那个文件有问题,重新下一个替换才可以。好吧,重新去弄。
一番解决之后,终于可以了。
解决方法

开始绘图

打开VC++,新建一个MFC ApWizard(exe)工程,如图这里写图片描述
这里,我将工程取名demo,确定即可。
下面选择单文档,选择完成即可。如图
这里写图片描述

下面就进入了项目。如图。
这里写图片描述
在CDemoView下面找到OnDraw(CDC *pDC)方法,就可以在下面写代码了。

注意

MFC文件 命名有点奇怪,它在每一个类前面都加了一个大写字母C
下面,定位到OnDraw()开始写代码。

pDC->SetPixel(x,y,RGB(255,0,0));
  • 1

上面那行代码的意思是在(x,y)绘制一个红色(RGB(255,0,0))的像素点。
其颜色是根据RGB值来确定的。
下面为了显示效果,绘制一条红色的从(0,0)到(100,100)的线段来看一下效果。
代码如下:

void CDemoView::OnDraw(CDC* pDC)
{
    CDemoDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here

    for(int q=0;q<100;q++)
    {
        pDC->SetPixel(q,q,RGB(255,0,0));
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

效果如下.
这里写图片描述

注意

画图的时候,界面上的坐标,原点在走上角,水平向右是x坐标,竖直向下是y坐标。极大多数程序画图都是这样的,和数学有点不一样,注意区分。
下面画一条水平的线段。
这里写图片描述

下面来画一个正方形吧。
效果如下:
这里写图片描述
代码如下:

void CDemoView::OnDraw(CDC* pDC)
{
    CDemoDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here

    for(int i=0;i<200;i++)//水平的两条边
    {
        pDC->SetPixel(i+100,100,RGB(255,0,0));
        pDC->SetPixel(i+100,300,RGB(255,0,0));
    }
    for(int j=0;j<200;j++)//竖直的两条边
    {
        pDC->SetPixel(100,j+100,RGB(255,0,0));
        pDC->SetPixel(300,j+100,RGB(255,0,0));
    }
}
  •  

下面我们在正方形内画一个绿色的内切圆。
圆的话我们用参数方程来画图。
设圆的圆心为(x0,y0),半径为 r
则参数方程为:

x = x0 + r * cos(sita);
y = y0 + r * sin(sita);
0 <= sita <= 2 * pi;
  •  

注意,要引入math头文件

#include <cmath>
  • 1

下面就可以画圆了,注意 sita 的范围是0 <= sita <= 2*pi,步长为1.0/r
下面就可以画图了。
先看效果:
这里写图片描述
代码:
“`c++
void CDemoView::OnDraw(CDC* pDC)
{
CDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here

for(int i=0;i<200;i++)//水平的两条边
{
    pDC->SetPixel(i+100,100,RGB(255,0,0));
    pDC->SetPixel(i+100,300,RGB(255,0,0));
}
for(int j=0;j<200;j++)//竖直的两条边
{
    pDC->SetPixel(100,j+100,RGB(255,0,0));
    pDC->SetPixel(300,j+100,RGB(255,0,0));
}
int r = 100;
double pi = acos(-1);
for(double s=0;s<2*pi;s+=1.0/r)
{
    int x=200+r*cos(s);
    int y=200+r*sin(s);
    pDC->SetPixel(x,y,RGB(0,255,0));
}
  •  

练习,画出下面图形。
这里写图片描述

这里呢,先把上一讲的联系讲一下。
一般人都用是一个一个的去画,但是那样好麻烦,计算机的有点就是容易处理重复的事情,那就定义成一个画正方形函数吧,每次调用就可以了。

怎么自定义函数呢?
我们先在上次我们建的项目CDemoView那儿右击,选择Add Menber Function 然后我们添加函数返回值及函数描述就可以了。
如图:
这里写图片描述
点击确定,我们就到了函数定义地方,编写函数就可以了
这里写图片描述
编写完我么那就可以在OnDraw 里面调用了。
然后一相同的方法继续编写画圆的方法就可以了

void CDemoView::DrawCircle(int x, int y, int r,int color)
{
    CDC *pDC = GetDC();//获取设备环境
    for(double sita=0;sita<314.0;sita+=1.0/50)
     {
         int xx =x+r*cos(sita);
         int yy =y+r*sin(sita);

之前我们已经可以画出直线和曲线了。但是算法虽容易理解,但是复杂度高,今天就介绍比较流行的DDA画线法,还有,对鼠标进行事件有所响应,即,在画板上,鼠标左键单击,移动至另外一个地方松开,此时在这两个点之间画一条线。

DDA画线

算法代码

void DDA_Line(int x1, int y1, int x2, int y2, int color)
{
    CDC *pDC = GetDC();//获取设备环境
    int  k,i; float x, y, dx, dy;
    k = abs(x2-x1);
    if (abs(y2-y1)>k) 
    {
        k = abs(y2-y1);
    }
    dx = float(x2-x1)/k;
    dy = float(y2-y1)/k;
    x=x1;
    y=y1;
    for (i=0;i<k;i++)
    {
        pDC->SetPixel(x, y, color);
        x = x+dx;
        y = y+dy;
    } 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

网上好多人画图解释说明,这里我就不说了。
下面就是处理鼠标事件

鼠标事件

我们先添加四个成员变量x1,y1,x2,y2表示线段端点坐标
添加完如下图
这里写图片描述
在菜单栏
view(视图) –> 鼠标事件 – >右边Class name 选择CXXXView(注:XXX为你的项目名)–>在Messages:找到WM_LBUTTONDOWN 双击或者先单击,再在右边选择Add Function
最后点击Edit Code
如图
这里写图片描述

这是鼠标单击响应事件函数,我们编辑代码:

void OnLButtonDown(UINT nFlags, CPoint point) 
{
    // TODO: Add your message handler code here and/or call default

    CView::OnLButtonDown(nFlags, point);
    x1 = point.x;
    y1 = point.y;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

按照上面的方法步骤,继续添加鼠标左键松开的响应事件。
同时即可画出线段。

void OnLButtonUp(UINT nFlags, CPoint point) 
{
    // TODO: Add your message handler code here and/or call default

    CView::OnLButtonUp(nFlags, point);
    x2 = point.x;
    y2 = point.y;

    DDA_Line(x1,y1,x2,y2,RGB(255,0,0));
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

效果如下:
这里写图片描述

下面,我们以所画的线段为对角线,画一个矩形。
这个也很简单,自己画个图,就可以写出代码

DDA_Line(x1,y1,x2,y1,RGB(0,255,0));
DDA_Line(x1,y1,x1,y2,RGB(0,255,0));
DDA_Line(x1,y2,x2,y2,RGB(0,255,0));
DDA_Line(x2,y1,x2,y2,RGB(0,255,0));
  • 1
  • 2
  • 3
  • 4

效果如下
这里写图片描述

打完收工。。。

 

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐