Quelltexte/ Codesnippets | | | | | SubClassProc Timer - sichere KompilierenMarkierenSeparieren $H windows.ph
WINDOWSTYLE 80 | 512 | 1024
WINDOW %MAXX,%MAXY - 0,0
SHOWWINDOW(%HWND,0)
WINDOWSTYLE 1 | 2 | 4 | 8 | 16 | 512
var HMYWND&=(CREATE("WINDOW",(0),"Zuckertest 3.0",(100),(100),(200),(350)))
var HPIC&=CREATE("hNewPic",64,64,$FFFFAA)
var HDSK&=CREATE("text",HMYWND&,"",0,0,$FFFF,$FFFF)
var HSTATBAR&=CREATE("statusWindow",HMYWND&,"Bereit.")
USERMESSAGES $0010,$0014
MYWND.RESIZING()
SUBCLASS HMYWND&,1
~SetClassLongA(HMYWND&,-12,~LoadCursorA(0,32512))
~SetTimer(HMYWND&,55100,100,0)
~SetTimer(HMYWND&,55101,500,0)
WHILE 1
WAITINPUT
SELECT %UMESSAGE
CASEOF $0010
SELECT %MWND
CASEOF HMYWND&
BREAK
ENDSELECT
ENDSELECT
ENDWHILE
~KillTimer(HMYWND&,55100)
~KillTimer(HMYWND&,55101)
end
SUBCLASSPROC
SELECT &SWND
CASEOF HMYWND&
SELECT %SMESSAGE
CASEOF 532,$0005
MYWND.RESIZING()
CASEOF $0113
SELECT &SWPARAM
CASEOF 55100
DEMO(1)
CASEOF 55101
DEMO(2)
ENDSELECT
ENDSELECT
ENDSELECT
endproc
proc MYWND.RESIZING
SETWINDOWPOS HSTATBAR&=0,0 - 0,0
DEMO(1)
DEMO(2)
endproc
proc DEMO
PARAMETERS MODE&
SELECT MODE&
CASEOF 1
STARTPAINT HMYWND&
USEPEN 0,0,RND($FFFFFF)
LINE 10,10 - 200,43
ENDPAINT
CASEOF 2
STARTPAINT HMYWND&
TEXTCOLOR RND($FFFFFF),~GetSysColor(15)
DRAWTEXT 10,10,&GETTICKCOUNT
ENDPAINT
ENDSELECT
endproc
KompilierenMarkierenSeparieren {$cleq}
windowstyle 80 | 512 | 1024
window maxx,maxy - 0,0
showWindow(hWnd,false)
windowstyle 1 | 2 | 4 | 8 | 16 | 512
long hMyWnd=createWindow(,"Zuckertest 3.0",100,100,200,350),
hPic=create("hNewPic",64,64,$FFFFAA),
hDsk=create("text",hMyWnd,"",,,$FFFF,$FFFF),
hStatBar=create("statusWindow",hmyWnd,"Bereit.")
userMessages wm_close,wm_erasebkgnd
myWnd.resizing()
setClassLong(hMyWnd,gcl_hcursor,loadCursor(,IDC_ARROW))
subClass hMyWnd,true
~setTimer(hMyWnd,55100,100,)
~setTimer(hMyWnd,55101,500,)
do {
waitInput
select uMessage
caseof wm_close
select mWnd
caseof hMyWnd
break
endSelect
endSelect
}
~killTimer(hMyWnd,55100)
~killTimer(hMyWnd,55101)
end
subClassProc {
select sWnd
caseof hMyWnd
select sMessage
caseof wm_sizing,wm_size
myWnd.resizing()
caseof wm_timer
select sWParam
caseof 55100:demo(1)
caseof 55101:demo(2)
endSelect
endSelect
endSelect
}
myWnd.resizing{
setWindowPos hStatBar=0,0 - 0,0
demo(1)
demo(2)
}
demo(long mode){
select mode
caseof 1
startPaint hMyWnd
usePen 0,,rnd($FFFFFF)
line 10,10 - 200,43
endPaint
caseof 2
startPaint hMyWnd
textColor rnd($FFFFFF),getSysColor(15)
drawText 10,10,getTickCount
endPaint
endSelect
}
|
| | | | |
| | Frank Abbing | Was genau soll der Code demonstrieren? Die Linie und der Text malen übrigens in die Statusbar hinein... |
| | | | |
| | | Der Code demonstriert die SetTimer-Api ohne ProcAddr sondern über Messages welche in der SubClassProc abgearbeitet werden (können). Der Code zeigt das auch nach diesem sicheren Verfahren selbst dann gezeichtet werden kann, wenn z.B. das Fenster grad verschoben wird. Keiner benötigt also wirklich procAddr am Timer. Ist nur ein Beispiel was ich imho schon ein paar Male gepostet hatte - aber immer wieder irgendwie (auch von mir) nicht gefunden wird wenn es darauf ankommt. |
| | | | |
| | Jac de Lad | Das geht aber imho nur, wenn sich das Prog in einem waitinput rumlungert... |
| | | Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP | 30.08.2008 ▲ |
| |
| | Frank Abbing | Aha, ok. Ich empfehle, ein paar kurze Notizen zu einem etwas grösseren Codesnippet beizupacken. Dass der User zumindest weiss, worum es geht, ohne den ganzen Code anlysieren zu müssen. |
| | | | |
| | Jörg Sellmeyer | Außerdem sind im 2. Code ein paar Fehler drin, die (zumindest bei mir) nicht von XPSE korrigiert werden - falls das überhaupt vorgesehen sein sollte...:
createWindow(,"Zuckertest 3.0",100,100,200,350) usePen 0,,rnd($FFFFFF) |
| | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 30.08.2008 ▲ |
| |
| | | | | | | |
| | Jörg Sellmeyer | createWindow(,"Zuckertest 3.0",100,100,200,350) kein %hwnd usePen 0,,rnd($FFFFFF) fehlt ein Parameter |
| | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 31.08.2008 ▲ |
| |
| | | Nö, ist völlig korrekt mit XPSE.
Fenster soll auf 0 erstellt werden (oberste Ebene) damit es auch sicher in der Tastkbar landet - und der Parameter zwischen ,, kann nur 0 sein. Das klappt aber nur hinter Klammern und zwischen Kommas...
XPSE übersetzt es doch auch korrekt, oder?
Du kannst mit XPSE schreiben: KompilierenMarkierenSeparieren und die ausgekommaten 4 Parameter sind halt 0... (sichert aber auch nur, das - wenn in der Zielfunktion keine pCount-Prüfung eingebaut ist - die übergebenen Parameter auch wirklich 0 sind) |
| | | | |
| | | Frank Abbing
Was genau soll der Code demonstrieren?
Damit kann man sicheres threadähnliches Verhalten Programmieren, bzw. ist es hierfür eine Vereinfachung.
Blockierende Apis können damit natürlich nicht überrumpelt werden. |
| | | | |
| | Jörg Sellmeyer | Wenn ich den zweien Code als prf-Datei per Drag & Drop auf XPSE ziehe erhalte ich diesen Code: KompilierenMarkierenSeparieren
proc __xpse__endofprogram__
REM {{SOMEEXTRAENDCOMMAND}}
end
endproc
DECLARE __cf1&,__cf2&,__cf3&,__cf4&,__cf5&
Def __cf1(2) !"KERNEL32","GetProcAddress"
Def __cf2(1) !"KERNEL32","GetModuleHandleA"
__cf1&=__cf1(__cf2("user32.dll"),"SetClassLongA")
__cf2&=__cf1(__cf2("user32.dll"),"LoadCursorA")
__cf3&=__cf1(__cf2("user32.dll"),"SetTimer")
__cf4&=__cf1(__cf2("user32.dll"),"KillTimer")
__cf5&=__cf1(__cf2("user32.dll"),"GetSysColor")
WINDOWSTYLE 80 | 512 | 1024
WINDOW %MAXX,%MAXY - 0,0
SHOWWINDOW(%HWND,0)
WINDOWSTYLE 1 | 2 | 4 | 8 | 16 | 512
var HMYWND&=(CREATE("WINDOW",(),"Zuckertest 3.0",(100),(100),(200),(350)))
!!!!!
var HPIC&=CREATE("hNewPic",64,64,$FFFFAA)
var HDSK&=CREATE("text",HMYWND&,"",,,$FFFF,$FFFF)
!!!!!
var HSTATBAR&=CREATE("statusWindow",HMYWND&,"Bereit.")
USERMESSAGES $0010,$0014
MYWND.RESIZING()
call(__cf1&,HMYWND&,-12,call(__cf2&,,32512))
SUBCLASS HMYWND&,1
call(__cf3&,HMYWND&,55100,100,)
call(__cf3&,HMYWND&,55101,500,)
WHILE 1
WAITINPUT
SELECT %UMESSAGE
CASEOF $0010
SELECT %MWND
CASEOF HMYWND&
BREAK
ENDSELECT
ENDSELECT
ENDWHILE
call(__cf4&,HMYWND&,55100)
call(__cf4&,HMYWND&,55101)
__xpse__endofprogram__
proc SUBCLASSPROC
SELECT SWND
CASEOF HMYWND&
SELECT SMESSAGE
CASEOF 532,$0005
MYWND.RESIZING()
CASEOF $0113
SELECT SWPARAM
CASEOF 55100
DEMO(1)
CASEOF 55101
DEMO(2)
ENDSELECT
ENDSELECT
ENDSELECT
endproc
proc MYWND.RESIZING
SETWINDOWPOS HSTATBAR&=0,0 - 0,0
DEMO(1)
DEMO(2)
endproc
proc DEMO
PARAMETERS MODE&
SELECT MODE&
CASEOF 1
STARTPAINT HMYWND&
USEPEN 0,,RND($FFFFFF)
!!!!!
LINE 10,10 - 200,43
ENDPAINT
CASEOF 2
STARTPAINT HMYWND&
TEXTCOLOR RND($FFFFFF),call(__cf5&,15)
DRAWTEXT 10,10,&GETTICKCOUNT
ENDPAINT
ENDSELECT
endproc
__xpse__endofprogram__
|
| | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 31.08.2008 ▲ |
| |
| | | Ähä, der neuste XPSE (aber hierbei auch schon ein XPSE der deutlich älter sein kann) gibt aber folgenden Code KompilierenMarkierenSeparieren
proc __xpse__endofprogram__
PARAMETERS exitcode&
REM {{SOMEEXTRAENDCOMMAND}}
case %pcount=1 : end exitcode&
end
endproc
DECLARE __cf1&,__cf2&,__cf3&,__cf4&,__cf5&
Def __cf1(2) !"KERNEL32","GetProcAddress"
Def __cf2(1) !"KERNEL32","GetModuleHandleA"
__cf1&=__cf1(__cf2("user32.dll"),"SetClassLongA")
__cf2&=__cf1(__cf2("user32.dll"),"LoadCursorA")
__cf3&=__cf1(__cf2("user32.dll"),"SetTimer")
__cf4&=__cf1(__cf2("user32.dll"),"KillTimer")
__cf5&=__cf1(__cf2("user32.dll"),"GetSysColor")
WINDOWSTYLE 80 | 512 | 1024
WINDOW %MAXX,%MAXY - 0,0
SHOWWINDOW(%HWND,0)
WINDOWSTYLE 1 | 2 | 4 | 8 | 16 | 512
!!!!!
var HMYWND&=(CREATE("WINDOW",(0),"Zuckertest 3.0",(100),(100),(200),(350)))
var HPIC&=CREATE("hNewPic",64,64,$FFFFAA)
var HDSK&=CREATE("text",HMYWND&,"",0,0,$FFFF,$FFFF)
!!!!!
var HSTATBAR&=CREATE("statusWindow",HMYWND&,"Bereit.")
USERMESSAGES $0010,$0014
MYWND.RESIZING()
...
Im Moment tippe ich noch darauf das Du vlt. einen doch schon in die Monate gekommenen XPSE benutzt!?? |
| | | | |
|
Zum QuelltextThemenoptionen | 11.356 Betrachtungen |
ThemeninformationenDieses Thema hat 5 Teilnehmer: |