MFC之学习绘制椭圆、库画刷使用

1.笔记

1.1绘制椭圆

函数原型:

BOOL CDC::Ellipse(int x1,int y1,int x2,int y2);
BOOL CDC::Ellipse(LPCRECT lpRect);

一个椭圆由一个矩形唯一确定(内切椭圆)。调用成功返回非零,否则返回0。

1.2选入库画刷进行绘图

一些常用的绘图对象的属性,已经在库里预先定义好了,可以直接选入设备上下文调用,不过要借助专用的函数。

1.2.1选入库对象函数

virtual CGdiObject* SelectStockObject(int nIndex);

 调用成功返回正在被替代的库对象指针,否则返回NULL。

1.2.2常用的库画刷

库画刷代码宏定义值含义颜色
WHITE_BRUSH0白色的实心画刷RGB(255,255,255)
LTGRAY_BRUSH1浅灰色的实心画刷RGB(192,192,192)
GRAY_BRUSH2灰色的实心画刷RGB(128,128,128)
DKGRAY_BRUSH3暗灰色实心画刷RGB(64,64,64)
BLACK_BRUSH4黑色实心画刷RGB(0,0,0)
HOLLOW_BRUSH5空心画刷
NULL_BRUSH5透明画刷

2.使用练习

2.1将客户区矩形上下左右边界各向中心缩小100个像素,依次绘制矩形内切圆、矩形内切椭圆和矩形。椭圆、圆、矩形的边界线均为1像素宽黑线,图形内部全部用透明画刷填充,在自定义坐标系中实现。

在声明内切圆的外切正方形时,可以看到矩形不再由左上角和右下角确定,这是因为坐标系变换的缘故,其实矩形构造函数该用哪些点,要看x2-x1、y2-y1何时为正。

void CExample1View::OnDraw(CDC* pDC)
{
	CExample1Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 在此处为本机数据添加绘制代码
	CRect rect;
	GetClientRect(rect);
	pDC->SetMapMode(MM_ANISOTROPIC);
	pDC->SetWindowExt(rect.Width(), rect.Height());
	pDC->SetViewportExt(rect.Width(), -rect.Height());
	pDC->SetViewportOrg(rect.Width() / 2, rect.Height() / 2);
	rect.OffsetRect(-rect.Width() / 2, -rect.Height() / 2);

	rect.DeflateRect(100, 100);
	int r = rect.Height() / 2;
	CRect rect1(CPoint(-r, -r), CPoint(r, r));//内切圆的外切正方形
	CBrush* pOldBrush = (CBrush*)pDC->SelectStockObject(NULL_BRUSH);//选入库画刷
	pDC->Ellipse(rect1);//绘制内切圆
	pDC->Ellipse(rect);//绘制内切椭圆
	pDC->Rectangle(rect);
	pDC->SelectObject(pOldBrush);
}

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赴星辰大海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值