Toon posts:

[C#] String weergeven zonder form*

Pagina: 1
Acties:

Verwijderd

Topicstarter
Wat ik graag wil:
Een text scherm breed weergeven in het midden van het scherm, zonder dat deze de focus kan krijgen. Zodat alle andere vensters eronder gewoon gebruikt kunnen worden alsof de text er niet staat.

Ik heb dit geprobeerd door form te maximizen en onzichtbaar te maken (opacity 0) en dan in het midden een DrawString. Op zich gaat dit goed, alleen de string is zichtbaar. Het probleem is alleen dat het hele form on top is en dus de focus heeft. Onderliggende forms kunnen niet meer gebruikt worden.

Weet iemand een oplossing of een andere manier?

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Direct painten op het scherm?

Sole survivor of the Chicxulub asteroid impact.


Verwijderd

Topicstarter
Ja idd, is dat mogelijk?

  • sanfranjake
  • Registratie: April 2003
  • Niet online

sanfranjake

Computers can do that?

(overleden)
Dit heeft weinig met Software te maken, maar eerder met programmeren. Software Algemeen > Programming & Webscripting

Wat heb je verder zelf allemaal al geprobeerd? Wat lukte er allemaal niet? Dat zien we graag, zonder is dit nogal lastig om je mee te helpen. Zie ook de Policy: Alle regels die op het forum gelden :)

Mijn spoorwegfotografie
Somda - Voor en door treinenspotters


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

in C++ kun je alleszins de DeviceContext opvragen van de hele display met GetDC(NULL) (of zoiets).

in C# zal je even moeten zoeken.

ASSUME makes an ASS out of U and ME


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 16:25

curry684

left part of the evil twins

HIGHGuY schreef op woensdag 12 oktober 2005 @ 22:21:
in C++ kun je alleszins de DeviceContext opvragen van de hele display met GetDC(NULL) (of zoiets).
GetDC(NULL) is 'm exact :) Niet vergeten vrij te geven overigens:
After painting with a common DC, the ReleaseDC function must be called to release the DC. Class and private DCs do not have to be released. ReleaseDC must be called from the same thread that called GetDC. The number of DCs is limited only by available memory.

Windows 95/98/Me: There are only 5 common DCs available per thread, thus failure to release a DC can prevent other applications from accessing one.
In C# kun je de static functie System.Drawing.Graphics.FromHwnd gebruiken in combinatie met de Win32 functie GetDesktopWindow om de handle van de desktop te verkrijgen, maar dan moet je dus met Win32 interfacen. Een zuivere .NET oplossing ken ik zelf niet.

Zie hier overigens hoe je GetDesktopWindow in .NET kunt gebruiken :)

[ Voor 7% gewijzigd door curry684 op 13-10-2005 00:06 ]

Professionele website nodig?


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Titelfix. GoT is een Nederlands forum, dus met uitzondering van vaktermen gebruiken we ook gewoon de Nederlandse taal waar mogelijk. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
Bedankt voor de replies, dit gaat al de goede kant op. Ik heb wat in elkaar gezet, het compileerd en runt wel, maar ik zie niets in mijn beeld verschijnen.. Wat doe ik fout?

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;
using System.Runtime.InteropServices;
using System.Drawing;

public class APITest
{
    public APITest(){}

    [DllImport("user32.dll", EntryPoint="GetDesktopWindow")]
    public static extern IntPtr GetDesktopWindow();

    public void ShowText(string s)
    {
        Graphics desktopWindow = Graphics.FromHwnd(GetDesktopWindow());
        desktopWindow.DrawString(s, new Font("Verdana",50), new SolidBrush(Color.Tomato),100,100);
    }
}

[ Voor 5% gewijzigd door NMe op 13-10-2005 01:24 . Reden: Code tags toegevoegd. Doe je dat de volgende keer zelf even? :) ]


  • SlowMeDown
  • Registratie: Mei 2003
  • Laatst online: 15-04 08:14
Jij moet geen FromHwnd gebruikten, maar FromHdc. Je hebt namelijk een device context nodig en geen windows handle. Probeer de code hieronder eens.
C#:
1
2
3
4
5
[DllImport("user32.dll")] 
static extern IntPtr GetDesktopWindow(); 
        
[DllImport("user32.dll")] 
static extern IntPtr GetDCEx(IntPtr hwnd, IntPtr hrgn, uint flags); 

en
C#:
1
2
3
4
5
6
IntPtr hdc = GetDCEx(GetDesktopWindow(), IntPtr.Zero, 1027); 

using(Graphics g = Graphics.FromHdc(hdc)) 
{ 
  g.FillEllipse(Brushes.Red, 0, 0, 400, 400); 
}

[ Voor 9% gewijzigd door SlowMeDown op 13-10-2005 08:44 ]


Verwijderd

Topicstarter
Gaaf dit werkt! Maar nu probeerde ik de string die ik getekend had weer weg te halen. Met de clear functie wordt het hele scherm gevuld met een kleur, niet echt een optie. Met dispose gebeurd er verder niets. Het opnieuw van de device context werkt bij mij ook niet.

Hoe zou ik dit kunnen doen? Of in welke richting moet ik zoeken. Is er niet zoiets als een undo functie in het Graphics object (ik heb het nog niet kunnen vinden) of een clear die niet alles vult met een kleur.

Verwijderd

Je moet windows de opdracht geven het venster weer opnieuw te tekenen. Ik weet in ieder geval de WIN32 aanroepen namelijk: UpdateWindow or RedrawWindow.
Die staan in de User32.dll library.

Maar er ook wel een .NET versie voor zijn.

[ Voor 3% gewijzigd door Verwijderd op 13-10-2005 10:45 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
InvalidateRect zou ik zeggen.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
Ik heb InvalidateRect en UpdateWindow geprobeerd, maar de 'Hallo!' tekst blijft gewoon in beeld staan. Het lijkt dat er geen refresh is, misschien heb ik niet de juiste window te pakken.. in C# zal toch ook wel zoiets zitten?

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System;
using System.Runtime.InteropServices;
using System.Drawing;

public class APITest
{
    public APITest(){}

    [DllImport("user32.dll")] 
    static extern IntPtr GetDesktopWindow(); 
        
    [DllImport("user32.dll")] 
    static extern IntPtr GetDCEx(IntPtr hwnd, IntPtr hrgn, uint flags);

    [DllImport("User32.dll")]
    public static extern int InvalidateRect(IntPtr hwnd,  IntPtr hRgn, bool bErase);

    [DllImport("User32.dll")]
    public static extern bool UpdateWindow(IntPtr hwnd);    

    private Graphics g;
    private IntPtr hwnd;

    public void ShowText(string s)
    {
        if(g == null)
        {
            hwnd = GetDesktopWindow();
            IntPtr hdc = GetDCEx(hwnd, IntPtr.Zero, 1027); 
            g = Graphics.FromHdc(hdc);
        }
        
        if(g != null)
            g.DrawString(s, new Font("Verdana",50), new SolidBrush(Color.Tomato),100,100);
    }

    public void Remove()
    {
        if(g != null)
        {
            System.Windows.Forms.MessageBox.Show(InvalidateRect(hwnd, IntPtr.Zero, true).ToString());
            System.Windows.Forms.MessageBox.Show(UpdateWindow(hwnd).ToString());
        }
    }
}

[ Voor 14% gewijzigd door Verwijderd op 15-10-2005 18:41 ]


  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

offtopic:
[\code=C#] moet zijn [/code] :)

Sole survivor of the Chicxulub asteroid impact.


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

geef aub je Graphics object vrij nadat je het hebt gebruikt.

de resources mbt DC's zijn beperkt afaik.

ASSUME makes an ASS out of U and ME


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 16:25

curry684

left part of the evil twins

Had ik ook verder helemaal niet gezegd :X 8)7

Professionele website nodig?

Pagina: 1