Window aktualisieren

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Justy
Beiträge: 131
Registriert: 10.09.2004 13:31
Wohnort: Feldbach / Steiermark / Österreich
Kontaktdaten:

Window aktualisieren

Beitrag von Justy »

Hallo!

Wie kann ich ein Fenster so aktualisieren, dass alles was mit den PB-Draw-Befehlen raufgezeichnete verschwindet und ich wieder was neues Draufmalen kann? Auf dem Window befinden sich auch Gadgets.

Alternativ wüsste ich gerne wie man mit den DC-Befehlen der WinAPI eine Outline-Box zeichnen und wieder löschen kann!

mfg. Justy
Am Anfang erschuf der Mensch Gott.
Friedrich Nietzsche
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Zeichne doch lieber (anstatt direkt auf das Fenster) auf ein ImageGadget. ;)
Ist praktischer und besser zu handhaben. Es sei denn du schreibst dir einen Callback mit "WS_PAINT" Message der dir den kaputten Inhalt wiederherstellt.
Ansonsten versuch es mal mit UpdateWindow_(hwnd). Oder einfach mal die WinAPI nach Redraw, Refresh, Update Window und sowas durchsuchen.

//EDIT:
Zur 2ten Frage:

Code: Alles auswählen

hwnd = OpenWindow(0, 200, 200, 300, 300, #PB_Window_Systemmenu, "Nix")

DC.l = GetDC_(hwnd)
SelectObject_(dc, GetStockObject_(#BLACK_PEN))
SelectObject_(dc, CreateSolidBrush_(GetSysColor_(#COLOR_3DFACE)))
Rectangle_(DC, 20, 20, 200, 200);
Repeat

Until WaitWindowEvent() = #PB_EVENT_CLOSEWINDOW
ReleaseDC_(hwnd, dc)
Was die Farben betrifft, des Brushs, da bin ich mir nicht ganz sicher was man da nimmt. Durch Ausprobieren hab ich diese als meine Window-Farbe gefunden und somit siehts jetzt aus als wenn das Viereck ohne Füllung wäre. Wenn du tatsächlich keine Füllung willst solltest du entweder Polygone nehmen, da kann man ja die Füllmethode angeben, oder aber 4 Linien zu einem Viereck ziehen. ;)
Ansonsten gehen die WinAPI Befehle mit den Device Contexts in PB genauso wie in anderen Sprachen.
Benutzeravatar
Justy
Beiträge: 131
Registriert: 10.09.2004 13:31
Wohnort: Feldbach / Steiermark / Österreich
Kontaktdaten:

Beitrag von Justy »

Sunny hat geschrieben:Zeichne doch lieber (anstatt direkt auf das Fenster) auf ein ImageGadget. ;)
Ist praktischer und besser zu handhaben.
Würde ich liebend gern machen, geht in dem Fall aber leider nicht :(
Sunny hat geschrieben:Ansonsten versuch es mal mit UpdateWindow_(hwnd).
Der Befehl hilft nichts, da er nur eine #WM_PAINT Message an das Programm schickt. Die wiederum hilft mir nichts weil ich nicht weiß wie ich das Window löschen kann um es neuzuzeichnen!
Sunny hat geschrieben:Oder einfach mal die WinAPI nach Redraw, Refresh, Update Window und sowas durchsuchen.
Ich habe den Befehl "RedrawWindow" gefunden, aber der hat soviele Flags dass ich nicht weiß welches ich nehmen soll!

Hier mal die Hilfe dazu:

Code: Alles auswählen

The RedrawWindow function updates the specified rectangle or region in a window’s client area. 

BOOL RedrawWindow(

    HWND hWnd,	// handle of window
    CONST RECT *lprcUpdate,	// address of structure with update rectangle
    HRGN hrgnUpdate,	// handle of update region
    UINT flags 	// array of redraw flags
   );	
Parameters

hWnd

Identifies the window to be redrawn. If this parameter is NULL, the desktop window is updated. 

lprcUpdate

Points to a RECT structure containing the coordinates of the update rectangle. This parameter is ignored if the hrgnUpdate parameter identifies a region. 

hrgnUpdate

Identifies the update region. If both the hrgnUpdate and lprcUpdate parameters are NULL, the entire client area is added to the update region. 

flags

Specifies one or more redraw flags. This parameter can be a combination of flags that invalidate or validate a window, control repainting, and control which windows are affected by RedrawWindow. 
The following flags are used to invalidate the window: 

Flag (invalidation)	Description
RDW_ERASE	Causes the window to receive a WM_ERASEBKGND message when the window is repainted. The RDW_INVALIDATE flag must also be specified; otherwise, RDW_ERASE has no effect.
RDW_FRAME	Causes any part of the nonclient area of the window that intersects the update region to receive a WM_NCPAINT message. The RDW_INVALIDATE flag must also be specified; otherwise, RDW_FRAME has no effect. The WM_NCPAINT message is typically not sent during the execution of RedrawWindow unless either RDW_UPDATENOW or RDW_ERASENOW is specified.
RDW_INTERNALPAINT	Causes a WM_PAINT message to be posted to the window regardless of whether any portion of the window is invalid.
RDW_INVALIDATE	Invalidates lprcUpdate or hrgnUpdate (only one may be non-NULL). If both are NULL, the entire window is invalidated.
The following flags are used to validate the window: 

Flag (validation)	Description
RDW_NOERASE	Suppresses any pending WM_ERASEBKGND messages.
RDW_NOFRAME	Suppresses any pending WM_NCPAINT messages. This flag must be used with RDW_VALIDATE and is typically used with RDW_NOCHILDREN. RDW_NOFRAME should be used with care, as it could cause parts of a window to be painted improperly.
RDW_NOINTERNALPAINT	Suppresses any pending internal WM_PAINT messages. This flag does not affect WM_PAINT messages resulting from a non-NULL update area.
RDW_VALIDATE	Validates lprcUpdate or hrgnUpdate (only one may be non-NULL). If both are NULL, the entire window is validated. This flag does not affect internal WM_PAINT messages.
The following flags control when repainting occurs. RedrawWindow will not repaint unless one of these flags is specified. 

Flag	Description
RDW_ERASENOW	Causes the affected windows (as specified by the RDW_ALLCHILDREN and RDW_NOCHILDREN flags) to receive WM_NCPAINT and WM_ERASEBKGND messages, if necessary, before the function returns. WM_PAINT messages are received at the ordinary time.
RDW_UPDATENOW	Causes the affected windows (as specified by the RDW_ALLCHILDREN and RDW_NOCHILDREN flags) to receive WM_NCPAINT, WM_ERASEBKGND, and WM_PAINT messages, if necessary, before the function returns.
By default, the windows affected by RedrawWindow depend on whether the given window has the WS_CLIPCHILDREN style. Child windows that are not the WS_CLIPCHILDREN style are unaffected; non-WS_CLIPCHILDREN windows are recursively validated or invalidated until a WS_CLIPCHILDREN window is encountered. The following flags control which windows are affected by the RedrawWindow function: 

Flag	Description
RDW_ALLCHILDREN	Includes child windows, if any, in the repainting operation.
RDW_NOCHILDREN	Excludes child windows, if any, from the repainting operation.
Return Values

If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError. 

Remarks

When RedrawWindow is used to invalidate part of the desktop window, the desktop window does not receive a WM_PAINT message. To repaint the desktop, an application uses the RDW_ERASE flag to generate a WM_ERASEBKGND message. 
Sunny hat geschrieben://EDIT:
Zur 2ten Frage:

Code: Alles auswählen

hwnd = OpenWindow(0, 200, 200, 300, 300, #PB_Window_Systemmenu, "Nix")

DC.l = GetDC_(hwnd)
SelectObject_(dc, GetStockObject_(#BLACK_PEN))
SelectObject_(dc, CreateSolidBrush_(GetSysColor_(#COLOR_3DFACE)))
Rectangle_(DC, 20, 20, 200, 200);
Repeat

Until WaitWindowEvent() = #PB_EVENT_CLOSEWINDOW
ReleaseDC_(hwnd, dc)
Was die Farben betrifft, des Brushs, da bin ich mir nicht ganz sicher was man da nimmt. Durch Ausprobieren hab ich diese als meine Window-Farbe gefunden und somit siehts jetzt aus als wenn das Viereck ohne Füllung wäre. Wenn du tatsächlich keine Füllung willst solltest du entweder Polygone nehmen, da kann man ja die Füllmethode angeben, oder aber 4 Linien zu einem Viereck ziehen. ;)
Ansonsten gehen die WinAPI Befehle mit den Device Contexts in PB genauso wie in anderen Sprachen.
Ich benötige tatsächlich "echte" Transparenz, denn es soll ein Rahmen um Gadgets gezeichnet werden!
Das Prog soll mal sone Art "Window Editor" werden, also wo man selbst Gadgets plazieren kann. Irgenwie will ich aber nicht dass das Projekt an sowas banalem einem nicht löschbaren windowinhalt stirbt!

Achja:

Code: Alles auswählen

HideWindow(#Window_0,1)
HideWindow(#Window_0,0)
geht nicht, danach kann man nichts mehr aufs Window zeichnen :?

Trotzdem Danke für die Hilfe!
mfg. Justy
Am Anfang erschuf der Mensch Gott.
Friedrich Nietzsche
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

Probier doch das Window komplett zu closen und zu reopenen. :)
Benutzeravatar
Justy
Beiträge: 131
Registriert: 10.09.2004 13:31
Wohnort: Feldbach / Steiermark / Österreich
Kontaktdaten:

Beitrag von Justy »

125 hat geschrieben:Probier doch das Window komplett zu closen und zu reopenen. :)
Gute Idee, aber wenn ich nach jeder Markierung den kompletten Window-Aufbau neu starte ist es vielleicht nicht unbedingt vorteilhaft <)
Am Anfang erschuf der Mensch Gott.
Friedrich Nietzsche
Benutzeravatar
Dostej
Beiträge: 529
Registriert: 01.10.2004 10:02
Kontaktdaten:

Beitrag von Dostej »

Was Du machen kannst ist dem Fenster nen Hintergrund zu geben (mit der Skinwin (=Teil der PureTools)). Das legts Du ein Bild als Fensterhintergrund. UNd auf das Bild kannst Du malen. Sollte n Versuch wert sein
Benutzeravatar
Justy
Beiträge: 131
Registriert: 10.09.2004 13:31
Wohnort: Feldbach / Steiermark / Österreich
Kontaktdaten:

Beitrag von Justy »

Dostej hat geschrieben:Was Du machen kannst ist dem Fenster nen Hintergrund zu geben (mit der Skinwin (=Teil der PureTools)). Das legts Du ein Bild als Fensterhintergrund. UNd auf das Bild kannst Du malen. Sollte n Versuch wert sein
Ich fürchte das ist zu kompliziert bzw. zu aufwendig!

Es kann doch nicht sein dass es keinen Befehl gibt der einfach ein Window neu aufbaut :freak:
Wie machen denn die ganzen Editoren das???

mfg. Justy
Am Anfang erschuf der Mensch Gott.
Friedrich Nietzsche
Leo
Beiträge: 420
Registriert: 26.10.2004 18:26

Beitrag von Leo »

Justy hat geschrieben:
Sunny hat geschrieben:Zeichne doch lieber (anstatt direkt auf das Fenster) auf ein ImageGadget. ;)
Ist praktischer und besser zu handhaben.
Würde ich liebend gern machen, geht in dem Fall aber leider nicht :(
Ja.. ähm.. warum denn nicht?! <)
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

Justy hat geschrieben:Es kann doch nicht sein dass es keinen Befehl gibt der einfach ein Window neu aufbaut :freak:

Code: Alles auswählen

Procedure RedrawWindow(hWin)
  If hWin
    InvalidateRect_(hWin,0,1)
    UpdateWindow_(hWin)
  EndIf
EndProcedure
Benutzt Du dann z.B. so:
RedrawWindow(WindowID(1))
RedrawWindow(GadgetID(12))
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Justy
Beiträge: 131
Registriert: 10.09.2004 13:31
Wohnort: Feldbach / Steiermark / Österreich
Kontaktdaten:

Beitrag von Justy »

:praise: :praise: :praise: :praise: :praise: :praise: :praise: :praise: :praise:

Danke Danilo!! Du hast mein Projekt gerettet!

:praise: :praise: :praise: :praise: :praise: :praise: :praise: :praise: :praise:

Danke auch an alle anderen die mir helfen wollten!

mfg. Justy
Am Anfang erschuf der Mensch Gott.
Friedrich Nietzsche
Antworten