MFC作图过程 中,一些封装好了比较好用的函数

一、

/*

功能:绘制模块边框
参数:
pDC: 绘图指针
*/
bool AlarmMod::drawBackground(CDC *pDC)
{
//灰色
COLORREF colorGray = RGB(200,200,200);
//设置画笔及颜色
CPen pen,*poldpen;
//创建画笔
pen.CreatePen(PS_SOLID,3,colorGray);
//设置画笔
poldpen=pDC->SelectObject(&pen);


//画边框
pDC->MoveTo(xStart,yStart);
pDC->LineTo(xStart,yStart + height);
pDC->LineTo(xStart + width, yStart + height);
pDC->LineTo(xStart + width, yStart);
pDC->LineTo(xStart,yStart);


//返回旧资源
pDC->SelectObject(poldpen);

return true;

}

二、

/*
功能:计算缓冲区的最大值
参数:
dataPtr: 形参,传进来的一般是一个堆内存,或数组
num: 数据个数
*/
bool  calMaxValue(float * dataPtr,const int num)
{
//检查数据合法性
if( dataPtr == NULL)
{
return false;
}
maxValue = 0.0;

//寻找出数据缓冲区中的最大值,并交给maxValue
for(int i = 0; i < num ; i++)
{
if(maxValue < dataPtr[i])
{
maxValue = dataPtr[i];
maxcount=i;
}
}
return true;
}


三、对于一个SDI应用程序,窗口可能会分成几个不同的模块,每个模块我们会新建一个类,把该模块的所有操作都封装在这个类中,

    自然地,这个类中,要涉及到绘图操作,我们添加一个函数 bool draw(CDC *pDC) {……//……}

  这个draw 函数里,可以添加其他更小模块的绘图操作~~例如

bool SXSystem::draw(CDC *pDC) //
{

//画报警信息
alarm.draw(pDC);
//画深度信息
depth.draw(pDC);
//画北岸的纵截面
zsection_n.Draw(pDC);
//画纵截面
zsection.Draw(pDC);
//画船舶界面图
section.Draw(pDC);


return true;
}

在View类的Onpaint 函数(该函数可能时系统已经有的,也可能需要自己添加)中,我们这样去调用:

void CSXS_testView::OnPaint() 
{
CPaintDC dc(this); // device context for painting
……
sxSystem.draw(&dc);
}

这样,整个程序响应View类重绘时,可以得到我们想要的结果  (这样做的好处就是封装,把每一个模块用一个类封装在一起,便于扩展)

你可能感兴趣的:(MFC作图过程 中,一些封装好了比较好用的函数)