MFC day08

目录:
CDC类的使用
绘图对象的使用
1 CDC类的使用
1.1 问题
CDC类是绘图设备类的顶层父类。封装了一般的绘图设备,可以使用CDC创建一般的绘图设备,例如:打印机、显示器等。

CWindowDC类的父类是CDC类,封装的是指定窗口的区域。包括窗口的客户区和非客户区。

CClientDC类的父类也是CDC类,封装的也是指定窗口的区域,但是只包含客户区。

CPaintD类的父类也是CDC类,封装的也是指定窗口的区域,也是只包含客户区。 只能用在WM_PAINT的消息处理函数中。

CMetaFileDC类的父类也是CDC类,与其它DC区别最大,保存绘制命令的DC。保存后,可以通过它重新执行绘制命令绘制图形

1.2 方案
编写一个单文档应用程序,在这个程序中演示各种DC类的使用

1.3 步骤
实现此案例需要按照如下步骤进行。

步骤一:CDC类

创建CDC类对象,在文中显示hello CDC 字符串。代码如下所示:

void CMFCDcView::OnCdc()
{
CDC dc;
dc.CreateDC( “DISPLAY”, NULL, NULL, NULL );
dc.TextOut( 100, 100, “hello CDC” );
dc.DeleteDC( );
}
步骤二:CWindowDC类

创建CWindowDC类对象,在文中显示hello CWindowDC字符串。代码如下所示:

void CMFCDcView::OnCwindowdc()
{
CWindowDC dc( AfxGetMainWnd() );
dc.TextOut( 0, 0, “hello CWindowDC” );
}
步骤三:CClientDC类

创建CClientDC类对象,在文中显示hello CClientDC字符串。代码如下所示:

void CMFCDcView::OnCclientdc()
{
CClientDC dc( this );
dc.TextOut( 0, 0, “hello CClientDC” );
CDC * pDC = GetDC( );
pDC->TextOut( 0, 100, “hello CClientDC” );
ReleaseDC( pDC );
}
步骤四:CPaintDC类

创建CPaintDC类对象,在文中显示hello CPaintDC字符串。代码如下所示:

void CMFCDcView::OnPaint()
{
CPaintDC dc(this); // device context for painting
dc.TextOut( 0, 300, “Hello CPaintDC” );
}
步骤五:CMetaFileDC类

创建CMetaFileDC类对象,绘制出Hello Meta字符串。代码如下所示:

void CMFCDcView::OnCmetafiledc()
{
CMetaFileDC dcMeta;
dcMeta.Create( “c:\meta.dat” );
dcMeta.TextOut( 100, 100, “Hello Meta” );
HMETAFILE hMetaFile = dcMeta.Close();
CClientDC dc( this );
dc.PlayMetaFile( hMetaFile );
DeleteMetaFile( hMetaFile );
}
1.4 完整代码
本案例的完整代码如下所示:

void CMFCDcView::OnCdc()
{
CDC dc;
dc.CreateDC( “DISPLAY”, NULL, NULL, NULL );
dc.TextOut( 100, 100, “hello CDC” );
dc.DeleteDC( );
}
void CMFCDcView::OnCwindowdc()
{
CWindowDC dc( AfxGetMainWnd() );
dc.TextOut( 0, 0, “hello CWindowDC” );
}
void CMFCDcView::OnCclientdc()
{
CClientDC dc( this );
dc.TextOut( 0, 0, “hello CClientDC” );
CDC * pDC = GetDC( );
pDC->TextOut( 0, 100, “hello CClientDC” );
ReleaseDC( pDC );
}
void CMFCDcView::OnPaint()
{
CPaintDC dc(this); // device context for painting
dc.TextOut( 0, 300, “Hello CPaintDC” );
}
void CMFCDcView::OnCmetafiledc()
{
CMetaFileDC dcMeta;
dcMeta.Create( “c:\meta.dat” );
dcMeta.TextOut( 100, 100, “Hello Meta” );
HMETAFILE hMetaFile = dcMeta.Close();
CClientDC dc( this );
dc.PlayMetaFile( hMetaFile );
DeleteMetaFile( hMetaFile );
}
运行显示:如图-1所示:
MFC day08
2 绘图对象的使用
2.1 问题
CPen类-画笔

CBrush类-画刷

CFont类-字体

CBitmap类-位图

CPalette类-调色板

CRgn类-区域

2.2 方案
编写一个单文档应用程序,在这个程序中演示各种绘图对象的使用。

2.3 步骤
实现此案例需要按照如下步骤进行。

步骤一:CPen类

创建CClientDC类对象和CBrush对象,调用Rectangle和SelectObject函数画一个矩形。代码如下所示:

void CChildView::OnCpen()
{
CClientDC dc( this );
CPen pen( PS_SOLID, 10, RGB( 255, 0, 0 ) );
CPen * pOldPen = (CPen *)dc.SelectObject( &pen );
dc.Rectangle( 50, 50, 100, 100 );
dc.SelectObject( pOldPen );
pen.DeleteObject();
}
步骤二:CBrush类

创建CClientDC类对象和CBrush对象,调用Rectangle和SelectObject函数画一个矩形。代码如下所示:

void CChildView::OnCbrush()
{
CClientDC dc( this );
CBrush *pNullBrush =CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)) ;
CBrush * pOldBrush = (CBrush *)dc.SelectObject( &pNullBrush );
dc.Rectangle( 150, 50, 200, 200 );
dc.SelectObject( pOldBrush );
}
步骤三:CBitmap类

创建CClientDC类对象和CBitmap对象,加载一张位图。代码如下所示:

void CChildView::OnCbitmap()
{
CClientDC dc( this );
HBITMAP hBmp = (HBITMAP)LoadImage( NULL,
“D:\setup.bmp”,
IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
CBitmap bmp;
bmp.Attach( hBmp );
CDC dcBmp;
dcBmp.CreateCompatibleDC( &dc )
CBitmap * pOldBmp = dcBmp.SelectObject( &bmp );
dc.BitBlt( 0, 0, 800, 600, &dcBmp, 0, 0, SRCCOPY );
dcBmp.SelectObject( pOldBmp );
}
步骤四:CFont类

创建CClientDC类对象和CFont对象,设置字体宽度和字体,显示出一句字符串“hello cfont”。代码如下所示:

void CChildView::OnCfont()
{
CClientDC dc( this );
CFont font;
font.CreatePointFont( 2000, “宋体” );
CFont * pOldFont = dc.SelectObject( &font );
dc.TextOut( 50, 200, “Hello CFont” );
dc.SelectObject( pOldFont );
font.DeleteObject();
}
步骤五:CRgn类

创建CRgn对象,,调用CreateEllipticRgn创建区域,调用CombineRgn合并区域。创建CClientDC和CBrus对象,填充这两个区域。代码如下所示:

void CChildView::OnCrgn()
{
CRgn rgnYaling;
rgnYaling.CreateRectRgn( 200, 200, 500, 250 );
CRgn rgnLeft;
rgnLeft.CreateEllipticRgn( 150, 150, 300, 300 );
CRgn rgnRight;
rgnRight.CreateEllipticRgn( 450, 150, 600, 300 );
rgnYaling.CombineRgn( &rgnYaling, &rgnLeft, RGN_OR );
rgnYaling.CombineRgn( &rgnYaling, &rgnRight, RGN_OR );
CRgn rgnLeftHole;
rgnLeftHole.CreateEllipticRgn( 180, 180, 270, 270 );
CRgn rgnRightHole;
rgnRightHole.CreateEllipticRgn( 480, 180, 570, 270 );
rgnYaling.CombineRgn( &rgnYaling, &rgnLeftHole, RGN_DIFF );
rgnYaling.CombineRgn( &rgnYaling, &rgnRightHole, RGN_DIFF );
CClientDC dc( this );
CBrush brush( HS_DIAGCROSS, RGB( 100, 100, 100 ) );
dc.FillRgn( &rgnYaling, &brush );
CBrush brushFrame( RGB( 100, 100, 100 ) );
dc.FrameRgn( &rgnYaling, &brushFrame, 2, 2 );
AfxGetMainWnd()->SetWindowRgn( rgnYaling, TRUE );
}
2.4 完整代码
本案例的完整代码如下所示:

void CChildView::OnCpen()
{
CClientDC dc( this );
CPen pen( PS_SOLID, 10, RGB( 255, 0, 0 ) );
CPen * pOldPen = (CPen *)dc.SelectObject( &pen );
dc.Rectangle( 50, 50, 100, 100 );
dc.SelectObject( pOldPen );
pen.DeleteObject();
}
void CChildView::OnCbrush()
{
CClientDC dc( this );
CBrush *pNullBrush =CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)) ;
CBrush * pOldBrush = (CBrush *)dc.SelectObject( &pNullBrush );
dc.Rectangle( 150, 50, 200, 200 );
dc.SelectObject( pOldBrush );
}
void CChildView::OnCbitmap()
{
CClientDC dc( this );
HBITMAP hBmp = (HBITMAP)LoadImage( NULL,
“D:\setup.bmp”,
IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
CBitmap bmp;
bmp.Attach( hBmp );
CDC dcBmp;
dcBmp.CreateCompatibleDC( &dc )
CBitmap * pOldBmp = dcBmp.SelectObject( &bmp );
dc.BitBlt( 0, 0, 800, 600, &dcBmp, 0, 0, SRCCOPY );
dcBmp.SelectObject( pOldBmp );
}
void CChildView::OnCfont()
{
CClientDC dc( this );
CFont font;
font.CreatePointFont( 2000, “宋体” );
CFont * pOldFont = dc.SelectObject( &font );
dc.TextOut( 50, 200, “Hello CFont” );
dc.SelectObject( pOldFont );
font.DeleteObject();
}
void CChildView::OnCrgn()
{
CRgn rgnYaling;
rgnYaling.CreateRectRgn( 200, 200, 500, 250 );
CRgn rgnLeft;
rgnLeft.CreateEllipticRgn( 150, 150, 300, 300 );
CRgn rgnRight;
rgnRight.CreateEllipticRgn( 450, 150, 600, 300 );
rgnYaling.CombineRgn( &rgnYaling, &rgnLeft, RGN_OR );
rgnYaling.CombineRgn( &rgnYaling, &rgnRight, RGN_OR );
CRgn rgnLeftHole;
rgnLeftHole.CreateEllipticRgn( 180, 180, 270, 270 );
CRgn rgnRightHole;
rgnRightHole.CreateEllipticRgn( 480, 180, 570, 270 );
rgnYaling.CombineRgn( &rgnYaling, &rgnLeftHole, RGN_DIFF );
rgnYaling.CombineRgn( &rgnYaling, &rgnRightHole, RGN_DIFF );
CClientDC dc( this );
CBrush brush( HS_DIAGCROSS, RGB( 100, 100, 100 ) );
dc.FillRgn( &rgnYaling, &brush );
CBrush brushFrame( RGB( 100, 100, 100 ) );
dc.FrameRgn( &rgnYaling, &brushFrame, 2, 2 );
AfxGetMainWnd()->SetWindowRgn( rgnYaling, TRUE );
}
运行显示:如图-2所示
MFC day08