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