
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CRect a,b;
int w=160;
int h=40;
GetClientRect(&a);
b.left=(a.Width()-w)/2;
b.top=(a.Height()-h)/2;
b.right=b.left+w;
b.bottom=b.top+h;
pDC->Rectangle(b);
pDC->TextOut(b.left+10,b.top+10,"同舟共济、自强不息!");
}
【例2.3】编写一个程序,绘制如图所示的-2π~2π之间的sin 曲线。
因为需要使用sin() 函数,所以在TEST.CPP 的开始添加文件包含命令。
5
#include "math.h"
程序代码:
…………………………………………………………
void CTESTView::OnDraw(CDC* pDC)
{ CTESTDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CRect rect;
GetClientRect(rect);
int x0=rect.Width()/2;
int y0=rect.Height()/2;
pDC->MoveTo(20,y0);
pDC->LineTo(rect.Width()-20,y0);
pDC->MoveTo(x0,20);
pDC->LineTo(x0,rect.Height()-20);
double step=3.14159/100;
for(int i=-200;i<200;i++ )
pDC->SetPixel(x0+(i/300.0)*rect.Width()/2,y0-sin(step*i)*rect.Height()/4,RGB(255,0,0));
}
…………………………………………………………
去掉窗口的“无标题”及设置新标题
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.style &=~FWS_ADDTOTITLE; //去掉无标题
m_strTitle="绘制sin曲线"; //设置新标题
return TRUE;
}
画笔和画刷
自定义画笔
CPen 是MFC 中的一个类,它封装了一个Winndows GDI 画笔,并提供了用于操作画笔的若干函数。画笔的创建和使用过程一般为:
CPen pen, *oldpen; // 定义画笔pen 和指向画笔的指针oldpen
pen.CreatePen(PS_SOLID,3,RGB(255,0,0)); // 创建一支红色能画实线 3 号粗细
的画笔
oldpen=pDC->SelectObject(&pen); // 选用新的画笔pen ,让oldpen指向
旧的画笔
pDC->MoveTo(10,10);
6
pDC->LineTo(50,50);
pDC->SelectObject(oldpen); // 恢复使用旧的画笔说明:
(1)CreatePen() 是CPen 的成员函数,用于创建画笔。其使用形式为:
BOOL CreatePen( int nPenStyle, int nWidth, COLORREF crColor );
其中:nPenStyle 为所画线的样式,其取值见表;nWidth 线的宽度;crColor 为线的颜色。
(2)SelectObject() 是CDC 类的成员函数,其作用是将一个新的GDI 对象选入到设备环境中,新选用的对象取代原来的对象,然后返回指向原对象的指针。函数原型为:CPen* SelectObject( Cpen* pPen ); // 选用新的画笔
Cbrush* SelectObject( Cbrush* pBrush ); // 选用新的画刷
virtual Cfont* SelectObject( Cfont* pFont ); // 选用新的字体
Cbitmap* SelectObject( Cbitmap* pBitmap ); // 选用新的位图
自定义画刷
画刷是用来填充图形的工具。CBrush 是MFC 中的一个类,它封装了一个Windows
GDI 画刷,并提供了用于操作画刷对象的若干方法。画刷的创建和使用过程一般为:CBrush brush; // 定义画刷对象brush
brush.CreateHatchBrush(HS_CROSS,RGB(0,255,0)); // 构造绿色十字线风格的
画刷
pDC->SelectObject(&brush); // 选择一个新的画刷
pDC->Ellipse(100,10,200,110); // 用新的画刷画圆
说明:
(1)CreateHatchBrush () 是CBrush 的成员函数,用于创建画刷。其使用形式为:
BOOL CreateHatchBrush(int nIndex , COLORREF crColor );
其中:nIndex 指定了阴影风格,其取值见表;crColor 为画刷的颜色。
(2)创建画刷的另一个函数是CreateSolidBrush() ,其作用是创建用单一颜色填充的
画刷。其函数原形为:
BOOL CreateSolidBrush(COLORREF crColor );
7
【例2.4】编写一个程序,输出如图所示的图形。
…………………………………………………………
void CTESTView::OnDraw(CDC* pDC)
{ CTESTDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CPen pen,*oldpen;
pen.CreatePen(PS_SOLID,3,RGB(255,0,0));
oldpen=pDC->SelectObject(&pen);
pDC->MoveTo(10,10);
pDC->LineTo(100,100);
pDC->Ellipse(100,10,200,110);
Cbrush brush;
brush.CreateHatchBrush(HS_CROSS,RGB(0,255,0));
pDC->SelectObject(&brush);
pDC->Ellipse(220,10,320,110);
pDC->SelectObject(oldpen);
pDC->MoveTo(320,100);
pDC->LineTo(410,10);
pen.DeleteObject();//释放画笔资源
brush.DeleteObject();
}
…………………………………………………………
位图处理
CBitmap 是MFC 中的一个类,它封装了Winndows GDI 的位图处理,其成员函数主要是装载和操作位图。通过一个实例说明显示位图的一般过程。
【例2.5】编一程序显示Windows 主目录中的Soap Bubbles.bmp ,如图所示。
(1)导入位图
导入位图就是把存放在磁盘上的位图文件作为资源导入到应用程序中,方法是:
选择“插入| 资源”命令,在弹出的“插入资源”对话框中,选定“Bitmap ”,然后选择“导入”命令导入Soap Bubbles.bmp 。
(2)装载位图
装载位图就是把应用程序位图资源装载到一个Cbitmap 对象中。
8
CBitmap b;
b.LoadBitmap(IDB_BITMAP1); //LoadBitmap 将位图资源装载到CBitmap 对象
(3)读取位图信息
BITMAP bm; // 说明bm 为BITMAP 结构类型的变量
b.GetBitmap(&bm); // 把位图的大小等信息读入bm 中
int w=bm.bmWidth; // 把位图的宽度赋给w
int h=bm.bmHeight; // 把位图的高度赋给h
(4)构造内存设备环境,并将位图装入该设备环境
CDC m;
m.CreateCompatibleDC(NULL);
m.SelectObject(&b);
(5)将位图从内存设备环境复制到真正的设备环境中
pDC->StretchBlt(0,0,(int)w*f,(int)h*f,&m,0,0,w,h,SRCCOPY);
说明:
BitBlt 是CDC 类的成员函数,用于复制位图到真正的设备环境中。其函数原型为:BOOL BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop );
其中:(x,y) 为位图显示区域左上角的坐标;nWidth 和nHeight 是显示区域的宽度和高度;pSrcDC 指向内存设备环境;(xSrc, ySrc) 为原图欲显示区域左上角的坐标;dwRop 指定复制方式,常用值为SRCCOPY ,表示按原图复制。
…………………………………………………………
void CMyView::OnDraw(CDC* pDC)
{ CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CBitmap b;
b.LoadBitmap(IDB_BITMAP1);
BITMAP bm;
9
b.GetBitmap(&bm);
int w=bm.bmWidth;
int h=bm.bmHeight;
CDC m;
m.CreateCompatibleDC(NULL);
m.SelectObject(&b);
pDC->StretchBlt(0,0,w/2,h/2,&m,0,0,w,h,SRCCOPY);
}
…………………………………………………………
2.3 定时器
在Visual C++中可以创建一个时钟,以一定的时间间隔发出定时器消息WM_TIMER。利用定时器,可以制作闹钟、动画等。
创建定时器
创建定时器使用SetTimer 函数。其一般形式为:
UINT SetTimer(UINT nIDEvent , UINT nElapse , void * lpfnTimer ) 说明:
(1)nIDEvent: 定时器标识,任何一个非0 整数
(2)nElapse :时间间隔,单位毫秒
(3)lpfnTimer :一般设置为NULL ,表示WM_TIMER 消息加入应用程序的消息队列,由CWnd 类对象处理WM_TIMER 消息。
撤销定时器
撤销定时器使用KillTimer 函数。其一般形式为:
BOOL KillTimer int nIDEvent );
说明:nIDEvent 为撤销的定时器标识。
【例2.6】用定时器控制蝴蝶在窗口中飞舞,如图所示。
(1)在视图类中定义数据成员
public:
int w,h,I; // 变量w 存放位图宽度,h 存放高度,I 控制位图的交替
10
CBitmap b1,b2; // 说明两个存放位图的CBitmap 对象
(2)在视图类构造函数分别装载两幅图到CBitmap 对象
CTESTView::CTESTView()
{
// TODO: add construction code here
I=0;
b1.LoadBitmap(IDB_BITMAP1);
BITMAP BM;
b1.GetBitmap(&BM);
w=BM.bmWidth;
h=BM.bmHeight;
b2.LoadBitmap(IDB_BITMAP2);
}
(3)单击左键创建定时器,定时器标识为1 ,以200ms 的时间间隔发出定时器消息。
void CTESTView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
SetTimer(1,200,NULL);
CView::OnLButtonDown(nFlags, point);
}
(4)每隔200ms 执行视图的定时器消息处理函数。
void CTESTView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
百度搜索“70edu”或“70教育网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,70教育网,提供经典行业范文MFC编程基础 2 文档_视图结构应用程序(2)在线全文阅读。
相关推荐: