Foro | | | | Nico Madysa | ¡Hola miteinander!
Yo habe mein Programa veces el Minimum reduziert, en el lo siempre todavía zwei merkwürdige Erscheinungen son: KompilierenMarcaSeparación $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
Lo se folgendes gemacht: Zu Beginn voluntad en el Matrix feld% vier zufällig gewählte Werte en 1 gesetzt (Mi Murmeln, siehe más unten ). Das Staticcontrol, el en el Hintergrund liegt, se de Buttons überdeckt. Klickt uno nun en el Button unten links (con el Handle But&[0,9]), así voluntad el Randbuttons deaktiviert y el mittleren versteckt. Damit se el essenzielle Teil el Hintergrundbitmap sichtbar. Darauf voluntad vier Kullern de feld% hingemalt. Das todo Ventana se en uno Mapa de bits abgesichert y Hintergrundbitmap transferencia, el Status quo se also fixiert. Zum Schluss voluntad el deaktivierten Randbuttons unsichtbar gemacht, sólo el Ecken y el Hintergrundbild verbleiben. (Der untere rechte Button final el Programa.)
Problema 1: Im Kompilat fehlen de los vier Murmeln meist algunos. Im Interpreter voluntad stets todos vier adecuado. Wenn el Línea SetTimer 1 : waitinput : KillTimer (Dulcoif) aktiviert se, voluntad auch en el Kompilat todos Kullern adecuado. Sleep zeitigt no Wirkung. Findet lo en getrennten Schleifen en lugar de, dass el Buttons lejos y el Kreise gemalt voluntad, así voluntad ebenso todos vier Kreise adecuado. Doch por qué funktioniert el obere Variante no? Ein Zeitproblem kann no ser, como Sleep nichts bringt.
Problema 2: Man ersetze el Aufruf Button(&loop,y%) por Button_2(&loop,y%). Dadurch es una einziger el Randbuttons bildlos, pero una Standard-Button. Dies ha el unerklärlichen Effekt, dass el Hintergrundbitmap sólo todavía de uno schwarzen Fläche y el Button besteht. Wers no glaubt, kann el Bilder absichern dejar. Das Fensterfoto &SCRBMP es todavía ordentlich, doch el Mapa de bits des Static-Controls es más que fraglich. Doch por qué? |
| | | | |
| | | Weil Windowss UI passiv (asynchon) características.
Machs doch como en Bomb 3¾ : [...] |
| | | | |
| | Jörg Sellmeyer | Hast Usted ya veces una Repaint zwischendurch ausprobiert? En me kommt auch igual el Meldung, daß STM_SETIMAGE en el Encabezamiento-Expediente fehlt. |
| | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 15.07.2009 ▲ |
| |
| | | Wobei Yo persönlich en así kleinem Spielfeld rein en una hPic (oder membmp) trabajo sería, o. en 2 (oder mehr...) wobei el Zweite z.B. una Klickmaske wäre. |
| | | | |
| | Nico Madysa | @Jörg: Es bien posible, Yo mi Messages.ph algunos Male erweitert (y vergesse el siempre otra vez. ) STM_SETIMAGE ha el Nummer $0172, STM_GETIMAGE ha el Nummer $0173. El Parámetro, etc. son como en BM_SETIMAGE o. BM_GETIMAGE. Repaint en el Bucle ha sólo una elendes Flackern bereitet, doch dein Tipp ha mich en el richtige Fährte gelockt. Hiermit klappts: KompilierenMarcaSeparación
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]
StartPaint SendMessage(hBack&,~STM_GETIMAGE,0,0)
DrawPic PTrue&,&loop * 48,ly% * 48;-1
EndPaint
endif
endif
EndWhile
EndWhile
Repaint
Das gemalte ans Hintergrundbild klatschen
(damit werden auch die jetzt deaktivierten, dann verschwunden seienden
Randbuttons übernommen)
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
f='./../../function-references/XProfan/ENDPROC/'>ENDPROC
Anstatt obenauf a krakeln gehe Yo direkt en el Mapa de bits des Statics y fordere lo después de el Doppelschleife en, dies a Kenntnis a nehmen.
@IF: "Asynchron, schreib el ahora hundertmal a el Tafel! Yo gehe simplemente veces su de, dass con deinem Rätselwort gemeint es, dass DrawPic mi Murmeln no inmediatamente en Befehl hinmalt, pero se sólo una vez "anstellen" muss (wo De todos modos) -- y el Bild entonces manchmal überzeichnet se, si endlich dran es. Richtig?
Damit restos sólo todavía el seltsame Comportamiento des Statics übrig, si uno el Buttons kein Picbutton es. Sombrero wer una Concepto? Un Adressen-Schutzverletzung debería diesmal no (ya otra vez) vorliegen. |
| | | | |
| | | | | | | |
| | Nico Madysa | Dann mache doch veces folgendes: Enkommentiere el beiden Zeilen KompilierenMarcaSeparación y passe eventuell el Pfade a. Dann kommentierst du el Línea Button(&loop,y%) de y aktivierst dafür el darunter liegende Línea Button_2(&loop,y%). Dann lässt Si es usted el Programa como ya zuvor durchlaufen y du wirst determinar, dass Dat1.bmp y Dat2.bmp se unterscheiden voluntad, obwohl ellos el theoretisch no debería. Lo wäre natürlich todavía schöner, si dieser Fehler sólo en me aufträte. |
| | | | |
| | | Könntest Usted el una vez con un 3 Zeiler demonstrieren? |
| | | | |
| | Nico Madysa | Nein, por desgracia, no. Selección aleatoria, Ventana, end: ya son drei Zeilen weg. Aber como el Sache con el Murmeln geklärt es, schaue Yo veces, si la Ding todavía más kürzen lässt ... |
| | | | |
| | Nico Madysa | Bitteschön, Yo hoffe, dass dreiunzwanzig Zeilen no zuviel son. KompilierenMarcaSeparacióncls 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 en, sobald auch sólo una einziger normaler Button en el Bildschirm sichtbar es. Sind zwei Picbuttons como, así se ejecuta alles normal. Wenn el Textbutton vorher versteckt se, funktioniert ebenfalls alles wunderbar. |
| | | | |
| | | Achso ahora verstehe Yo Su Problema, sí el es "normal".
Windows blanco no welche Pixel hinter* una Control mentira, Yo hatte veces con Franco darüber debattiert aber finde el hilo no mehr.
Im Fazit es scrbmp (natürlich) "unzuverlässig". ^ ^
Ziehe veces calc.exe encima Su hWnd y kopiere el hWnd de, calc es con en!
DCs son nunmal no Pixelspeicher.
Vlt. es dies con "AERO" ahora (algo) anders... |
| | | | |
| | | Apéndice: Ähnlich: [...] . |
| | | | |
|
RespuestaThemeninformationenDieses Thema ha 3 subscriber: |