[Win32] Multi-Window

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

Der Eisvogel

Betreff: [Win32] Multi-Window

BeitragDo, Jul 29, 2010 17:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo liebe Community
Hiermit stelle ich mein erstes Modul "Multi-Window" vor.

Was ist Multi-Window?
Mutli-Window simuliert verschiede Grafikbereiche auf dem Bildschirm, die unterschiedlich genutzt werden können. z.B.: Um mehrere Fenster zu verwenden. Diese muss dann man allerdings selber malen z.B.: mit einer Grafik-GUI.

Wie funktioniert Multi-Window?
Die Anwendung von Multi-Window ist relativ einfach. Als erstes muss man Multi-Window natürlich in seinen Code einbinden:
BlitzMax: [AUSKLAPPEN]
Import Eisvogel.MultiWindow

Als nächstes muss man Multi-Window initialisieren. Dazu dient folgender Befehl:
BlitzMax: [AUSKLAPPEN]
InitMultiWindow(title:String)

Der Befehl ersetzt auch gleichzeitig den Graphics-Befehl. Dieser Befehl erstellt ein Grafik-Fenster mit der Größe des Bildschirms und dem angegebenen Titel und blendet sofort den gesammten Bildbereich aus. Deswegen kann man das Fenster nach diesem Befehl auch nicht sehen.

Nun fügt man seine Grafikbereiche zu Multi-Window hinzu. Dies geschiet mit folgendem Befehl:
BlitzMax: [AUSKLAPPEN]
AddMultiWindow:TMWindow(x:Int, y:Int, width:Int, height:Int)

Dieser Befehl erstellt einen Bereich an dere Stelle "x,y" mit der Größe "width*height" und liefert ein TMWindow-Handle auf den erstellten Grafikbereich zurück.
Will man diesen Bereich nun ändern, wenn man z.B.: darin ein Fenster malt und dieses verschiebt, dann kann man dies mit diesem Befehl bewerkstelligen:
BlitzMax: [AUSKLAPPEN]
ChangeMultiWindow(mwnd:TMWindow, x:Int, y:Int, width:Int, height:Int)

Der Parameter "mwnd" erwartet ein TMWindow-Handle auf den zu ändernden Grafikbereich. Die restlichen Parameter verhalten sich wie bei "AddMultiWindow".
Möchte man nun einen Grafikbereich wieder löschen, so benutzt man folgenden Befehl:
BlitzMax: [AUSKLAPPEN]
RemoveMultiWindow(mwnd:TMWindow)

Der Parameter "mwnd" erwartet ebenfalls ein TMWindow-Handle auf den zu löschenden Grafikbereich.

Damit die Änderungen der letzten 3 Befehle wirksam werden ruft man diesen Befehl auf:
BlitzMax: [AUSKLAPPEN]
UpdateMultiWindow(redraw:Byte = False)

Wenn der Parameter "redraw" gleich False ist, so werden die Änderungen erst bei einem Fenster-Redraw-Befehl wie Flip wirksam. Andernfalls werden die Änderungen sofort sichtbar. Ersteres ist allerdings zu bevorzugen.

Um die Breite und Höhe von Multi-MultiWindow zu ermitteln weren folgende Befehle verwendet:
BlitzMax: [AUSKLAPPEN]
MultiWindowWidth:Int()
MultiWindowHeight:Int()


Beispiel
BlitzMax: [AUSKLAPPEN]
SuperStrict

Import eisvogel.multiwindow


InitMultiWindow("Multi-Window - Sample")

Local wnd_mouse:TMWindow = AddMultiWindow(MultiWindowWidth() / 2 - 125, MultiWindowHeight() / 2 - 125, 250, 250)
Local wnd_wh:TMWindow = AddMultiWindow(30, 30, 250, 50)

Local timer:TTimer = CreateTimer(60)

Local mx:Int, my:Int

Repeat
WaitTimer(timer)
Cls

DrawRect mx - 124, my - 124, 248, 248
ChangeMultiWindow(wnd_mouse, mx - 125, my - 125, 250, 250)

DrawText "Multi-Window-Breite: " + MultiWindowWidth(), 40, 40
DrawText "Multi-Window-Hoehe: " + MultiWindowHeight(), 40, 60

mx = MouseX()
my = MouseY()

UpdateMultiWindow()

Flip 0
Until KeyHit(KEY_ESCAPE)
End


Download
Einmal ein Download, der schon die kompilierte Version enthält: Download - Multi-Window
Und hier einmal der Code zum selber Kompilieren, falsl der Link mal Down sein sollte:
BlitzMax: [AUSKLAPPEN]
SuperStrict

Rem
bbdoc: Multi-Window
End Rem

Module Eisvogel.MultiWindow

ModuleInfo "Version: 1.00"
ModuleInfo "Author: Marc-Peter Eisinger"
ModuleInfo "License: Open Source"
ModuleInfo "Copyright: Eisvogel, Marc-Peter Eisinger 2010"

Import brl.blitz
Import brl.Graphics
Import brl.GLGraphics
Import brl.max2d
Import brl.glmax2d
Import brl.d3d7max2d
Import brl.d3d9max2d


Private

Extern "Win32"
Function GetSystemMetrics:Int(nIndex:Int)
Function CreateRectRgn:Int(x1:Int, y1:Int, x2:Int, y2:Int)
Function CombineRgn:Int(hDestRgn:Int, hSrcRgn1:Int, hSrcRgn2:Int, nCombineMode:Int)
Function SetWindowRgn:Byte(hWnd:Int, hRgn:Int, bRedraw:Int)
Function DeleteObject:Byte(hObject:Int)
End Extern


Const SM_CXSCREEN:Byte = 0
Const SM_CYSCREEN:Byte = 1
Const SM_CYCAPTION:Byte = 4
Const SM_CXFIXEDFRAME:Byte = 7
Const SM_CYFIXEDFRAME:Byte = 8

Global MW_hWnd:Int
Global MW_width:Int
Global MW_height:Int
Global MW_offsetx:Int
Global MW_offsety:Int
Global MW_changed:Byte


Public

Type TMWindow Abstract
End Type


Private

Type TMWindow2 Extends TMWindow
Global list:TList = CreateList()

Field x:Int
Field y:Int
Field w:Int
Field h:Int

Method New()
ListAddLast(list, Self)
End Method
End Type

Public



Rem
bbdoc: Initialize Multi-Window.
End Rem

Function InitMultiWindow(title:String)
'Fensterbreite und -höhe ermitteln
MW_width = GetSystemMetrics(SM_CXSCREEN)
MW_height = GetSystemMetrics(SM_CYSCREEN)

'Client-Offsets ermitteln
MW_offsetx = GetSystemMetrics(SM_CXFIXEDFRAME)
MW_offsety = GetSystemMetrics(SM_CYFIXEDFRAME) + GetSystemMetrics(SM_CYCAPTION)

'Fenster erstellen und Handle ermitteln
AppTitle = title
MW_hWnd = ApphWnd(Graphics(MW_width, MW_height))

'Fenster-Region erstellen und setzten
Local rgn:Int = CreateRectRgn(0, 0, 0, 0)
SetWindowRgn(MW_hWnd, rgn, True)
DeleteObject(rgn)
End Function



Rem
bbdoc: Returns width of Multi-Window.
End Rem

Function MultiWindowWidth:Int()
Return MW_width
End Function

Rem
bbdoc: Returns height of Multi-Window.
End Rem

Function MultiWindowHeight:Int()
Return MW_height
End Function



Rem
bbdoc: Adds a rect context to Multi-Window.
End Rem

Function AddMultiWindow:TMWindow(x:Int, y:Int, width:Int, height:Int)
MW_changed = True
Local wnd:TMWindow2 = New TMWindow2
wnd.x = x
wnd.y = y
wnd.w = width
wnd.h = height
Return wnd
End Function

Rem
bbdoc: Changes a rect context of Multi-Window.
End Rem

Function ChangeMultiWindow(mwnd:TMWindow2, x:Int, y:Int, width:Int, height:Int)
MW_changed = True
Local wnd:TMWindow2 = TMWindow2(mwnd)
wnd.x = x
wnd.y = y
wnd.w = width
wnd.h = height
End Function

Rem
bbdoc: Deletes a context of MultiWindow.
End Rem

Function RemoveMultiWindow(mwnd:TMWindow)
MW_changed = True
Local wnd:TMWindow2 = TMWindow2(mwnd)
ListRemove(TMWindow2.list, wnd)
End Function



Rem
bbdoc: Updates the contexts of Multi-Window.
about: If redraw is true, the window will be updated instantly. Otherwise the window will be updated by the next update comand like Flip.
End Rem

Function UpdateMultiWindow(redraw:Byte = False)
If Not MW_changed Then Return

'Startregion erstellen
Local rgn:Int = CreateRectRgn(0, 0, 0, 0)

'Fenster-Regionen einbinden
For Local wnd:TMWindow2 = EachIn TMWindow2.list
Local tx:Int = MW_offsetx + wnd.x
Local ty:Int = MW_offsety + wnd.y
Local tw:Int = MW_offsetx + wnd.x + wnd.w
Local th:Int = MW_offsety + wnd.y + wnd.h
If tx < MW_offsetx Then tx = MW_offsetx
If tx > MW_offsetx + MW_width Then tx = MW_offsetx + MW_width
If ty < MW_offsety Then ty = MW_offsety
If ty > MW_offsety + MW_height Then ty = MW_offsety + MW_height
If tw > MW_offsetx + MW_width Then tw = MW_offsetx + MW_width
If tw < MW_offsetx Then tw = MW_offsetx
If th > MW_offsety + MW_height Then th = MW_offsety + MW_height
If th < MW_offsety Then th = MW_offsety
Local wnd_rgn:Int = CreateRectRgn(tx, ty, tw, th)
CombineRgn(rgn, rgn, wnd_rgn, 2)
DeleteObject(wnd_rgn)
Next

'Fenster-Region setzten
SetWindowRgn(MW_hWnd, rgn, redraw)
DeleteObject(rgn)
End Function



Private

Function ApphWnd:Int(g:TGraphics)
If g = Null Then Return Null

Local GraphicsDevice:TGraphics
If g.Driver() <> GLGraphicsDriver() Then
GraphicsDevice = TMax2DGraphics(g)._graphics
Else
GraphicsDevice = g
EndIf

Select g.Driver()
Case GLGraphicsDriver(), GLMax2DDriver()
Return Int Ptr(TGLGraphics(GraphicsDevice)._context)[8]
Case D3D7Max2DDriver()
Return TD3D7Graphics(GraphicsDevice)._hWnd
Case D3D9Max2DDriver()
Return TD3D9Graphics(GraphicsDevice)._hWnd
End Select
End Function
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

BtbN

BeitragFr, Jul 30, 2010 13:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mir den Text jetzt 3 mal durchgelesen, und nicht verstanden, was das ding tut oder wozu es gut sein soll.

Goodjee

BeitragFr, Jul 30, 2010 13:51
Antworten mit Zitat
Benutzer-Profile anzeigen
funktioniert bei mir unter xp nicht richtig, das weiße rechteck wird nicht gelöscht und zieht so einen schweif von weißen rechtecken hinter sich her, die nicht verschwinden wenn das programm beendet wird und erst von einem anderen windowsfenster wieder übermalt werden müssen
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

Der Eisvogel

BeitragFr, Jul 30, 2010 16:31
Antworten mit Zitat
Benutzer-Profile anzeigen
@Goodjee: Versuch mal UpdateMultiWindow(True), dann wird das Fenster sofort neu gemalt. Bei ging es auf XP-Rechner.

@BtbN: Dieses Modul gibt dir die Möglichkeit verschiedene rechteckige Bereiche auf dem Bildschirm zu benutzten, und den Rest durchsichtig zu machen. Für mal das Sample aus sofern du Windows hat.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

BladeRunner

Moderator

BeitragSa, Jul 31, 2010 14:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich verstehe was es macht, aber den Zweck dahinter sehe ich immer noch nicht. Nenn doch mal ein paar Einsatzbeispiele für die Du es nehmen würdest.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Der Eisvogel

BeitragSa, Jul 31, 2010 23:27
Antworten mit Zitat
Benutzer-Profile anzeigen
z.B.: Bei einer GUI um mit mehreren Fenstern effektiver zu sein. Oder man einfach so mehrere Eingabeflächen braucht.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

BladeRunner

Moderator

BeitragSo, Aug 01, 2010 7:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich mehrere Eingabefenster benötige wäre mein Mittel der Wahl mehrere Fenster zu erstellen Wink
Das wäre dann nämlich auch eine schön sauber gekapselte Geschichte.
Wenn ich alles auf eine Fläche haue wird das ja ein Riesenkuddelmuddel - ich erlaube ja quasi jeder Ausgabe aufzutauchen wo sie grade will, und wenn ich da bei den Koordinaten einen Fehler mache provoziere ich abstruse Bugs.
Versteh mich nicht falsch, ich will dir das Teil nicht kleinreden, aber ich finde einfach keine Anwendung bei der es mir nützlich erschiene.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group