Zitat:
Was mir nur aufgefallen ist, dass der Spinner immer an der Stelle auf dem Bildschirm verbleibt, an welcher er gestartet wurde.
Ja es ist eine Wait Animation.
Und diese wird zentriert über das Parent Fenster gesetzt.
Es ist nicht vorgesehen das die Animation mitgeht.
Ich glaube nicht das wenn eine Anwendung bei verschiedenen Prozessen ausgelastet ist der User sein Window Verschieben will.
Das Sample ist ja nicht maßgeblich da hier die Animation nur gestartet und beendet wird.
Bsp.
Ich starte eine Anwendung die beim initialisieren ein liste mit mehr als 5000 Einträge lädt.
Delphi-Quellcode:
function TPlayList.LoadM3UFile(Filename: String): Boolean;
var
F: TextFile;
Buffer, iTime, sFilename, sParse: string;
k, iPos1, iPos2: Integer;
begin
Spinner := CTRL_SpinnerCreate;
SpinnerHandle := Spinner.CreateWindow(MainHandle);
SpinnerFile := SKAERO_FOLDER + 'Spinner.png';
Spinner.Start(MainHandle, SpinnerHandle, SpinnerFile, 30);
AssignFile(F, Filename);
Reset(F);
PlayListCount := 0;
while not Eof(F) do
begin
ReadLn(F, Buffer);
if Buffer = '#EXTM3U' then
Continue;
ReadLn(F, sFilename);
LVPlayList.SetSysItemIcon(PlayListCount, 2, sFilename);
if Pos('#EXTINF', Buffer) > 0 then
begin
LVPlayList.InsertItem(LVPlayList.Handle, PlayListCount, IntToStr(PlayListCount + 1));
iPos1 := Pos(':', Buffer);
iPos2 := Pos('|', Buffer);
iTime := Copy(Buffer, iPos1 + 1, iPos2 - iPos1 - 1);
LVPlayList.SetItemText(LVPlayList.Handle, PlayListCount, 1, iTime);
for k := 0 to 2 do
begin
sParse := ParseThis(Buffer, '|', K + 1);
case K of
0:
LVPlayList.SetItemText(LVPlayList.Handle, PlayListCount, 2, sParse);
1:
LVPlayList.SetItemText(LVPlayList.Handle, PlayListCount, 3, sParse);
2:
LVPlayList.SetItemText(LVPlayList.Handle, PlayListCount, 4, sParse);
end;
end;
LVPlayList.SetItemText(LVPlayList.Handle, PlayListCount, 5, sFilename);
Inc(PlayListCount);
end
else
begin
if ExtractFilePath(Buffer) = '' then
FFile.Add(ExtractFilePath(Filename) + Buffer)
else
FFile.Add(Buffer);
FTitle.Add(Buffer);
FTime.Add('');
end;
end;
CloseFile(F);
LVPlayList.SetColAutoSize(LVPlayList.Handle, 2);
LVPlayList.SetColAutoSize(LVPlayList.Handle, 3);
LVPlayList.SetColAutoSizeUseHeader(LVPlayList.Handle, 4);
if (PlayListCount > 0) then
MainApp.PlayListPlay(LVPlayList.Handle, PlayListCount);
Result := True;
end;
Dann starte ich den Spinner.
Nach dem laden wenn das Fenster angezeigt wird beendet sich dieser.
Also ein Fenster ist in dem Fall gar nicht sichtbar wenn die Animation startet.
Delphi-Quellcode:
MainInit := TRUE;
if SpinnerHandle <> 0 then
SpinnerHandle := Spinner.Stop;
while GetMessage(Msg, 0, 0, 0) do
begin
if IsDialogMessage(MainApp.Handle, Msg) = False then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
Zitat:
Und eventuell Transparenz?
Welche Transparenz?
Die Animationen sind Transparent dazu verwende ich die DWM.
gruss