MFC之 图形处理 灰度值(圆实现)

MFC有四大类,View类是在框架类之上,所以如果你需要实现画面显示之类的,就只能在VIEW类中响应. 而Doc类是用于存储数据管理的类,他们是关联关系,Doc类储存,View类显示。

另外App类和Doc类都是从CCmdTarget类派生而来,所以只能接收命令消息和控件通知消息,View类与Frame框架类都是从CWnd类派生所以能够接收命令消息和控件通知消息还有windows消息三种消息.
对于三种消息,期响应的顺序是这样的: 首先由框架类接收到该消息,框架类将该消息递交给其子窗口View类,如果View类没有对该消息进行响应,则由View类递交给Doc类,如果Doc类也没有对该消息进行响应,那么它回再次将该消息回交给View类,View类再回交给Frame框架,框架检查自己是否对该消息有相应的处理函数,如果没有则递交给App类,如果App类也没有则由Windows系统自己处理。

下面开始介绍 圆的实现:
step 1 : 创建按钮消息,用于实现圆的显示;
这里写图片描述
这里写图片描述
/*由于我已经做好的代码,所以上面只是显示的是做好的;确定按钮函数OnButtondo()

void CMy456View::OnButtondo()
{
    CMy456Doc* pDoc = GetDocument();  // 关联Doc类
    pDoc->MakeCircle();  //  创建Doc类的函数 MakeCircle()
    Invalidate(FALSE);
}

step 2: CMy456Doc.h 中创建函数,还有声明变量

int PicArray[256*256];   //  显示窗口的大小
void MakeCircle();    //  

CMy456Doc.cpp 在Doc类中实现函数

void CMy456Doc:: MakeCircle()
{
    for(int n = 0; n < 256 * 256; n++)
    {
        PicArray[n] = 0;  // 初始化,画面背景为黑色
    }
    for(int y = 0; y < 256; y++)
    {
        for(int x = 0; x < 256; x++)
        {
            //灰度值0~256, 然后我们要画一个半径为1的圆,后面的-1.0是圆的位置为正中间;
            double xx = ((double)x) * 2.0 / 256 - 1.0;
            double yy = ((double)y) * 2.0 / 256 - 1.0;  
            double rr = sqrt(xx * xx + yy * yy); // 圆半径公式,已经要记得声明 include<match.h>
            if(rr < 0.5)
            {
                PicArray[y * 256 + x]  = 256; //  白色, 有点不理解
            }
            else
            {
                PicArray[y * 256 + 1] = 0;  // 黑, 里面元素数有点理解
            }
        }
    }
}

step 3 CMy456View.cpp 显示图像

void CMy456View::OnDraw(CDC* pDC)
{
    CMy456Doc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;

    // TODO: add draw code for native data here
    for(int y = 0; y < 256; y++)
    {
        for(int x = 0; x < 256; x++)
        {
            int value = pDoc->PicArray[y*256 +x];
            pDC->SetPixel(x, y, RGB(value,value,value));

        }
    }
}

这里写图片描述

初始化的背景是黑色的; 然后圆设置的颜色是255, 白的; 其他为0,黑色;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值