AGB  ·  Datenschutz  ·  Impressum  







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

Erstellen von Fenstern

Ein Thema von Cicaro · begonnen am 6. Jul 2005 · letzter Beitrag vom 25. Jul 2005
Antwort Antwort
Cicaro

Registriert seit: 9. Feb 2005
285 Beiträge
 
Delphi 7 Personal
 
#1

Erstellen von Fenstern

  Alt 6. Jul 2005, 14:10
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.
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#2

Re: Erstellen von Fenstern

  Alt 6. Jul 2005, 14:14
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 )
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Erstellen von Fenstern

  Alt 6. Jul 2005, 14:19
Hier gibt es eine Anleitung, wie es geht.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Cicaro

Registriert seit: 9. Feb 2005
285 Beiträge
 
Delphi 7 Personal
 
#4

Re: Erstellen von Fenstern

  Alt 25. Jul 2005, 09:52
@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 ?
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#5

Re: Erstellen von Fenstern

  Alt 25. Jul 2005, 10:13
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?
  Mit Zitat antworten Zitat
Cicaro

Registriert seit: 9. Feb 2005
285 Beiträge
 
Delphi 7 Personal
 
#6

Re: Erstellen von Fenstern

  Alt 25. Jul 2005, 10:43
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;
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#7

Re: Erstellen von Fenstern

  Alt 25. Jul 2005, 10:48
... Ä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.
  Mit Zitat antworten Zitat
Cicaro

Registriert seit: 9. Feb 2005
285 Beiträge
 
Delphi 7 Personal
 
#8

Re: Erstellen von Fenstern

  Alt 25. Jul 2005, 11:07
Mag sein ... aber zunächsteinmal soll das Bild des Fensters aufhören zu flackern.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#9

Re: Erstellen von Fenstern

  Alt 25. Jul 2005, 11:25
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.
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

Re: Erstellen von Fenstern

  Alt 25. Jul 2005, 12:06
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.
Volker
  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 06:08 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