Text Mittig, in Vordergrund und entfernen

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Fakiz.

    Text Mittig, in Vordergrund und entfernen

    Hallo,
    ich habe vor ein kleines Tool zu schreiben, indem man Programme in Fenstermodus abspielen kann.

    3 Probleme:

    1. Es steht dort "Bitte warten..." gezeichnet mit "GDI?".
    Code:

    VB.NET-Quellcode

    1. e.Graphics.DrawString("Bitte warten...", New Font("Arial", 10, FontStyle.Bold), Brushes.Red, 10, 10)


    Das soll aber nun in der Mitte des Panels... Wie funktioniert das?
    -> Danke an @Fakiz (Kommentar unten)

    Außerdem, sobald dort dann die Application im Panel ist, ist der Text im Hintergrund. Ist es möglich auch im Vordergrund zu positionieren?

    Und wie kann ich Zeichnungen auch wieder entfernen? ->> Gelöst

    VB.NET-Quellcode

    1. Panel1.Invalidate()



    Ich wollte keine 500 Beiträge eröffnen, darum schreib ich einfach alles hier rein.
    Danke im Vorraus
    mit freundlichen Grüßen
    PepsiMax

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „PepsiMax“ ()


    Das soll aber nun in der Mitte des Panels... Wie funktioniert das?


    Somit ist leuten geholfen die den Thread finden.
    Spoiler anzeigen

    Möglichkeit 1#

    C#-Quellcode

    1. protected override void OnPaint(PaintEventArgs e)
    2. {
    3. e.Graphics.DrawString("Hallo Welt", new Font("arial", 10f), new SolidBrush(Color.Black), this.ClientRectangle, CenterText());
    4. base.OnPaint(e);
    5. }
    6. private StringFormat CenterText()
    7. {
    8. StringFormat stringFormat = new StringFormat();
    9. stringFormat.Alignment = StringAlignment.Center;
    10. stringFormat.LineAlignment = StringAlignment.Center;
    11. return stringFormat;
    12. }


    Möglichkeit 2#

    C#-Quellcode

    1. protected override void OnPaint(PaintEventArgs e)
    2. {
    3. DrawText(e);
    4. base.OnPaint(e);
    5. }
    6. private void DrawText(PaintEventArgs e)
    7. {
    8. System.Windows.Forms.TextRenderer.DrawText(
    9. e.Graphics,
    10. "Hallo Welt",
    11. new Font("arial", 10f),
    12. this.ClientRectangle,
    13. Color.Black,
    14. System.Windows.Forms.TextFormatFlags.VerticalCenter | System.Windows.Forms.TextFormatFlags.HorizontalCenter | System.Windows.Forms.TextFormatFlags.WordEllipsis
    15. );
    16. }



    Was meinst du denn genau mit?
    sobald dort dann die Application im Panel ist


    Und wie kann ich Zeichnungen auch wieder entfernen?

    Dafür muss die Form neu gezeichnet werden. Problem ist dann allerdings vermutlich das der Text wieder gezeichnet wird. Also bnötigst du noch eine Abfrage ob der Text gezeichnet werden soll oder nicht.
    Danke! <3

    sobald dort dann die Application im Panel ist ->
    Prozess in die eigene Anwendung einbetten und wieder freigeben.
    Dort wird erklärt, dass man Application/Programme in den Panel einbinden kann. Der Text kommt und wenn dann Notepad in Panel ist, ist der Punkt im Hintergrund.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „PepsiMax“ ()

    oliver3121 schrieb:

    Hallo, über Controler zu zeichnen geht auch irgendwie und ich hatte das auch mal gemacht, ist aber nicht einfach. Wieso machst Du Dir die Sache nicht
    einfacher, indem Du Deinen Text einfach an ein Label übergibst, das Du simpel mit BringtoFront nach vorne ziehst?


    Da gibt es natürlich auch ein Problem.. Doofen Hintergrund vom Label.
    Und ich finde einfach keine Lösung, den Label mittig des Panels zu setzen..^^
    Und ich möchte GDI bisschen mehr kennenlernen :D


    Sieht halt nicht schön aus.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „PepsiMax“ ()

    Also ein Label kann man in einem TabellayoutPlanel sehr gut zentrieren. Geht über die Labeleigenschaften. Sieht trotzdem nicht nett aus mit dem Hintergrund.
    Hatte bei mir eben mal nachgeschaut, aber mein Versuchsprojekt nicht gefunden. Glaube mich aber vage zu erinnern, wieso ich von der Idee über einem Controler zu zeichnen wieder abgekommen war. Und zwar funktioniert dann - vielleicht stimmt das ja nicht- das antialising nicht mehr. Aber google mal zum Thema 'über controler zeichnen'.
    Schönes Wochenende
    Habs jetzt grad mal selbst versucht.

    Spoiler anzeigen

    Klasse für p/Invokes

    C#-Quellcode

    1. public static class NativeMethodes
    2. {
    3. // GetWindowDC gibt dir das Hdc des Eingebetteten Fensters
    4. [DllImport("user32.dll")]
    5. public static extern IntPtr GetWindowDC(IntPtr hWnd);
    6. [DllImport("user32.dll")]
    7. public static extern IntPtr ShowWindow(IntPtr hWnd, int flag);
    8. [DllImport("user32.dll")]
    9. public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
    10. }


    Der Teil von Mikes Tutorial
    Spoiler anzeigen

    C#-Quellcode

    1. public static class ImportApplication
    2. {
    3. private const int SW_NORMAL = 1;
    4. private const int SW_MAXIMIZE = 3;
    5. public static IntPtr CurrWindowHandle { get; private set;}
    6. public static void SetApplicationAsChild(string CallingApplication, System.Windows.Forms.Panel targetPanel)
    7. {
    8. System.Diagnostics.Process p = Process.GetProcessesByName(CallingApplication)[0];
    9. if (p.MainWindowHandle != null) {
    10. NativeMethodes.SetParent(p.MainWindowHandle, targetPanel.Handle);
    11. NativeMethodes.ShowWindow(p.MainWindowHandle, SW_MAXIMIZE);
    12. CurrWindowHandle = p.MainWindowHandle;
    13. }
    14. else
    15. throw new Exception("Kein gültiges Fensterhandle - Anwendung kann nicht eingebettet werden.");
    16. }
    17. public static void ReleaseApplicationAsChild()
    18. {
    19. if (CurrWindowHandle != IntPtr.Zero) {
    20. NativeMethodes.SetParent(CurrWindowHandle, IntPtr.Zero);
    21. NativeMethodes.ShowWindow(CurrWindowHandle, SW_NORMAL);
    22. CurrWindowHandle = IntPtr.Zero;
    23. }
    24. }
    25. }


    Importierung der "Anwendung"

    C#-Quellcode

    1. private void dataListView1_SelectedIndexChanged(object sender, EventArgs e)
    2. {
    3. ImportApplication.ReleaseApplicationAsChild();
    4. ImportApplication.SetApplicationAsChild(dataListView1.SelectedItems[0].Text, panel1);
    5. DrawOver();
    6. }


    Über die importierte Anwendung malen

    C#-Quellcode

    1. private void DrawOver()
    2. {
    3. if (ImportApplication.CurrWindowHandle == IntPtr.Zero)
    4. return;
    5. IntPtr pHdc = NativeMethodes.GetWindowDC(ImportApplication.CurrWindowHandle);
    6. using (Graphics g = Graphics.FromHdc(pHdc)) {
    7. g.DrawString("Hallo Welt", new Font("arial", 10f, FontStyle.Bold), new SolidBrush(Color.Red), panel1.ClientRectangle, CenterText());
    8. }
    9. }

    Bilder
    • preview.png

      52,13 kB, 734×429, 96 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Fakiz“ ()