Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Erstellen von Fenstern (https://www.delphipraxis.net/49165-erstellen-von-fenstern.html)

Cicaro 6. Jul 2005 14:10


Erstellen von Fenstern
 
Hallo erstmal !

Wie der Title schon sagt will ich Fenster erstellen und zwar ohne Formulare zu verwenden.
Ich hab' es schon mit Windows.CreateWindow() und Windows.CreateWindowEx() probiert aber irgendwie klappt das nicht, denn ich erhalte immer nur das Handle des Desktops. Es muss irgendwie an den Parametern liegen, die ich übergebe. Ich weiß zum Beispiel nicht was für 'ne Class ich angeben soll.

Also bitte ich um ein 'richtig' funktionierendes Beispiel für den Aufruf dieser Funktion. Danke !

P.s.: Falls ich irgendetwas missverstanden habe, hier mein Ziel: ich will eine Zeichenfläche auf dem Desktop initiieren, auf der ich zeichnen kann ohne den Desktop zu beschmieren. Wenn ich das Fenster also irgendwann freigebe, soll der Desktop davon wie unberührt bleiben.

JasonDX 6. Jul 2005 14:14

Re: Erstellen von Fenstern
 
Ohne Formulare zu verwenden (also nonVCL) musst du auf die API zurückgreifen.
CreateWindow ist der richtige Ansatz, aber noch nicht genug ;)
Stichworte: WNDClass/WNDClassEx und RegisterWndClass oder so ähnlich
schau im fall mal in die MSDN, dort ist sicher ein Beispiel, wie man ein Fenster erstellt
(Wenne keins findest: Such bei den Tutorials für DirectX, dort ist auch ein beispiel dabei ;) )

Luckie 6. Jul 2005 14:19

Re: Erstellen von Fenstern
 
Hier gibt es eine Anleitung, wie es geht.

Cicaro 25. Jul 2005 09:52

Re: Erstellen von Fenstern
 
@Luckie: Das hat geholfen. Danke!

Aber kann ich auch ein Fenster erstellen, das sich nicht immer wieder neuzeichnet, bevor ich die WM_PAINT Message empfange ? Ich will nämlich mein Fenster mit Hilfe von WM_MOUSEMOVE bewegen. Ich rufe also MoveWindow(Wnd,x,y,Width,Height,True) auf. Wegen des True wird es dann auch gezeichnet. Nur die WM_PAINT Message wird gesendet, wenn das Fenster schon leer gezeichnet wurde.

Bei TForm umgeht man solches Flackern einfach mit DoubleBuffered:=True, aber wie geht das bei diesen Fenstern ?

Olli 25. Jul 2005 10:13

Re: Erstellen von Fenstern
 
Moment, das Fenster bewegt sich selbst? Oder wie müssen wir uns das vorstellen? Geschieht es durch das Fenster selbst oder geschieht es von außen?

Cicaro 25. Jul 2005 10:43

Re: Erstellen von Fenstern
 
Zitat:

Zitat von Olli
Moment, das Fenster bewegt sich selbst? Oder wie müssen wir uns das vorstellen? Geschieht es durch das Fenster selbst oder geschieht es von außen?

Das Fenster bewegt sich selbst, wenn der Benutzer die Maus über das Fenster bewegt und die linke Maustaste gedrückt hält
Hier meine Fensterprozedur:
Delphi-Quellcode:
var
 DC,SaveDC:HDC;
 SaveBitmap:HBITMAP;
 Map:Cardinal; // unwichtig

function WndProc(Win:HWND;uMsg:UINT;wParam:wParam;lParam:lParam):lResult;stdcall;
var
 P:Windows.TPoint;
begin
 Result:=0;
 case uMsg of
   WM_CREATE:begin
              DC:=GetDC(Win);
              SaveDC:=CreateCompatibleDC(DC);
              SaveBitmap:=CreateBitmap(GetMapWidth(Map),GetMapHeight(Map),1,24,nil);
              SaveBitmap:=SelectObject(SaveDC,SaveBitmap);
              DrawSmallMap(Map,SaveDC,0,0);// irgendeine Graifik wird auf SaveDC gezeichnet
             end;
   WM_PAINT:BitBlt(DC,(WindowWidth-GetMapWidth(Map)) div 2,(WindowHeight-GetMapHeight(Map)) div 2,GetMapWidth(Map),GetMapHeight(Map),SaveDC,0,0,SRCCOPY);
   WM_MOUSEMOVE:if wParam=1 then
                 begin
                  GetCursorPos(P);
                  MoveWindow(Win,P.X-WindowWidth div 2,P.Y-WindowHeight div 2,WindowWidth,WindowHeight,True);
                 end;
   WM_DESTROY:begin
               DeleteObject(SaveBitmap);
               DeleteDC(SaveDC);
               ReleaseDC(Win,DC);
               PostQuitMessage(0);
              end;
   else Result:=DefWindowProc(Win,uMsg,wParam,lParam);
  end;
end;

Olli 25. Jul 2005 10:48

Re: Erstellen von Fenstern
 
... Ähem ... du willst also nix weiter als Dragging implementieren? Dann mußt du bei WM_NCHITTEST nut HTCAPTION zurückgeben, wenn auf einer bestimmten Stelle die Maus ist, wo dieses Dragging implementiert werden soll. Habe ich in verschiedenen Apps auf meiner Webseite implementiert.

Cicaro 25. Jul 2005 11:07

Re: Erstellen von Fenstern
 
Mag sein ... aber zunächsteinmal soll das Bild des Fensters aufhören zu flackern.

Olli 25. Jul 2005 11:25

Re: Erstellen von Fenstern
 
Zitat:

Zitat von Cicaro
Mag sein ... aber zunächsteinmal soll das Bild des Fensters aufhören zu flackern.

Tja, wenn du es so nicht machen willst, will ich dir auch nicht helfen (Zeitmangel mich in deinen Code reinzulesen). Du würdest dir mit dieser alten und effektiven Methode allerdings ne Menge Arbeit sparen, weil du dich dank fehlendem MoveWindow nicht auf das Neuzeichnen konzentrieren mußt.

Flocke 25. Jul 2005 12:06

Re: Erstellen von Fenstern
 
1. Gibt den DC in WM_CREATE mit ReleaseDC wieder frei
2. Nutze in WM_PAINT die Befehle BeginPaint/EndPaint und nutze den DC, den du dort im TPaintStruct bekommst.
3. Normalerweise holt man sich dort auch mit GetClientRect die Größe des Fensters (es sei denn man kann die Größe nicht ändern)
4. Fange WM_ERASEBKGND ab und lösche nur die Hintergrundteile, die nicht von deiner Bitmap überdeckt sind (dann hört sicher das Flackern auf).

Du solltest dir die Beschreibung der Fenstermeldungen noch einmal ansehen ( z.B. http://msdn.microsoft.com/library/de...tdraw_7b78.asp, vielleicht auch ein einfaches Beispiel eines C-Programms.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:29 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