MoveToEx, LineTo, Ellipse实例

本文介绍了一个使用WTL框架的绘图实例,通过调用绘图API如MoveToEx、LineTo等函数,实现了一个描绘生命不同阶段的示例程序。程序中定义了两个方法draw_arrow和draw_node,分别用于绘制带箭头的线段和节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

调用MoveToEx,LineTo,Ellipse函数,实现如下实例:

使用WTL框架,选择Dialog类型,在MainDlg中定义两个private方法:

// draw arrow
void draw_arrow(int nStartX, int nStartY, int nLength) throw()
{
	::MoveToEx(m_hdc, nStartX, nStartY, NULL);
	::LineTo(m_hdc, nStartX + nLength, nStartY);
	::LineTo(m_hdc, nStartX + nLength - 5, nStartY - 5);
	::MoveToEx(m_hdc, nStartX + nLength, nStartY, NULL);
	::LineTo(m_hdc, nStartX + nLength - 5, nStartY + 5);
}
// draw node
void draw_node(int nCenterX, int nCenterY, int nRadius, LPCTSTR szTag, BOOL bCurrent = FALSE) throw()
{
	::Ellipse(m_hdc, nCenterX - nRadius, nCenterY - nRadius,
			nCenterX + nRadius, nCenterY + nRadius);
	if(bCurrent)
		::Ellipse(m_hdc, nCenterX - nRadius*0.4, nCenterY - nRadius*0.4, 
				nCenterX + nRadius*0.4, nCenterY + nRadius*0.4);
	::TextOut(m_hdc, nCenterX - 15, nCenterY + nRadius + 5, szTag, 2);
}

draw_arrow方法的作用是绘制带箭头的线段。draw_node方法的作用是绘制节点,它包含圆形及其下方的标记字符串。参数bCurrent表示本次所绘制的节点是否为当前阶段,本例选择“青年”为当前阶段,该节点的由两个同心圆与普通节点区分开来。

为MainDlg添加对WM_PAINT的消息处理,其响应方法如下所示:

LRESULT OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
	PAINTSTRUCT ps;
	BeginPaint(&ps);
	m_hdc = ps.hdc;
	// draw life stages
	TCHAR* strStages[] = { _T("婴儿"), _T("幼儿"), _T("童年"), _T("少年"),
							_T("青年"), _T("中年"), _T("老年") };
	int nX = 20;
	RECT rc;
	GetClientRect(&rc);
	int nY = rc.bottom / 2;
	int nArrowLength = 50;
	int nRadius = 18;
	int nCurrent = 4; // current is "青年"
	draw_node(nX + nRadius, nY, nRadius, strStages[0], nCurrent == 0);
	for( int i = 0; i < 6; ++i ) {
		draw_arrow(nX + nRadius * 2 + i * nArrowLength + 2 * i * nRadius, nY, nArrowLength);
		draw_node(nX + nRadius * 3 + nArrowLength + i * nArrowLength + 2 * i * nRadius,
				nY, nRadius, strStages[i+1], nCurrent == i + 1);
	} // end for
	EndPaint(&ps);
	return 0;
}


在绘制的时候,除第一个节点之前不带有arrow外,其余6个节点都含有arrow,因此需对第一个节点进行特殊处理,将它的绘制放在for循环之外。整个工程的源码可点击下列链接下载:

http://pan.baidu.com/netdisk/singlepublic?fid=559720_2849936413

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值