Einzelnen Beitrag anzeigen

Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#26

AW: TAppButton - Application Button like Firefox (experimentell)

  Alt 22. Nov 2011, 21:19
Du hast in die gleiche Richtung gedacht wie ich Etwas hab' ich unter der Woche auch schon geschafft, kann aber erst am WE richtig ran und testen. Kleiner SuperGau: dachte ich kann mit Delphi7PE am Win7 Rechner direkt testen, aber ApplicationOnTaskbar schein das Cerhalten (weitergereichte Ereignisse) auch wieder zu ändern.

Das Problem mit dem an falscher Position hängenden Button (bei diversen Maximize Aktionen), liegt nicht an einer falschen Berechnung, sondern an einer fehlenden Aktualisierung. Da hab' ich zuvor entfernte Messages wieder zum Behandeln reingenommen. Überhaupt hab' ich mal neu organisiert.

Zum hängenden Button bei animiertem Mini/Maximize hatte ich die gleiche Idee wie Du. Einfach das Teil vorher ausblenden (allerdings nicht Visible direkt ändern, falls der unsichbar war, sollte er es bleiben). Hab' es in einem ersten Ansatz etwas anders gelöst. Konnte aber noch nicht wirklich testen... unter XP läuft es leider fast immer sehr gut...

Delphi-Quellcode:
procedure TAppButton.MainFormWndProc(var Message: TMessage);
var
  R : TRect;
begin
  case Message.Msg of
    WM_SYSCOMMAND:
    begin
      if (Message.WParam = SC_MINIMIZE) then
        ShowWindow(fHandle, SW_HIDE);
    end;
  end;

  if Assigned(fMainFormWndProc) then
    fMainFormWndProc(Message);

  case Message.Msg of
    WM_MOVE, WM_MOVING, WM_SIZe, WM_SIZING, WM_EXITSIZEMOVE, WM_NCPAINT:
    begin
      MoveButtonWindow(True);
    end;
    WM_STYLECHANGED, WM_SETTINGCHANGE:
    begin
      Color := Color;
      Invalidate;
    end;
    WM_ACTIVATE:
    begin
      Invalidate;
    end;
    WM_NCCALCSIZE:
    begin
      R := ButtonRect;
      if (not fOptimizeUpdates)
      or (fLastPainted.X <> R.Left) or (fLastPainted.Y <> R.Top) then
        Invalidate;
    end;
    WM_SYSCOMMAND:
    begin
      if fVisible
      and ((Message.WParam = SC_RESTORE) or (Message.WParam = SC_MAXIMIZE)) then
      begin
        ShowWindow(fHandle, SW_SHOW);
        fMainForm.SetFocus;
      end;
    end;
  end;
end;
Ich bin jedenfalls sicher, dass die Probleme zu lösen sind, muss nur noch etwas suchen

Ich poste gleich die ganze Unit nochmal, und die Exe zum Testen...

€: Heute morgen kurz am Win7 PC getestet, funktioniert nicht richtig!
Ich bekomme zum WE ein Win7 Notebook. Dann kann ich das direkt testen. Immer ändern und später probieren hat kein Wert, so komme ich nicht weiter. Verschiebe das Problem jetzt erstmal, bis ich mit D2007 direkt auf Win7 entwickeln kann.
Angehängte Dateien
Dateityp: 7z AppButton_2.7.7z (187,5 KB, 124x aufgerufen)

Geändert von Satty67 (23. Nov 2011 um 08:41 Uhr)
  Mit Zitat antworten Zitat