VSTGUI:自定义绘图类(一)

11 篇文章 0 订阅
8 篇文章 2 订阅

与以往不同,以往都是先写完代码再进行总结,这次要在写代码之前做一些必要的讨论,以支持后面的工作。之前都是照着例程,再参照自己想法写,但是现在的需求是,需要根据三个控件的参数画一条曲线来显示参数变化,这个功能没有现成的类可以实现,需要通过继承某个基类进行定制。
此需求的功能和使用过的CParamDisplay类似,共同点是,通过监听控件来改变显示。看CParamDisplay的父类,CParamDisplay继承自CControl,CControl又继承自CView。

/* vstcontrols.h */
class CControl : public CView
{
public:
	CControl (const CRect &size, CControlListener *listener = 0, long tag = 0, 
						CBitmap *pBackground = 0);
...

protected:
	CControlListener *listener;
...

};

那么我们只能继承VSTGUI::CView类了。
CView类中有个虚函数
draw

void CView::draw (CDrawContext *pContext)
{
	if (pBackground)
	{
		if (bTransparencyEnabled)
			pBackground->drawTransparent (pContext, size);
		else
			pBackground->draw (pContext, size);
	}
	setDirty (false);
}

可以看到又调用了pBackground的draw函数。pBackground是什么呢,看上去有些陌生,但实际上在《VSTGUI:开端》里面就见过面了。pBackground是CView的一个CBitmap*类型的成员。回想最早做了一个只有背景图的VST插件是如何实现的,是通过new一个CView,调用它的setBackground将自己准备好的CBitmap指针传入,再通过addView把CView加入到CFrame中显示:

// Set the size of frame and create it
nBmpWidth = m_pBmpFrameBkgd->getWidth();
nBmpHeight = m_pBmpFrameBkgd->getHeight();
CRect rcFrameSize(0, 0, nBmpWidth, nBmpHeight);
frame = new CFrame(rcFrameSize, ptr, this);

// Create a view and set the background image for it
CView* pBkgdView = new CView(CRect(0, 0, nBmpWidth, nBmpHeight));
pBkgdView->setBackground(m_pBmpFrameBkgd);

// Add the background view to the CFrame object created earlier
frame->addView(pBkgdView);

而传入的这个CBitmap*正是给了CView的pBackground。那么只要能在CBitmap里draw自己想要的东西就可以了。很幸运,在CBitmap的draw函数里,我们看到了熟悉的场景:

void CBitmap::draw (CDrawContext *pContext, CRect &rect, const CPoint &offset)
{
#if WINDOWS
	#if USE_ALPHA_BLEND
	if (!noAlpha)
	{
		drawAlphaBlend (pContext, rect, offset, 255);
		return;
	}
	#endif	

	if (pHandle)
	{
		HGDIOBJ hOldObj;
		HDC hdcMemory = CreateCompatibleDC ((HDC)pContext->pSystemContext);
		hOldObj = SelectObject (hdcMemory, pHandle);
		BitBlt ((HDC)pContext->pSystemContext, 
						rect.left + pContext->offset.h, rect.top + pContext->offset.v, rect.width (), rect.height (), 
						(HDC)hdcMemory, offset.h, offset.v, SRCCOPY);
		SelectObject (hdcMemory, hOldObj);
		DeleteDC (hdcMemory);
	}
}

就是WinApi绘图。甚至之前想的使用Gdiplus绘图也不是什么问题了。
讨论到这里,基本就已经知道应该如何进行了,其他细节在写程序时逐步形成。
需要绘制一条曲线,两条Cursor。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值