Hallo,
bin gerade dabei an einer Ansteuerung eines Displays zu arbeiten und benötige eventuell noch ein wenig Hilfe bei der richtigen Umsetzung.
Die
Dll zur Ansteuerung des Displays besitzt eine Funktion mit der man ein "Bitmap" direkt übertragen kann. Das Bitmap muss vom Typ Pointer.
Delphi-Quellcode:
Function LUI_Bitmap(DevNum: Integer; ScreenNr: Byte; ScreenPosX: Integer; ScreenPosY: Integer;
BMPoffsetX: Integer; BMPoffsetY: Integer; BMPWidth: Integer; BMPHigh: Integer;
BMPdataWidth: Integer; BMPdataHigh: Integer; Bitmap: Pointer): Byte; StdCall; External 'LUIse.dll'
Habe dann überall gesucht und bin dann auf etwas gestossen, was mit das Bitmap in einen Pointer setzt.
Delphi-Quellcode:
procedure TDisplay.BMPtoPointer(Bitmap: TBitmap);
var
Info : PBitmapInfo;
InfoSize : DWord;
Image : Pointer;
ImageSize : DWord;
begin
with Bitmap
do
begin
GetDIBSizes(
Handle, InfoSize, ImageSize);
Info := AllocMem(InfoSize);
try
Image := AllocMem(ImageSize);
try
GetDIB(
Handle, Palette, Info^, Image^);
{ Bild an das Display übergeben }
_Bitmap(0, 0, 30, 120, 0, 0, Width, Height, 320, 240, Image);
// umsetung von LUI_Bitmap
finally
FreeMem(Image, ImageSize);
end;
finally
FreeMem(Info, InfoSize);
end;
end;
end;
Die Funktion leistet auch wunderbare Dienste. Einzieger Nachteil ist es ist Vertikal gespiegelt. Das ist natürlich nicht gewollt!
Habe es dann vor der Ausgabe auf das Display vertikal gespeigelt.
Delphi-Quellcode:
PROCEDURE TDisplay.Spiegeln(VAR Bitmap: TBitmap);
BEGIN
Bitmap.Canvas.CopyRect(Rect(0,Bitmap.Height-1, Bitmap.Width,-1),
Bitmap.Canvas,
Rect(0,0, Bitmap.Width,Bitmap.Height));
END;
Damit habe ich nun auf dem Display mein Bild so wie es sein soll.
Delphi-Quellcode:
Spiegeln(VisBuff);
BMPtoPointer(VisBuff);
Diese Funktion wird z.Z. alle 50ms aufgerufen, da sie das Audiospectrum wieder gibt.
Frage ist nun ob man das so lassen kann oder ob es dafür vllt. noch eine bessere und schnellere Methode gibt. Es ist für mich das erste mal das ich mit sowas arbeite also entschuldigt falls das nicht so die korrekte Umsetzung ist aber sie funktioniert z.Z.
Dies ist ja auch er Grund warum ich den Thread jetzt schreibe.
Gruss
Cyberaxx