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所示:
在这里插入图片描述
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所示
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值