当前位置:文档之家› 实验七 图形、文本和位图

实验七 图形、文本和位图

实验七图形、文本和位图
一实验内容
练习第7章的例Ex_Draw,Ex_Icon,Ex_Cursor
二实验步骤
例Ex_Draw课程的成绩分布直方图
1.创建工作文件夹Ex_Draw
2.在View类中添加一个成员函数DrawScore,用于根据成绩来绘制直方图,该函数代码
如下:
void CEx_DrawView::DrawScore(CDC *pDC, float *fScore, int nNum)
{
int nScoreNum[]={0,0,0,0,0};
for(int i=0;i<nNum;i++)
{
int nSeg=(int)(fScore[i])/10;
int(nSeg<6)
nSeg=5;
if(nSeg==10)
nSeg=9;
nScoreNum[nSeg-5]++;
}
int nSegNum=sizeof(nScoreNum)/sizeof(int);
int nNumMax=nScoreNum[0];
for(i=0;i<nSegNum;i++)
{
if(nNumMax<nScoreNum[i])nNumMax=nScoreNum[i];
}
CRect rc;
GetClientRect(rc);
rc.DeflateRect(40,40);
int nSegWidth=rc.Width()/nSegNum;
int nSegHeight=rc.Height()/nNumMax;
COLORREF crSeg=RGB(0,0,192);
CBrush brush1(HS_FDIAGONAL,crSeg);
CBrush brush2(HS_BDIAGONAL,crSeg);
CPen pen(PS_INSIDEFRAME,2,crSeg);
CBrush* oldBrush=pDC->SelectObject(&brush1);
CPen *oldPen=pDC->SelectObject(&pen);
CRect rcSeg(rc);
rcSeg.right=rcSeg.left+nSegWidth;
CString strSeg[]={"<60","60-70","70-80","80-90",">=90");
CRect rcStr;
for(i=0;i<nSegNum;i++)
{
if(i%2)
pDC->SelectObject(&brush2);
else
pDC->SelectObject(&brush1);
rcSeg.top=rcSeg.bottom-nScoreNum[i]*nSegHeight-2;
pDC->Rectangle(rcSeg);
if(nScoreNum[i]>0)
{
CString str;
str.Format("%d人",nScoreNum[i]);
pDC->DrawText(str,rcSeg,DT_CENTER|DT_VCENTER|DT_STNGLELINE);
}
rcStr=rcSeg;
rcStr.top=rcStr.bottom+2;
rcStr.bottom+=20;
pDC->DrawText(strSeg[i],rcStr,DT_CENTER|DT_VCENTER|DT_STNGLELINE);
rcSeg.OffsetRect(nSegWidth,0);
}
pDC->SelectObject(oldBrush);
pDC->SelectObject(oldPen);
}
3.在CEx_DrawView::OnDraw中添加下列代码:
Float
fScore[]={66,82,79,74,86,82,67,60,45,44,77,98,65,90,66,76,66,62,83,84,97,43,67,57,60,60,71,74, 60,72,81,69,79,91,69,71,81};
DrawScore(pDC,fScore,sizeof(fScore)/sizeof(float));
例Ex_Icon改变应用程序图标
1.创建工作文件夹Ex_Icon
2.新添4个图标资源,通过图像设备选择对话框,选择small为图标的设备类型,按照下图绘制图标
3.为CmainFrame类添加一个成员函数ChangeIcon,用于切换应用程序的图标。

该函数代码如下:
void CMainFrame::ChangeIcon(UINT nIconID)
{
HICON hIconNew=AfxGetApp()->LoadIcon(nIconID);
HICON hIconOld=(HICON)GetClassLong(m_hWnd,GCL_HICON);
if(hIconNew!=hIconOld)
{
DestroyIcon(hIconOld);
SetClassLong(m_hWnd,GCL_HICON,(long)hIconNew);
RedrawWindow();
}
}
4.在OnCreate函数最后添加计时器设置代码
SetTimer(1,500,NULL);
5.为CmainFrame类添加WM_TIMER的消息映射函数,并增加下列代码
static int icons[]={IDI_ICON1,IDI_ICON2,IDI_ICON3,IDI_ICON4};
static int index=0;
ChangeIcon(icons[index]);
index++;
if(index>3) index=0;
6.添加WM_DESTROY的消息映射函数,并增加下列代码
KillTimer(1);
例Ex_Cursor改变应用程序光标
1.创建工作文件夹Ex_Cursor
2.新建一个Cursor如下图所示
3.为CmainFrame类添加一个成员变量m_hCursor,类型为HCURSOR
4.添加WM_SETCURSOR的消息响应函数,并添加下列代码:
BOOL bRes=CFrameWnd::OnSetCursor(pWnd,nHitTest,message);
if(nHitTest==HTCAPTION)
{
m_hCursor=LoadCursorFromFile("C:\WINDOWS\Cursors\红-橡皮泥人\hand");
SetCursor(m_hCursor);
bRes=TRUE;
}
else if(nHitTest==HTCLIENT)
{
m_hCursor=AfxGetApp()->LoadCursor(IDC_CURSOR1);
SetCursor(m_hCursor);
bRes=TRUE;
}
return bRes;
三实验结果
例Ex_Draw课程的成绩分布直方图
结果如下:
例Ex_Icon改变应用程序图标
如图形成无标题旁边那个图标循环显示四个图标的动态效果
当鼠标移动到标题栏是,光标编程鼠标,当移动到客户区,光标编程IDC_CURSOR1定义的形状
四实验心得
通过本次实验对画图的步骤,图标的动态显示还有光标的切换有了初步的了解,以后还要多加练习。

相关主题