0 Members and 1 Guest are viewing this topic.
в таких случаях, когда нельзя избавиться от фликов (мерцаний) другим способом, используют двойную буфферизацию, т.е. сначала рисуют все полностью на внутреннем буфере (на Bitmapе, как правило), а потом выводят готовое изображение на DC. Вот небольшой пример:procedure DisplayRender(DC: HDC; AData: PVisualData); stdcall;var ABitmap: TBitmap;begin ABitmap := TBitmap.Create; // создаем внутренний буфер try ABitmap.Width := W; ABitmap.height := H; // размеры дисплея приходят на Resize Paint(ABitmap.Canvas.Handle, AData); // наша внутренняя отрисовка BitBlt(DC, 0, 0, W, H, ABitmap.Canvas.Handle, 0, 0, SRCCOPY); // Выводим с буфера на дисплей finally ABitmap.Free; end;end;
P.S. По-хорошему, в нашем случае, лучше будет так поступить:+ буфер создавать и убивать при создании / дестрое плагина (чтобы при отрисовке каждый раз это не делать)+ Ресайзить буфер при вызове функции Resize, которая передает координаты
Забыл:>>ак же интересно, как сам плеер считывает данные с холста для отрисовки или отрисовка происходит в холст плеера напрямую?2-ая буферизация используется только для полноэкранного режима
The AIMP_Vis_Demo posted on https://www.aimp.ru/forum/index.php?topic=1733.0 by Spir1tus doesn't work here. Maybe it is for an old AIMP version.I tried it by writing a main addon with the C++ example as base from the same topic (posted by Artem) but there is no way to get the wave form data needed for visualisation that way.Then I tried to copy the visualisation plugin definitions from the Delphi SDK, but I was only able to crash AIMP after loading my test plugin.
#include "windows.h"#define VIS_RQD_DATA_WAVE 1#define VIS_RQD_DATA_SPECTRUM 2#define VIS_RQD_NOT_SUSPEND 4typedef char TWaveForm[2][512]; typedef BYTE TSpectrum[2][256];typedef struct { BYTE LevelR, LevelL; TWaveForm Waveform; TSpectrum Spectrum; }TVisData, *PVisData;typedef struct{ //BYTE Version; //DWORD DllInstance; PWCHAR (__stdcall *Author)(); PWCHAR (__stdcall *PluginName)(); PWCHAR (__stdcall *PluginInfo)(); DWORD (__stdcall *PluginFlags)(); BOOL (__stdcall *Initialize)(); void (__stdcall *Deinit)(); void (__stdcall *DisplayClicked)(int x, int y); void (__stdcall *DisplayRender)(HDC Canvas, PVisData pVD ); void (__stdcall *DisplayResize)(int NewW, int NewH );}TAIMP2VisualPlugin, *PAIMP2VisualPlugin;BOOL WINAPI _DllMainCRTStartup(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) { return TRUE; }PWCHAR __stdcall Author() { return L"Test Author"; }PWCHAR __stdcall PluginName() { return L"Test Visual Plugin"; }PWCHAR __stdcall PluginInfo() { return L""; }DWORD __stdcall PluginFlags() { return VIS_RQD_DATA_WAVE|VIS_RQD_DATA_SPECTRUM|VIS_RQD_NOT_SUSPEND; }void __stdcall Resize(int NewW, int NewH ) { }void __stdcall Render(HDC Canvas, PVisData pVD ) { }void __stdcall Deinit() { }void __stdcall Clicked(int x, int y) { }BOOL __stdcall Initialize();TAIMP2VisualPlugin plugin ={ //1/*PLUGIN_VERSION*/, //0, Author, PluginName, PluginInfo, PluginFlags, Initialize, Deinit, Clicked, Render, Resize,};extern "C" __declspec( dllexport ) PAIMP2VisualPlugin AIMP_QueryVisual(){ MessageBox(NULL, L"AIMP_QueryVisual", L"", 0); return &plugin;}BOOL __stdcall Initialize(){ MessageBoxW(NULL, L"Initialize", L"",0); return TRUE;}
#include "windows.h"#define VIS_RQD_DATA_WAVE 1#define VIS_RQD_DATA_SPECTRUM 2#define VIS_RQD_NOT_SUSPEND 4typedef char TWaveForm[2][512]; typedef BYTE TSpectrum[2][256];typedef struct { BYTE LevelR, LevelL; TWaveForm Waveform; TSpectrum Spectrum; } TVisData, *PVisData;class IAIMP2VisualPlugin : public IUnknown{public: virtual PWCHAR __stdcall AuthorName() = 0; virtual PWCHAR __stdcall PluginName() = 0; virtual PWCHAR __stdcall PluginInfo() = 0; virtual DWORD __stdcall PluginFlags() = 0; virtual boolean __stdcall Initialize() = 0; virtual void __stdcall Deinitialize() = 0; virtual void __stdcall DisplayClick(int x, int y) = 0; virtual void __stdcall DisplayRender(HDC Canvas, PVisData pVD) = 0; virtual void __stdcall DisplayResize(int NewW, int NewH) = 0; long __stdcall QueryInterface(const struct _GUID &,void ** ) { MessageBoxW(NULL, L"IAIMP2VisualPlugin::QueryInterface", L"",0); return 1; } unsigned long __stdcall AddRef(void) { MessageBoxW(NULL, L"IAIMP2VisualPlugin::AddRef", L"",0); return 1; } unsigned long __stdcall Release(void) { MessageBoxW(NULL, L"IAIMP2VisualPlugin::Release", L"",0); return 1; } long __stdcall CreateInstance(struct IUnknown *,const struct _GUID &,void ** ) { MessageBoxW(NULL, L"IAIMP2VisualPlugin::CreateInstance", L"",0); return 1; } long __stdcall LockServer(int) { MessageBoxW(NULL, L"IAIMP2VisualPlugin::LockServer", L"",0); return 1; }};class TAIMP2VisualPlugin : public IAIMP2VisualPlugin {public: PWCHAR __stdcall AuthorName() { return L"Test Author"; } PWCHAR __stdcall PluginName() { return L"Test Visual Plugin"; } PWCHAR __stdcall PluginInfo() { return L""; } DWORD __stdcall PluginFlags() { return VIS_RQD_DATA_WAVE|VIS_RQD_DATA_SPECTRUM|VIS_RQD_NOT_SUSPEND; } boolean __stdcall Initialize() { MessageBoxW(NULL, L"Initialize", L"",0); return TRUE; } void __stdcall Deinitialize() { } void __stdcall DisplayClick(int x, int y) { } void __stdcall DisplayRender(HDC Canvas, PVisData pVD ) { } void __stdcall DisplayResize(int NewW, int NewH ) { }} VisualPlugin;BOOL WINAPI _DllMainCRTStartup(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) { return TRUE; }extern "C" __declspec( dllexport ) IAIMP2VisualPlugin* AIMP_QueryVisual(){ MessageBox(NULL, L"AIMP_QueryVisual", L"", 0); return &VisualPlugin;}
Отличная визуализация! +1. Напомнила старенький "Маяк" Правда не во всех скинах нормально работает...
1. Это не Маяковый лума, а Радиотехнический.
Вообще подобные "экранчики" были на многих советских магниофонах: "Юпитер","Маяк","Орель","Яуза","Радиотехника","Электроника"и т.д. В большинстве своем они идентичные, так что определить с какого ты рисовал невозможно