Deutsch
Forum

Erledigt: Zwei Bilderprobleme

 
- 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?
 
Nico Madysa
15.07.2009  
 



 
- Seite 1 -



Nico
Madysa
Bitteschön, ich hoffe, dass dreiunzwanzig Zeilen nicht zuviel sind.
KompilierenMarkierenSeparieren
cls 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.
 
Nico Madysa
16.07.2009  
 



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...
 
16.07.2009  
 



Nachtrag: Ähnlich: [...]  .
 
16.07.2009  
 



 
- 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.
 
Nico Madysa
16.07.2009  
 



Die sind nicht doof, die machen das schon "richtig".
 
16.07.2009  
 




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?
 
Nico Madysa
16.07.2009  
 



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?
 
16.07.2009  
 




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.
 
Nico Madysa
16.07.2009  
 



>> 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?
 
16.07.2009  
 




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.
 
Nico Madysa
16.07.2009  
 



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!
 
16.07.2009  
 




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.
 
Nico Madysa
16.07.2009  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

2.226 Betrachtungen

Unbenanntvor 0 min.
Langer18.12.2021
H.Brill05.01.2019
AndreasS27.12.2018
E.T.20.12.2018
Mehr...

Themeninformationen

Dieses Thema hat 3 Teilnehmer:

Nico Madysa (10x)
iF (10x)
Jörg Sellmeyer (1x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie