Forum | | | | - Seite 1 - |
| Nico Madysa | Hallo miteinander!
Ich habe mein Programm mal auf das Minimum reduziert, bei dem es immer noch zwei merkwürdige Erscheinungen gibt: KompilierenMarkierenSeparieren $H Messages.ph
proc Zeige_Kugeln
declare ly% , gueltig%
alle Buttons durchgehen
whileloop 0,9
ly% = &loop
whileloop 0,9
if xor(not(&loop mod 9),not(ly% mod 9)) or (not(&loop) and (ly% = 9))
Rand deaktivieren
EnableWindow But&[&loop,ly%],0
elseif (&loop mod 9) and (ly% mod 9)
Mittelfeld aufdecken
ShowWindow(But&[&loop,ly%],0)
endif
Die Kullern anzeigen
if between(&loop,1,8,ly%,1,8)
SetTimer 0 : waitinput : KillTimer
if feld%[&loop - 1,ly% - 1]
DrawPic PTrue&,&loop * 48,ly% * 48;-1
endif
endif
EndWhile
EndWhile
Das gemalte ans Hintergrundbild klatschen
PLsg& = Create("hPic",0,"&SCRBMP")
SendMessage(hBack&,~STM_SETIMAGE,0,PLsg&)
SavePic "D:\Dat1.bmp",PLsg&
SavePic "D:\Dat2.bmp",SendMessage(hBack&,~STM_GETIMAGE,0,0)
Zu guter Letzt den deaktivierten Rand wegmachen
whileloop 0,9
ly% = &loop
whileloop 0,9
case xor(not(&loop mod 9),not(ly% mod 9)) : ShowWindow(But&[&loop,ly%],0)
EndWhile
EndWhile
endproc
proc Button
parameters px% , py%
Rand: Bilder, Mitte: normal
ifnot (px% mod 9) and (py% mod 9)
But&[px%,py%] = Create("PicButton",%hWnd,PTrue&,px% * 48,py% * 48,48,48)
else
But&[px%,py%] = Create("Button",%hWnd,"",px% * 48,py% * 48,48,48)
endif
endproc
proc Button_2
parameters px% , py%
nur ein Button am Rande ist kein Bild
if (px% = 0) and (py% = 9)
But&[px%,py%] = Create("Button",%hWnd,"",px% * 48,py% * 48,48,48)
elseif not((px% mod 9) and (py% mod 9))
But&[px%,py%] = Create("PicButton",%hWnd,PTrue&,px% * 48,py% * 48,48,48)
else
But&[px%,py%] = Create("Button",%hWnd,"",px% * 48,py% * 48,48,48)
endif
endproc
proc Bereite_Bilder
Hintergrundbild
PBack& = Create("hNewPic",481,481,$FFFFFF)
StartPaint PBack&
UsePen 0,1,0
whileloop 2,8
Rectangle (48*&loop-1),0 - (48*&loop+1),480
EndWhile
whileloop 2,8
Rectangle 0,(48*&loop-1) - 480,(48*&loop+1)
EndWhile
EndPaint
Bild für die Kullern
PTrue& = Create("hNewPic",48,48,$FFFFFF)
StartPaint PTrue&
UsePen 0,1,0
UseBrush 1,0
Ellipse 2,2,45,45
EndPaint
endproc
proc BuildUp
declare y%
WindowStyle 26
Window 100,50 - 500,520
Hintergrund
hBack& = Create("Bitmap",%hWnd,PBack&,0,0)
alle Buttons
whileloop 0,9
y% = &loop
whileloop 0,9
Button(&loop,y%)
Button_2(&loop,y%)
EndWhile
EndWhile
endproc
proc Platziere_Kugeln
declare rx% , ry%
clear feld%[]
whileloop 4
repeat
rx% = Rnd(8)
ry% = Rnd(8)
until not(feld%[rx%,ry%])
feld%[rx%,ry%] = 1
EndWhile
endproc
declare But&[9,9], feld%[7,7]
declare hBack&,PBack&,PLsg& , PTrue&
Randomize
Bereite_Bilder
BuildUp
Platziere_Kugeln
var e% = 0
whilenot e%
waitinput
if Clicked(But&[9,9])
e% = 1
elseif Clicked(But&[0,9])
Zeige_Kugeln
endif
wend
DeleteObject PBack&
DeleteObject PLsg&
DeleteObject PTrue&
end
Es wird folgendes gemacht: Zu Beginn werden in der Matrix feld% vier zufällig gewählte Werte auf 1 gesetzt (Meine Murmeln, siehe weiter unten ). Das Staticcontrol, das im Hintergrund liegt, wird von Buttons überdeckt. Klickt man nun auf den Button unten links (mit dem Handle But&[0,9]), so werden die Randbuttons deaktiviert und die mittleren versteckt. Damit wird der essenzielle Teil der Hintergrundbitmap sichtbar. Darauf werden vier Kullern aus feld% hingemalt. Das ganze Fenster wird in einer Bitmap abgesichert und der Hintergrundbitmap übergeben, der Status quo wird also fixiert. Zum Schluss werden die deaktivierten Randbuttons unsichtbar gemacht, nur die Ecken und das Hintergrundbild verbleiben. (Der untere rechte Button beendet das Programm.)
Problem 1: Im Kompilat fehlen von den vier Murmeln meist einige. Im Interpreter werden stets alle vier angezeigt. Wenn die Zeile SetTimer 1 : waitinput : KillTimer (Dulcoif) aktiviert wird, werden auch im Kompilat alle Kullern angezeigt. Sleep zeitigt keine Wirkung. Findet es in getrennten Schleifen statt, dass die Buttons entfernt und die Kreise gemalt werden, so werden ebenso alle vier Kreise angezeigt. Doch warum funktioniert die obere Variante nicht? Ein Zeitproblem kann es nicht sein, da Sleep nichts bringt.
Problem 2: Man ersetze den Aufruf Button(&loop,y%) durch Button_2(&loop,y%). Dadurch ist ein einziger der Randbuttons bildlos, sondern ein Standard-Button. Dies hat den unerklärlichen Effekt, dass die Hintergrundbitmap nur noch aus einer schwarzen Fläche und dem Button besteht. Wers nicht glaubt, kann sich die Bilder absichern lassen. Das Fensterfoto &SCRBMP ist noch ordentlich, doch die Bitmap des Static-Controls ist mehr als fraglich. Doch warum? |
| | | | |
| | | | | - Seite 1 - |
| Nico Madysa | Bitteschön, ich hoffe, dass dreiunzwanzig Zeilen nicht zuviel sind. KompilierenMarkierenSeparierencls 16777215
P& ist das Bild des Buttons
var P& = Create("hNewPic",48,48,$22DD22)
Die Buttons sind h& und g&. Jeder kann ein Text- oder ein Bildbutton sein.
var h& = Create("Button",%hWnd,"Text",0,0,48,48)
var h& = Create("PicButton",%hWnd,p&,0,0,48,48)
var g& = Create("PicButton",%hWnd,p&,48,0,48,48)
var g& = Create("Button",%hWnd,"Text",48,0,48,48)
Der Fensterinhalt wird fotografiert und nach unten versetzt angezeigt.
var Q& = Create("hPic",0,"&SCRBMP")
cls 0 Damit man Bild und Bildschirm unterscheiden kann.
Create("Bitmap",%hWnd,Q&,0,48)
Rest
whilenot IsKey(27)
waitinput
wend
DeleteObject P&
DeleteObject Q&
end
Der Fehler tritt auf, sobald auch nur ein einziger normaler Button auf dem Bildschirm sichtbar ist. Sind zwei Picbuttons da, so läuft alles normal. Wenn der Textbutton vorher versteckt wird, funktioniert ebenfalls alles wunderbar. |
| | | | |
| | | Achso jetzt verstehe ich Dein Problem, ja das ist "normal".
Windows weiss nicht welche Pixel hinter* einem Control liegen, ich hatte mal mit Frank darüber debattiert aber finde den Thread nicht mehr.
Im Fazit ist scrbmp (natürlich) "unzuverlässig". ^^
Ziehe mal calc.exe über Dein hWnd und kopiere das hWnd ab, calc ist mit bei!
DCs sind nunmal keine Pixelspeicher.
Vlt. ist dies mit "AERO" jetzt (etwas) anders... |
| | | | |
| | | Nachtrag: Ähnlich: [...] . |
| | | | |
| | | | - Seite 2 - |
| | Nico Madysa | So ne Doofen Contexte! Gut, dann muss ich darauf in Zukunft aufpassen. Danke schön für die schnelle Beantwortung meiner beiden Fragen. |
| | | | |
| | | Die sind nicht doof, die machen das schon "richtig". |
| | | | |
| | Nico Madysa | Ich sehe schon, daran scheiter sogar die berühmte Druck-S-Abf-Taste ... Doch sage mal, es spricht doch nichts gegen eine Spieleanwendung, welche zwar nicht in den Hintergrund rückt (HWND_TOPMOST), sich aber minimieren lässt, gelle? |
| | | | |
| | | Komisch ausgedrückt hast Du das garnicht "nötig". Nimm einfach Bitmaps bzw. Picture-Statics und sende diesen neue hPic-Handles wenn sie etwas anderes zeigen sollen. Das Neuzeichnen ist deren Problem. Oder Du zeichnest gleich die ganze Oberfläche in einem hPic und malst das hPic aufs hWnd.
Ich würde gern die Aufgabe verstehen, was genau solls denn werden? |
| | | | |
| | Nico Madysa | Wie du sicherlich schon erraten hast, ein Spiel. Das Problem ist, dass ich aus Gründen des Designs kurzzeitig auf den deaktivierten Knöpfen selbst herummalen muss. Bisher war das Problem, dass der Teil des Bildes dann beim nächsten Neuzeichnen natürlich weg ist, deshalb die Idee, Knopf mit Bild auf einem Hintergrundstatic zu fixieren. Doch da macht ja eben nun &SCRBMP Ärger. |
| | | | |
| | | >> Wie du sicherlich schon erraten hast, ein Spiel.
Au ja, bin dabei!
Und alles nur damit irgendwas anklickbar ist?
Welchem Spiel kommts am nähesten? |
| | | | |
| | Nico Madysa | Diese Mischung aus Minesweeper und Schiffe Versenken, bei der du mir bereits mit der Updatefunktion geholfen hast. : [...] Ich habs bisher nur noch nicht angekündigt, weil es in den Wettbewerb soll, sobald die schlimmsten Kinderkrankheiten auskuriert sind. In der bisher hochgeladenen Version gibt es auch noch nicht das Hintergrundstatic, wodurch das Gezeichnete verschwindet, sobald was darüber gleitet. |
| | | | |
| | | Verstehe, dann würde ich unbedingt empfehlen einfach auf dem hWnd zu bleiben um dort z.B. ein hPic zu zeichnen welches das komplette Spiel enthält.
In einem 2. hPic zeichnest Du nur die klickbaren Bereiche, jeder Bereich einfach eine andere Farbe. Mit einem GetPixel auf dieses hPic bekommt man fix raus, auf welchen Bereich (Objekt) geklickt wurde und sogar mit Karenz wenn erwünscht.
Nachtrag: Tolles Spiel! |
| | | | |
| | Nico Madysa | [...] Ich weiß nicht, ob ich richtig verstehe, was du meinst. Das Spiel besteht ja gewissermaßen aus zwei Hälften. In der ersten sind nur Buttons auf dem Spielfeld und man spielt halt. Erst in der zweiten Hälfte, in der Lösung, kommen dann fast alle Buttons weg und das Bild wird gezeichnet. Die Randbuttons sind eigentlich nur dageblieben, weil sonst die abgefeuerten Laserstrahlen aus dem Nichts auftauchten. Es sieht so einfach toller aus. |
| | | | |
|
AntwortenThemenoptionen | 2.226 Betrachtungen |
ThemeninformationenDieses Thema hat 3 Teilnehmer: |