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,黑色;