AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Etwas außerhalb des Fensters zeichnen?

Ein Thema von Ahlers · begonnen am 13. Jan 2013 · letzter Beitrag vom 14. Jan 2013
Antwort Antwort
Ahlers

Registriert seit: 6. Feb 2011
8 Beiträge
 
#1

Etwas außerhalb des Fensters zeichnen?

  Alt 13. Jan 2013, 20:59
Hallo,
hat jemand eine Idee, wie ich etwas außerhalb des Bereichs eines Fensters zeichnen kann? Das ganze ist vielleicht etwas pedantisch, aber..

Ich habe mir eine eigene Art von einem Hauptmenü geschrieben, in dem ich auch andere Komponenten wie checkboxen, TEdit oder Comboboxen einbauen kann. Die Submenüs musste ich allerdings als eigene Fenster designen. Das hat den Nachteil, dass der Rahmen meines normalen aktiven Fensters inaktiv wird sobald ich so ein Submenü anzeige. An dem Bild im Anhang wird das hoffentlich ersichtlich.
Ein eigenes Fenster ist aber nötig, da ein Menü bei einem kleineren Fenster auch die Fenstergrenzen überschreiten kann. Bei einem "normalen" Hauptmenu geht das ja auch. Das wird aber auch von Windows direkt gemacht.
Eine normale Komponent zeichnet sich aber im Bereich des übergeordneten Fensters. Ich hatte schon überlegt, ob man den gesamten Bildschirm als Parent nehmen kann, wüsste jetzt aber nicht, wie das gehen soll.

Für mich wäre es jetzt das "non plus ultra", wenn das aktive Fenster auch weiterhin als aktive gezeichnet würde.

Gruß
Erwin
Miniaturansicht angehängter Grafiken
neu-2.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: Etwas außerhalb des Fensters zeichnen?

  Alt 13. Jan 2013, 23:32
Außerhalb zeichnen ginge zwar über das Desktopcanvas, hinterlässt aber Artefakte und nützt Dir nichts weil Du dann ja auch außerhalb klicken würdest.

Wenn Du auf Deinem PseudoMenü auf weitere WinControls verzichten kannst und selbst malst oder z.B. Lables verwendest könnte das hier weiterhelfen.

Der Aufruf wäre dann statt Show, ShowAT ...
z.B.
MenuLikeForm.ShowAt(Mouse.CursorPos);

Ein naheliegendere Möglichkeit wäre ein Popupmenu mit OwnerDraw:=true zu verwenden und On(Advanced)DrawItem sowie OnMeasureItem zu versorgen.

Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TMenuLikeForm = class(TForm)
     procedure CreateParams(var Params: TCreateParams);override;
     procedure WMMouseActivate(var Message: TMessage); message WM_MOUSEACTIVATE;
  private
  public
    Procedure ShowAt(P:TPoint);
  end;

var
  MenuLikeForm: TMenuLikeForm;

implementation

{$R *.dfm}

procedure TMenuLikeForm.CreateParams(var Params: TCreateParams);
begin
  inherited ;
  Params.Style := WS_POPUPWINDOW ;
  Params.ExStyle := Params.ExStyle or WS_EX_NOACTIVATE ;

end;

procedure TMenuLikeForm.ShowAt(P: TPoint);
begin
  Left := p.X;
  Top := p.Y;
  ShowWindow(Handle, SW_SHOWNOACTIVATE);
  Visible := true;
end;

procedure TMenuLikeForm.WMMouseActivate(var Message: TMessage);
begin
  Message.Result := MA_NOACTIVATE;
end;

end.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)

Geändert von Bummi (13. Jan 2013 um 23:48 Uhr)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#3

AW: Etwas außerhalb des Fensters zeichnen?

  Alt 14. Jan 2013, 06:50
Ich hab zwar nicht ganz verstanden was du machen möchtest, aber vielleicht geht das einfacher als du denkst (falls du das denkst was ich denke, dass du denkst).

Hier ein einfaches Beispiel wie man Popupmenü genau unter einer Komponente (hier Button) positionieren kann. Vielleicht ist es bereits das was du brauchst.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  PopupMenu1.Popup(Button1.ClientOrigin.X, Button1.ClientOrigin.Y + Button1.Height);
end;
//
Achso, die meisten Köche kochen mit Wasser, d. h. wenn es in einigen Programmen manchmal so aussieht als ob irgendwas außerhalb des Fensters gezeichnet wird, dann wird oft ein temporäres Fenster erzeugt auf dem gezeichnet wird. Beispiel Total Commander bietet an einer Stelle eine Art eigene eigene Popupmenüs mit Bildlaufleiste (kannst mal angucken). Das wird mit eigenen Fenstern gelöst. Es werden so viele temporäre Fenster produziert, wie viel Menüs und Unternemüs benötigt werden.

Geändert von Popov (14. Jan 2013 um 06:56 Uhr)
  Mit Zitat antworten Zitat
Ahlers

Registriert seit: 6. Feb 2011
8 Beiträge
 
#4

AW: Etwas außerhalb des Fensters zeichnen?

  Alt 14. Jan 2013, 21:54
Der Tip mit dem CreateParams des Fensters ist klasse. Ich habe noch die Option WS_EX_TOPMOST hinzugefügt. Sonst was das Fenster meines Submenüs nämlich hinter meinem Orginalfenster.
Aber mit dieser Option klappt es super.
Wenn ich in meine Submenü ein Editierfeld, welches von TEdit abgelitten wurde, einfüge, und dieses dann anklicke, wird mein Hauptfenster allerdings inaktiv. Ich schätze, das muss aber so sein, da ja die Eingaben an mein Editierfeld geschickt werden müssen, welches ja in einem anderen Fenster ist.
Oder kann man dort auch ein NoActivat machen? Müssten dann die Keyboard messages noch manuell weiter geleitet werden?

Vielen Dank schon mal
Erwin
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz