【发布时间】:2018-01-08 02:06:38
【问题描述】:
我正在尝试在频谱图上创建透明的选择叠加层,但效果不佳。我的意思是结果并不令人满意。相比之下,在波形顶部绘制的叠加层效果很好,但我需要同时支持波形和频谱图视图(未来可能还有其他视图)
选择覆盖在波形视图中工作正常
这是频谱图视图中的选择叠加层(选择看起来非常糟糕并且遮挡了频谱图的某些部分)
两个视图的代码 (VCL) 相同
void TWaveDisplayContainer::DrawSelectedRegion(){
if(selRange.selStart.x == selRange.selEnd.x){
DrawCursorPosition( selRange.selStart.x);
return;
}
Graphics::TBitmap *pWaveBmp = eContainerView == WAVEFORM ? pWaveBmpLeft : pSfftBmpLeft;
TRect selRect(selRange.selStart.x, 0, selRange.selEnd.x, pWaveLeft->Height);
TCanvas *pCanvas = pWaveLeft->Canvas;
int copyMode = pCanvas->CopyMode;
pCanvas->Draw(0,0, pWaveBmp);
pCanvas->Brush->Color = clActiveBorder;
pCanvas->CopyMode = cmSrcAnd;
pCanvas->Rectangle(selRect);
pCanvas->CopyRect(selRect, pWaveBmp->Canvas, selRect);
pCanvas->CopyMode = copyMode;
if(numChannels == 2){
TCanvas* pOtherCanvas = pWaveRight->Canvas;
pWaveBmp = eContainerView == WAVEFORM ? pWaveBmpRight :
pSfftBmpRight;
pOtherCanvas->Draw(0,0, pWaveBmp);
pOtherCanvas->Brush->Color = clActiveBorder;
pOtherCanvas->CopyMode = cmSrcAnd;
pOtherCanvas->Rectangle(selRect);
pOtherCanvas->CopyRect(selRect, pWaveBmp->Canvas, selRect);
pOtherCanvas->CopyMode = copyMode;
}
}
所以,我使用cmSrcAnd 复制模式和CopyRect 方法来进行实际的绘画/绘图(TCanvas 对应于设备上下文(HDC on Windows)。我认为,因为频谱图,不像一个波形,实际上没有单一的背景颜色,使用简单的混合复制模式在大多数情况下都不能很好地工作。
请注意,我仍然可以完成我想要的,但这需要弄乱单个像素,这是我希望尽可能避免的事情)
我基本上是在寻找能够做到这一点的API(VCL 包装GDI 所以即使是 WINAPI 也可以)。
非常感谢任何帮助
【问题讨论】:
-
我认为这个问题与您的问题相似:stackoverflow.com/questions/23702868/… 您可能想看看下面的 cmets - Graphics32 库看起来很有前途。特别看看“CombineMode”:graphics32.github.io/Docs/Units/GR32/Classes/TCustomBitmap32/…
-
谢谢,这个库看起来很有趣,而且相当全面。即使我决定编写自己的透明覆盖例程,我也会研究它。
标签: c++ transparency vcl