Discussion:
MessageBox zentriert in Anwendung anzeigen
(zu alt für eine Antwort)
Herfried K. Wagner [MVP]
2004-04-22 04:50:05 UTC
Permalink
Hallo Pirmin!
Ich versuche erfolglos eine MessageBox in meiner Anwendung
zentriert anzuzeigen. Die MessageBox wird immer in der Mitte
des Bildschirms angezeigt.
Mit MessageBox.Show (siehe unten) sollte es möglich sein,
die MessageBox in einem Formular zentriert anzuzeigen.
public static DialogResult Show(
IWin32Window owner,
string text, string caption,
MessageBoxButtons buttons, MessageBoxIcon icon);
In meinen ersten Versuchen habe ich als owner "this" angegeben.
Irgendwie habe ich es zum kompilieren und laufen gebracht.
Aber zentriert war es immer bezüglich Bildschirm.
Die einzige Lösung, die ich sehe, ist über einen Win32-Dialog-Hook. Das
erscheint mir aber doch recht aufwendig, wenn man den beschränkten
Nutzen betrachtet.
--
Herfried K. Wagner [MVP]
<URL:http://dotnet.mvps.org/>
Immo Landwerth
2004-04-22 09:32:57 UTC
Permalink
Herfried K. Wagner [MVP] wrote:

[MessageBox zentrieren]
Post by Herfried K. Wagner [MVP]
Die einzige Lösung, die ich sehe, ist über einen Win32-Dialog-Hook.
Das erscheint mir aber doch recht aufwendig, wenn man den beschränkten
Nutzen betrachtet.
Zumal das nicht Windows-konform ist.

MessageBoxen waren seit jeher Desktop zentrisch. MS Access ist mir als
einzige Anwendung bekannt, die konsequent eine eigene MessageBox
verwendet (mit fettgedruckter Überschrift) die dann zentriert zu der
Anwendung erscheint. Komplett selber schreiben wäre also eine
Alternative zu einem Hook, zumal man dann sogar ohne P/Invoke auskäme.
Ist allerdings nicht minder aufwendig.

Ich persönlich mag es lieber Windows konform. Zumal es homebrewed
solutions häufig an wichtigen Details fehlt (z.B. kein Unterstützung
der Zwischenablage etc).
--
Immo Landwerth - Visual Studio 2003 - C# - XanaNews 1.16.3.1
Herfried K. Wagner [MVP]
2004-04-22 13:04:17 UTC
Permalink
Hallo Immo!
Post by Immo Landwerth
[MessageBox zentrieren]
Post by Herfried K. Wagner [MVP]
Die einzige Lösung, die ich sehe, ist über einen Win32-Dialog-Hook.
Das erscheint mir aber doch recht aufwendig, wenn man den beschränkten
Nutzen betrachtet.
Zumal das nicht Windows-konform ist.
ACK.
Post by Immo Landwerth
MessageBoxen waren seit jeher Desktop zentrisch. MS Access ist mir als
einzige Anwendung bekannt, die konsequent eine eigene MessageBox
verwendet (mit fettgedruckter Überschrift) die dann zentriert zu der
Anwendung erscheint. Komplett selber schreiben wäre also eine
Alternative zu einem Hook, zumal man dann sogar ohne P/Invoke auskäme.
Ist allerdings nicht minder aufwendig.
PInvoke bräuchte man lediglich für das Abspielen des Systemklangs
(Funktion 'MessageBeep').
--
Herfried K. Wagner [MVP]
<URL:http://dotnet.mvps.org/>
Immo Landwerth
2004-04-22 17:52:19 UTC
Permalink
Post by Herfried K. Wagner [MVP]
Post by Immo Landwerth
MessageBoxen waren seit jeher Desktop zentrisch. MS Access ist mir
als einzige Anwendung bekannt, die konsequent eine eigene MessageBox
verwendet (mit fettgedruckter Überschrift) die dann zentriert zu der
Anwendung erscheint. Komplett selber schreiben wäre also eine
Alternative zu einem Hook, zumal man dann sogar ohne P/Invoke
auskäme. Ist allerdings nicht minder aufwendig.
PInvoke bräuchte man lediglich für das Abspielen des Systemklangs
(Funktion 'MessageBeep').
Ich glaube wir reden an einander vorbei :)

Eigentlich wollte ich sagen, dass man für einen kompletten Nachbau
einer MessageBox komplett ohne PInvoke auskäme, wohingegen man für
einen Dialoghook PInvoke brauchen würde.

Mag sein, dass ich da auf dem Holzweg bin, noch bin ich in managed Code
relativ neu ;)
--
Immo Landwerth - Visual Studio 2003 - C# - XanaNews 1.16.3.1
Herfried K. Wagner [MVP]
2004-04-22 18:00:37 UTC
Permalink
Hallo Immo!
Post by Immo Landwerth
Post by Herfried K. Wagner [MVP]
PInvoke bräuchte man lediglich für das Abspielen des Systemklangs
(Funktion 'MessageBeep').
Ich glaube wir reden an einander vorbei :)
Eigentlich wollte ich sagen, dass man für einen kompletten Nachbau
einer MessageBox komplett ohne PInvoke auskäme, wohingegen man für
einen Dialoghook PInvoke brauchen würde.
Man braucht PInvoke eben für einen kompletten Nachbau auch, um den
entsprechenden "Meldungsklang" abzuspielen.
--
Herfried K. Wagner [MVP]
<URL:http://dotnet.mvps.org/>
Immo Landwerth
2004-04-22 19:44:44 UTC
Permalink
Post by Herfried K. Wagner [MVP]
Man braucht PInvoke eben für einen kompletten Nachbau auch, um den
entsprechenden "Meldungsklang" abzuspielen.
Ok, dann reden wir dieselbe Sprache ;)

Ich wusste allerdings nicht, dass man dafür P/Invoke benötigt.
--
Immo Landwerth - Visual Studio 2003 - C# - XanaNews 1.16.3.1
Pirmin G.
2004-04-22 22:27:07 UTC
Permalink
Hallo Immo

Ich kann im Prinzip auch Windows-konform "leben".
Ich wundere mich aber, warum es in der Visual-Studio-Help
so beschrieben wird, wie ich es realisieren wollte.

Unten ist ein Auszug aus den Hilfe-Seiten angezeigt.

Interpretiere ich die Hilfe falsch (habe noch wenig
Programmier-Erfahrung mit C#)?

Könnte mir jemand eine Beispiel-Anwendung schicken,
wo es funktioniert?

Wie erwähnt, ist es nicht so tragisch, wenn es nicht
funktioniert. Mit einer Lösung, auch wenn ich sie nicht
in meiner Anwendung nicht nutzen kann, könnte ich
wenigstens meine Neugierde, zu wissen was gemeint
ist, befriedigen.


Don't Worry It's Only Ones and Zeros!


################################

MessageBox.Show-Methode [C#]
Zeigt ein Meldungsfeld an.

Überladungsliste
Zeigt ein Meldungsfeld mit angegebenem Text an.
public static DialogResult Show(string);

Zeigt vor dem angegebenen Objekt ein Meldungsfeld mit dem angegebenen Text
an.
public static DialogResult Show(IWin32Window, string);

Zeigt ein Meldungsfeld mit dem angegebenen Text und der angegebenen
Beschriftung an.
public static DialogResult Show(string, string);

Zeigt vor dem angegebenen Objekt ein Meldungsfeld mit dem angegebenen Text
und der angegebenen Beschriftung an.
public static DialogResult Show(IWin32Window, string, string);

################################################
############ Wenn ich oben auf den Link klicke erscheint:

MessageBox.Show-Methode (IWin32Window, String, String) [C#]

Zeigt vor dem angegebenen Objekt ein Meldungsfeld mit dem angegebenen Text
und der angegebenen Beschriftung an.

public static DialogResult Show(
IWin32Window owner,
string text,
string caption
);

Parameter
owner Das IWin32Window, vor dem das Meldungsfeld angezeigt wird.
text Der im Meldungsfeld anzuzeigende Text.
caption Der in der Titelleiste des Meldungsfeldes anzuzeigende Text.

Rückgabewert Einer der DialogResult-Werte.

Hinweise
Mit dem owner-Parameter können Sie ein bestimmtes Objekt angeben, das die
IWin32Window-Schnittstelle implementiert, um das Meldungsfeld davor zu
platzieren. Bei einem Meldungsfeld handelt es sich um einen modalen Dialog,
d. h. nur die Objekte des modalen Formulars akzeptieren eine Eingabe
(Tastatur oder Mausklick). Das Programm muss ein modales Formular ausblenden
oder schließen (üblicherweise als Reaktion auf eine Benutzeraktion), bevor
eine Eingabe in ein anderes Formular vorgenommen werden kann.Im Meldungsfeld
wird standardmäßig eine Bestätigungsschaltfläche angezeigt.
Post by Immo Landwerth
[MessageBox zentrieren]
Post by Herfried K. Wagner [MVP]
Die einzige Lösung, die ich sehe, ist über einen Win32-Dialog-Hook.
Das erscheint mir aber doch recht aufwendig, wenn man den beschränkten
Nutzen betrachtet.
Zumal das nicht Windows-konform ist.
MessageBoxen waren seit jeher Desktop zentrisch. MS Access ist mir als
einzige Anwendung bekannt, die konsequent eine eigene MessageBox
verwendet (mit fettgedruckter Überschrift) die dann zentriert zu der
Anwendung erscheint. Komplett selber schreiben wäre also eine
Alternative zu einem Hook, zumal man dann sogar ohne P/Invoke auskäme.
Ist allerdings nicht minder aufwendig.
Ich persönlich mag es lieber Windows konform. Zumal es homebrewed
solutions häufig an wichtigen Details fehlt (z.B. kein Unterstützung
der Zwischenablage etc).
--
Immo Landwerth - Visual Studio 2003 - C# - XanaNews 1.16.3.1
Sascha Andres
2004-04-23 06:40:47 UTC
Permalink
Hallo,
Post by Pirmin G.
Zeigt ein Meldungsfeld mit dem angegebenen Text und der angegebenen
Beschriftung an.
public static DialogResult Show(string, string);
Zeigt vor dem angegebenen Objekt ein Meldungsfeld mit dem angegebenen Text
und der angegebenen Beschriftung an.
public static DialogResult Show(IWin32Window, string, string);
'Vor' bezieht sich da AFAIR auf die Z-Order, also die
Reihenfolge der Fenster vom Grund weg, und die Modalität der
Form.

-sa
--
http://www.livingit.de
http://www.mobile-bookmarks.info
http://www.not2long.net
Immo Landwerth
2004-04-23 07:48:43 UTC
Permalink
Post by Pirmin G.
Interpretiere ich die Hilfe falsch (habe noch wenig
Programmier-Erfahrung mit C#)?
Ich glaube schon ;)

[OH]

| Mit dem owner-Parameter können Sie ein bestimmtes Objekt angeben, das
| die IWin32Window-Schnittstelle implementiert, um das Meldungsfeld
| davor zu platzieren. Bei einem Meldungsfeld handelt es sich um einen
| modalen Dialog, d. h. nur die Objekte des modalen Formulars
| akzeptieren eine Eingabe (Tastatur oder Mausklick). Das Programm muss
| ein modales Formular ausblenden oder schließen (üblicherweise als
| Reaktion auf eine Benutzeraktion), bevor eine Eingabe in ein anderes
| Formular vorgenommen werden kann.Im Meldungsfeld wird standardmäßig
| eine Bestätigungsschaltfläche angezeigt.

Alos, mit owner wird lediglich gesteuert, welches Fenster durch die
MessageBox "blockiert" werden soll (modaler Dialog).

Zusätzlich geht es um die Z-Order, also welches Fenster "vor" welchem
anderen liegt. Es gibt Anwendungen, bei denen durch weglassen dieses
Parameters ein interessante Effekt entstehen kann: Die MessageBox poppt
hinter dem aktuellen Arbeitsfenster auf. Der Benutzer wundert sich
dann, warum seine Anwendung nicht mehr reagiert und jeder Versuch den
Fokus wieder ins Fenster zu bekommen mit einem System Ton quittiert
wird.

Der owner parameter steuert aber nicht, vor welchem Fenster die
MessageBox zentriert wird. Die MessageBox wird immer auf dem aktuellen
Monitor zentriert ausgegeben (abhängig vom Mousecursor).
--
Immo Landwerth - Visual Studio 2003 - C# - XanaNews 1.16.3.1
Loading...